Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题
- 问题:scale参数端口冲突
- 解决方法:nginx实现多服务、负载均衡
- 修改docker-compose.yml配置
- 新增nginx本地配置文件
- 验证
- 启动容器
- 查看容器状态
- 访问web应用
问题:scale参数端口冲突
当使用如下docker-compose.yml配置,启动web为3个服务时,会出现端口冲突问题:
version: '3'
services:
web:
build: ../
ports:
- "5000:5000"
redis:
image: redis:3.0.7
启动命令:
docker-compose up --scale web=3
分析,ports: -“5000:5000”,主机5000端口映射到容器内的5000端口,如果多个启动容器,就会出现端口真占用冲突的问题
解决方法:nginx实现多服务、负载均衡
注意:原始项目构造请看Docker Compose的安装教程、使用教程示例的使用教程。
修改docker-compose.yml配置
如下:
version: '3'
services:
web:
build: ../
expose:
- "5000"
redis:
image: redis:3.0.7
ngixn:
image: nginx:latest
volumes:
- ../nginx_conf/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "4000:4000"
对比上面的2个docker-compose.yml,修改的地方在于:
- web服务去掉
ports
参数,改为expose
参数,解释:web容器内的5000端口不对主机开放,但是对关联的其他服务容器开放,其他容器可以访问web容器的5000端口 - 增加nginx配置
- valumes:挂载数据卷,将
../nginx_conf/nginx.conf
文件挂载到容器内的/etc/nginx/nginx.conf
文件,nginx容器将以../nginx_conf/nginx.conf
启动nginx - ports:主机4000端口映射到nginx容器内的4000端口
- valumes:挂载数据卷,将
新增nginx本地配置文件
在目录../nginx_conf/
下新增nginx.conf
文件,如下:
user nginx;
events {
worker_connections 1000;
}
http {
server {
listen 4000;
location / {
proxy_pass http://web:5000;
}
}
}
监听容器的4000端口,将请求转发到web服务的5000端口
验证
启动容器
docker-compose up --scale web=3
输出如下:
容器启动正常
查看容器状态
docker ps
如下
可以看到,3个web容器的5000端口如预期一样,没有开放给主机,主机4000端口映射到nginx容器内的4000端口。
访问web应用
访问虚机的4000端口,按照预期将会看到出现3个不同的容器名,如下
总结:Docker compose通过nginx实现了多服务、负载均衡场景,并不会出现端口冲突问题!