1. 动态端口分配
不指定主机端口,让Docker自动分配
docker run -d -p 80 nginx # 主机端口随机分配
docker run -d -p 80 nginx # 另一个容器也会分配不同端口
查看分配的端口
docker ps
2. 指定不同主机端口
手动指定不同的主机端口
docker run -d -p 8080:80 nginx
docker run -d -p 8081:80 nginx
docker run -d -p 8082:80 nginx
3. 使用Docker网络(推荐)
创建自定义网络
docker network create myapp-network
启动容器并连接到网络(不需要暴露端口)
docker run -d --network myapp-network --name web1 nginx
docker run -d --network myapp-network --name web2 nginx
docker run -d --network myapp-network --name web3 nginx
容器间可以通过容器名访问
从一个容器访问另一个:curl http://web1
4. 使用Docker Compose
docker-compose.yml
version: '3.8'
services:
web1:
image: nginx
networks:
- app-network
web2:image: nginxnetworks:- app-networkweb3:image: nginxnetworks:- app-network
networks:
app-network:
driver: bridge
启动所有服务
docker-compose up -d
只暴露需要外部访问的服务
5. 使用反向代理
启动多个后端服务(不暴露端口)
docker run -d --network myapp-network --name app1 node-app
docker run -d --network myapp-network --name app2 node-app
docker run -d --network myapp-network --name app3 node-app
启动反向代理(只暴露一个端口)
docker run -d -p 80:80
--network myapp-network
-v ./nginx.conf:/etc/nginx/nginx.conf
nginx
nginx.conf 配置示例
events { worker_connections 1024; }
http {
upstream app_cluster {
server app1:3000;
server app2:3000;
server app3:3000;
}
server {listen 80;location / {proxy_pass http://app_cluster;}}
}
6. 使用脚本自动化
#!/bin/bash
# start_multiple.sh
BASE_PORT=8080
CONTAINER_COUNT=5
for i in $(seq 1 $CONTAINER_COUNT); do
PORT=$((BASE_PORT + i - 1))
docker run -d
--name "app-$i"
-p "${PORT}:80"
nginx
echo "Started app-$i on port $PORT"
done
7. 使用Docker Swarm或Kubernetes
Docker Swarm 模式
docker swarm init
docker service create --name my-web --publish 80:80 nginx
docker service scale my-web=5 # 自动创建5个副本
最佳实践建议
- 开发环境: 使用Docker Compose + 自定义网络
- 生产环境: 使用Kubernetes或Docker Swarm
- 测试环境: 使用动态端口分配
- 微服务架构: 使用反向代理 + 服务发现
实用工具
查看端口占用情况
docker ps --format "table {{.Names}}\t{{.Ports}}"
查找可用端口
netstat -tuln | grep :808
选择哪种方法取决于你的具体需求:
- 如果容器间需要通信 → Docker网络
- 如果需要外部访问 → 端口映射或反向代理
- 如果是复杂应用 → Docker Compose
- 如果是生产环境 → Kubernetes/Docker Swarm