在 AWS ECS 上使用 docker-compose 进行持续部署的最佳实践
Posted
技术标签:
【中文标题】在 AWS ECS 上使用 docker-compose 进行持续部署的最佳实践【英文标题】:Best practics working docker-compose on AWS ECS for Continuos Deploy 【发布时间】:2020-02-06 21:28:13 【问题描述】:我是 ECS 新手,我对如何使用具有多种服务的 docker-compose
文件在 AWS ECS Fargate 中自动部署感到有些困惑。
我能够通过以下步骤执行从 git push 到部署单个容器的端到端:
-
创建 AWS ECR
标记泊坞窗图像
创建 CodeCommit
创建 CodeBuild
创建 CodeDeploy
使用任务描述创建集群
创建管道以加入之前的所有内容并自动化直到结束。
完成
但是当您拥有多项服务时会发生什么?
-
是否必须修改
docker-compose
文件才能与ECS 兼容?如果是这样,如果整个项目都在一个文件夹中(pydanny cookiecutter 结构),我该如何分离存储库?
我是否必须为我的docker-compose
的每个服务创建一个 ECR 存储库?
自动化每个 ECR 的标签和推送以及各自的部署以实现完整的端到端流程的步骤是什么?
如何修改 docker-compose
的卷以在 ECS 上工作?
我使用pydanny cookiecutter 生成的以下 docker-compose 文件,它有 7 个服务:
Django
+ Postgres
+ Redis
+ Celery
+ Celeryworker
+ Celerybeat
+ Flower
docker-compose.yml
version: '3'
volumes:
local_postgres_data:
local_postgres_data_backups:
services:
django: &django
build:
context: .
dockerfile: ./compose/local/django/Dockerfile
image: test_cd_django
depends_on:
- postgres
volumes:
- .:/app
env_file:
- ./.envs/.local/.django
- ./.envs/.local/.postgres
ports:
- "8000:8000"
command: /start
postgres:
build:
context: .
dockerfile: ./compose/production/postgres/Dockerfile
image: test_cd_postgres
volumes:
- local_postgres_data:/var/lib/postgresql/data
- local_postgres_data_backups:/backups
env_file:
- ./.envs/.local/.postgres
redis:
image: redis:3.2
celeryworker:
<<: *django
image: test_cd_celeryworker
depends_on:
- redis
- postgres
ports: []
command: /start-celeryworker
celerybeat:
<<: *django
image: test_cd_celerybeat
depends_on:
- redis
- postgres
ports: []
command: /start-celerybeat
flower:
<<: *django
image: test_cd_flower
ports:
- "5555:5555"
command: /start-flower
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:这取决于您是否要使用 docker-compose 来执行所有操作。如果你想使用 docker-compose 构建、推送和拉取,你需要让 docker-compose.yml 中的 image
块与 ECR 地址匹配。
例如
image: $ID.dkr.ecr.$region.amazonaws.com/$image_name:$image_tag:-latest
我是否必须为我的 docker-compose 的每个服务创建一个 ECR 存储库?
您不必为每个服务创建一个 ECR 存储库,而是为您构建的每个映像创建一个 ECR 存储库。在您的情况下,您不必为redis
创建一个存储库,但您必须为 django 和 postgres 执行此操作,因为您使用 Dockerfile 构建它们。 celeryworker 和 celerybeat 使用 django 映像启动,因此您无需为它们创建额外的存储库。
自动化每个 ECR 的标签和推送以及各自的部署以实现完整的端到端流程的步骤是什么?
在这里我只能提供一些建议,这完全取决于您的设置。我倾向于尽可能地保持与云服务无关。
您可以在docker-compose.yml
中定义如下图像:
services:
postgres:
image: $ID.dkr.ecr.$region.amazonaws.com/my_postgres:$image_tag:-latest
django:
image: <theID>.dkr.ecr.<theRegion>.amazonaws.com/my_django:$image_tag:-latest
然后在构建过程中即时准备一个.env
文件,其中包含您需要的信息。例如
image_tag=1.2.0
如何修改 docker-compose 的卷以在 ECS 上工作?
很遗憾,我无法回答这个问题,但我找到了以下答案: https://devops.stackexchange.com/questions/6228/using-volumes-on-aws-fargate
【讨论】:
非常感谢 Stefano。你的评论很有帮助。我设法按照您告诉我的方式创建了一个独立的存储库。现在我正在努力提升我的服务。当我完成所有进度时,我将发布完整的解决方案。再次感谢 您管理过这个 Wezen42 吗?我也很好奇ECS上的docker compose以上是关于在 AWS ECS 上使用 docker-compose 进行持续部署的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ECS(容器存储)上验证 AWS EBS(Beanstalk)? AccessDeniedException
通过 Github 操作在 AWS ECS 上使用 Docker Compose 进行部署
使用 Jenkins 或 Job Scheduler 在 AWS ECS 上自动部署 Docker 容器
AWS CDK 并在现有 ALB 上创建 ECS/Fargate 服务。使用现有的监听器?