docker compose部署AWS ECS应用如何获取固定公网访问URL
解决方案
你不需要每次部署更新都手动修改DNS记录,也不需要将域名迁移至Route53。核心问题是默认docker compose的ECS集成逻辑会在每次全新部署时重建包括应用负载均衡(ALB)在内的全栈资源,才会导致访问域名每次变化。通过以下配置即可实现一次DNS配置、后续部署永久复用固定公网访问入口:
方案1:复用固定ALB(最稳定,推荐)
该方案100%避免负载均衡器被替换,仅需一次前置配置:
- 首次操作时登录AWS控制台,在你部署应用的对应区域手动创建1个Application Load Balancer:
- 配置80端口监听器,创建空的默认目标组即可
- 选择公网访问模式,创建完成后该ALB会分配一个永久不变的公网域名,不会随后续应用更新改变
- 修改你的
docker-compose.yml文件,添加顶层扩展字段指定复用该固定ALB,示例配置如下:
# 替换为你手动创建的固定ALB对应的ARN x-aws-loadbalancer: "arn:aws:elasticloadbalancing:us-east-2:你的账号ID:loadbalancer/app/你创建的ALB名称/ALB资源ID" services: flask: # 保留你原有的Flask服务配置,无需修改 build: ./flask nginx: # 保留你原有的Nginx服务配置,端口映射保持原有规则即可 build: ./nginx ports: - "80:80" depends_on: - flask
- 后续所有应用更新,正常执行
docker context use myecscontext和docker compose up即可,部署逻辑会自动将新版本Fargate任务挂载到这个固定ALB下,不会创建新的负载均衡器。 - 你仅需要在当前域名注册商的DNS管理后台,添加1条CNAME记录将
my-fancy-domain.com指向该固定ALB的公网域名即可,配置一次后永久生效,后续代码更新、重新部署都不需要再修改DNS记录。
方案2:固定Compose项目名(零AWS控制台操作)
如果你不想手动在AWS控制台提前创建ALB,可以通过固定Compose项目名的方式,避免部署时删除重建全栈资源:
- 后续执行部署命令时固定项目名称,不要使用随机生成的项目名:
docker compose --project-name my-fancy-app up
- 固定项目名后,
docker compose会对已有CloudFormation栈执行更新操作,而非删除旧栈重建新栈,只要你不修改端口映射、负载均衡相关的配置,原有ALB就会被保留,域名不会变化。 - 注意:该方案在你修改服务端口、调整负载均衡规则时仍可能触发ALB重建,稳定性不如方案1。
常见误区澄清
- Fargate任务不需要绑定弹性IP:公网流量通过固定ALB接入即可,ALB本身的高可用入口地址是永久固定的,不需要额外绑定弹性IP。
- 不需要将域名迁移至Route53:任何注册商管理的域名都支持配置CNAME记录指向AWS ALB的公网域名,解析生效逻辑和使用Route53没有区别。
- 部署更新不会影响访问:使用固定ALB后,应用新版本部署时ALB会自动完成流量切换,不会出现访问中断。
内容的提问来源于stack exchange,提问作者Timothy W. Hilton
相关产品推荐
相关产品推荐

