首页 > 解决方案 > 如何为 CD 的每个代码分支配置一个 docker 容器

问题描述

我们正在为 CI 使用 bitbucket 管道。

我想自动化 CD 流程,以便每当推送新/现有分支时说feature_abc(规范化)该分支的最新代码使用我的 ec2 盒子上的 Docker 容器部署并映射到与分支命名相同的子域名称,即feature_abc.mydomain.comQA 团队开始测试该分支即将发生的更改。

怎么做?

我是否必须在某处的自动化中使用织物,或者 docker-compose 可以做到这一点?

PS:我是经验丰富的 Python/Django 开发人员,但对 Docker 的东西很陌生。在网上阅读了很多 dockerfile 和 docker-compose.yml 的东西并且感到困惑。

标签: djangodockerbitbucketdevopscontinuous-deployment

解决方案


这绝对是可能的,尽管不能单独使用 Docker 工具。你大概需要:

  1. 让您的 CI 系统使用分支名称标记图像
  2. 让您的 CD 系统选择一个端口并在该端口上部署映像
  3. 设置网络负载平衡器,将服务的“正常”端口(例如,HTTP 的 80)重定向到您部署的特定端口
  4. 使用指向负载均衡器的分支名称部署Route 53 DNS 记录
  5. 当您注意到分支已经消失时,撤消这些步骤

自从您指定 EC2 以来,我已经引用了特定的 AWS 子产品,但相同的基本序列应该适用于任何环境(即使是在步骤 3 和 4 中使用 HAProxy 和 BIND 的本地环境)。(此外,关于这个序列,Docker 唯一真正特定的是打包系统和为特定容器实例指定主机端口的统一方式。)

您可能会考虑使用更高级别的工具来管理这些事情。 例如,Ansible具有“模块”来在远程主机上启动 Docker 容器创建 AWS NLB创建 Route 53 记录Terraform可以管理云资源(但保持其状态与定期自动重新部署一致可能很棘手)。

您还可以考虑更高级别的部署框架。例如,此部署顺序基本上就是您访问ECS上任何内容的方式。 Kubernetes仍然是一项更大的投资,但它的服务对象作为标准选项具有创建负载均衡器的能力,并且(通过附加组件)为您创建 DNS 记录;但同样,“推送映像并为其创建部署和服务”是在 Kubernetes 中部署任何东西的完全普通方式,非默认分支没有什么特别之处。


推荐阅读