问题: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端口

新增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实现了多服务、负载均衡场景,并不会出现端口冲突问题!

GitHub 加速计划 / compose / compose
53
5
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:5 个月前 )
25cfa66a Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> 4 天前
f160333e Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> 5 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐