django - 如何为 CD 的每个代码分支配置一个 docker 容器
问题描述
我们正在为 CI 使用 bitbucket 管道。
我想自动化 CD 流程,以便每当推送新/现有分支时说feature_abc
(规范化)该分支的最新代码使用我的 ec2 盒子上的 Docker 容器部署并映射到与分支命名相同的子域名称,即feature_abc.mydomain.com
QA 团队开始测试该分支即将发生的更改。
怎么做?
我是否必须在某处的自动化中使用织物,或者 docker-compose 可以做到这一点?
PS:我是经验丰富的 Python/Django 开发人员,但对 Docker 的东西很陌生。在网上阅读了很多 dockerfile 和 docker-compose.yml 的东西并且感到困惑。
解决方案
这绝对是可能的,尽管不能单独使用 Docker 工具。你大概需要:
- 让您的 CI 系统使用分支名称标记图像
- 让您的 CD 系统选择一个端口并在该端口上部署映像
- 设置网络负载平衡器,将服务的“正常”端口(例如,HTTP 的 80)重定向到您部署的特定端口
- 使用指向负载均衡器的分支名称部署Route 53 DNS 记录
- 当您注意到分支已经消失时,撤消这些步骤
自从您指定 EC2 以来,我已经引用了特定的 AWS 子产品,但相同的基本序列应该适用于任何环境(即使是在步骤 3 和 4 中使用 HAProxy 和 BIND 的本地环境)。(此外,关于这个序列,Docker 唯一真正特定的是打包系统和为特定容器实例指定主机端口的统一方式。)
您可能会考虑使用更高级别的工具来管理这些事情。 例如,Ansible具有“模块”来在远程主机上启动 Docker 容器、创建 AWS NLB和创建 Route 53 记录。 Terraform可以管理云资源(但保持其状态与定期自动重新部署一致可能很棘手)。
您还可以考虑更高级别的部署框架。例如,此部署顺序基本上就是您访问ECS上任何内容的方式。 Kubernetes仍然是一项更大的投资,但它的服务对象作为标准选项具有创建负载均衡器的能力,并且(通过附加组件)为您创建 DNS 记录;但同样,“推送映像并为其创建部署和服务”是在 Kubernetes 中部署任何东西的完全普通方式,非默认分支没有什么特别之处。
推荐阅读
- java - 为什么这个方法不同步?
- python - 如何检查一个字符串的所有字符是否按顺序出现在另一个字符串中?
- mysql - SQL条件日期
- php - 获取列数据,例如我用 foreach 列出的数据
- flutter - 同一列中的两个 ListViews - 垂直视口被赋予了无限的高度
- facebook - 在应用安装时获取带有时间戳的广告系列 ID
- c# - 如何使用 itext pdfXfa 用俄语文本展平 xfa pdf 文件
- html - 调整浏览器窗口大小时不换行的 div 宽度调整
- c++ - 国际象棋骑士到达棋盘上某个位置的最小步数
- javascript - 在 ES6 中,导出 let m = 1;和 m = 1; 出口米;为什么前者是真的,后者是假的?