使用Docker Compose部署到ECS时遇到负载均衡器配置错误
Docker Compose部署ECS时负载均衡子网配置错误解决办法
问题描述
我尝试用Docker Compose将应用部署到Amazon ECS,使用的docker-compose.yml如下:
version: '3.8' x-aws-vpc: "vpc-0fef56fb4ec32ad70" services: osticket: container_name: osticket-web image: osticket/osticket environment: MYSQL_HOST: db MYSQL_PASSWORD: secret depends_on: - db ports: - 80:80 db: container_name: osticket-db image: mariadb restart: always environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: osticket MYSQL_USER: osticket MYSQL_PASSWORD: secret
我的VPC是私有VPC,包含6个子网(2个公有子网、4个私有子网),配有2个位于公有子网的NAT网关和1个互联网网关。在默认VPC下执行相同配置能正常运行,但用这个私有VPC执行docker compose up时出现错误:
A load balancer cannot be attached to multiple subnets in the same Availability Zone (Service: AmazonElasticLoadBalancing; Status Code: 400; Error Code: InvalidConfigurationRequest; Request ID: d2142a38-55c6-44ef-a405-e34d99d9fa07; Proxy: null)
解决办法
错误根源是Docker Compose默认会把VPC下所有子网都关联到负载均衡,但你的VPC里同一个可用区存在多个子网(比如公有+私有子网同属一个可用区),而AWS负载均衡要求每个可用区只能关联一个子网。
需要在docker-compose.yml里添加明确的子网配置,指定负载均衡和服务分别使用的子网:
修改后的配置示例
version: '3.8' x-aws-vpc: "vpc-0fef56fb4ec32ad70" # 给负载均衡指定每个可用区仅一个子网(选公有子网,保证对外访问) x-aws-loadbalancer: subnets: - subnet-xxxxxxx # 可用区A的公有子网ID - subnet-yyyyyyy # 可用区B的公有子网ID services: osticket: container_name: osticket-web image: osticket/osticket environment: MYSQL_HOST: db MYSQL_PASSWORD: secret depends_on: - db ports: - 80:80 networks: default: {} db: container_name: osticket-db image: mariadb restart: always environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: osticket MYSQL_USER: osticket MYSQL_PASSWORD: secret networks: default: {} # 定义服务部署的子网(选私有子网,避免直接暴露) networks: default: name: osticket-network x-aws-subnets: - subnet-aaaaaaa # 可用区A的私有子网ID - subnet-bbbbbbb # 可用区B的私有子网ID - subnet-ccccccc # 可用区C的私有子网ID(如果有)
关键注意点
x-aws-loadbalancer.subnets:必须保证每个可用区只填一个子网,优先选公有子网,确保负载均衡能对接互联网networks.default.x-aws-subnets:指定服务部署的私有子网,同样覆盖默认的全子网选择规则,避免把同区的多个子网都纳入- 确保负载均衡用的公有子网绑定了互联网网关路由,服务用的私有子网通过NAT网关配置了外网访问权限(用于拉取镜像)
内容的提问来源于stack exchange,提问作者JKC
相关产品推荐
相关产品推荐

