为Amazon ECS配置Docker Compose端口时遇映射错误求助
解决Docker Compose部署AWS ECS时的端口映射错误
问题原因
你遇到的published port can't be set to a distinct value than container port错误,是因为AWS ECS在默认的bridge网络模式下,限制了端口映射规则:发布的主机端口必须和容器内部的监听端口保持一致,不能用主机端口:容器端口这种不一致的映射写法。
解决办法
方案1:用awsvpc网络模式+负载均衡路由
改用awsvpc网络模式(ECS推荐的网络模式),让ECS自动分配主机端口,再通过同一个负载均衡器的不同路由规则区分两个服务。修改后的docker-compose.yml如下:
version: "3.8" services: www: image: my_image_path:latest ports: - "80" # 只指定容器端口,ECS自动分配主机端口 volumes: - ./www:/var/www/html/ depends_on: - db network_mode: awsvpc x-aws-loadbalancer: "my-app-alb" # 绑定到同一个负载均衡器 x-aws-healthcheck: path: / interval: 30 phpmyadmin: image: phpmyadmin/phpmyadmin:4.8 ports: - "80" environment: MYSQL_USER: user MYSQL_PASSWORD: test MYSQL_ROOT_PASSWORD: test depends_on: - db network_mode: awsvpc x-aws-loadbalancer: "my-app-alb" x-aws-healthcheck: path: / interval: 30 # 补充缺失的数据库服务配置 db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: test MYSQL_USER: user MYSQL_PASSWORD: test volumes: - db_data:/var/lib/mysql network_mode: awsvpc volumes: db_data:
部署完成后,在AWS控制台给负载均衡器my-app-alb添加两个监听规则:
- 把路径
/的请求转发到www服务 - 把路径
/phpmyadmin的请求转发到phpmyadmin服务
方案2:为每个服务配置独立负载均衡器
如果需要通过不同的域名访问两个服务,可以给每个服务绑定独立的负载均衡器,同时保持主机端口和容器端口一致:
version: "3.8" services: www: image: my_image_path:latest ports: - "80:80" # 主机端口与容器端口一致 volumes: - ./www:/var/www/html/ depends_on: - db x-aws-loadbalancer: "www-web-alb" # 独立负载均衡器 phpmyadmin: image: phpmyadmin/phpmyadmin:4.8 ports: - "80:80" environment: MYSQL_USER: user MYSQL_PASSWORD: test MYSQL_ROOT_PASSWORD: test depends_on: - db x-aws-loadbalancer: "pma-web-alb" # 独立负载均衡器 # 补充数据库服务配置 db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: test MYSQL_USER: user MYSQL_PASSWORD: test volumes: - db_data:/var/lib/mysql volumes: db_data:
这样两个服务会分别对应各自的ALB,通过ALB的域名就能访问对应的服务。
额外提醒
- 记得把
my_image_path:latest替换成你实际的镜像地址 - 原配置里只引用了
db服务但没定义,必须补充完整的数据库服务配置才能正常运行 - 部署前要先配置好ECS上下文:
docker context create ecs my-ecs-context,然后切换上下文:docker context use my-ecs-context
内容的提问来源于stack exchange,提问作者Juan Enrich
相关产品推荐
相关产品推荐

