如何为每个代码分支为CD配置一个Docker容器

时间:2018-11-04 07:50:58

标签: django docker bitbucket devops continuous-deployment

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

我想自动化CD流,以便每当有新的/现有分支推送时,说feature_abc(规范化),使用我的ec2盒上的Docker容器部署该分支的最新代码并映射到与分支机构名称相同的子域,即feature_abc.mydomain.com,供质量检查小组开始测试该分支机构即将进行的更改。

如何做到?

我是否必须在自动化的某个地方使用Fabric,或者docker-compose可以做到这一点?

P.S .:我是经验丰富的Python / Django开发人员,但不熟悉Docker。在网络上阅读了很多dockerfile和docker-compose.yml内容并感到困惑。

1 个答案:

答案 0 :(得分:0)

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

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

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

您可能会考虑使用高级工具来管理这些事情。例如,Ansible具有start Docker containers on remote hostscreate AWS NLBscreate Route 53 records的“模块”。 Terraform可以管理云资源(但要使其状态与常规的自动重新部署保持一致可能很棘手)。

您还可以考虑使用更高级别的部署框架。例如,此部署顺序基本上就是您访问ECS上的任何内容的方式。 Kubernetes仍然是一笔较大的投资,但作为标准选项,其Service对象具有create load balancers和(带有附加项)create the DNS record for you的功能;但是同样,“推送映像并为其创建部署和服务”是在Kubernetes中部署任何内容的完全普通的方法,对于非默认分支没有特别之处。