docker swarm 的持续集成工作流

Continuous Integration workflow with docker swarm

这是我的设置,此输出取自 docker-machine ls。使用 docker 机器配置 swarm。

NAME             ACTIVE      DRIVER         STATE     URL                          SWARM                     DOCKER    ERRORS
cluster-master   * (swarm)   digitalocean   Running   tcp://REDACTED:2376   cluster-master (master)   v1.11.1   
kv-store         -           digitalocean   Running   tcp://REDACTED:2376                              v1.11.1   
node-1           -           digitalocean   Running   tcp://REDACTED:2376   cluster-master            v1.11.1   
node-2           -           digitalocean   Running   tcp://REDACTED:2376   cluster-master            v1.11.1   

现在我正在寻找一种方法来设置我的 CI/CD 工作流程。这是我的初步想法:

  1. 在 docker 集线器 (bitbucket) 上创建自动构建
  2. 推送更改后,触发在 docker hub
  3. 上构建
  4. 测试将在 docker 集线器(npm 测试)
  5. 上完成
  6. 构建成功后在 docker 集线器上创建一个 webhook。
  7. webhook 将指向我自己的应用程序,然后将更改推送到 swarm

问题:

流程的第一部分看起来一切正常。复杂的地方是管理已部署的生产容器。

Is it okay to run your testing on docker hub or should I rely on another service?

是的,假设您不需要进一步的集成测试,运行 在 docker 集线器上进行测试应该没问题。

我需要将我的容器与亚马逊服务集成,并且有一个相当不标准的部署,所以这部分测试必须在亚马逊实例上完成。

My main problem is pushing the changes to the docker swarm. Should I setup my docker-swarm on a remote machine and host the application there?

如果您只使用一台机器,则不需要使用 swarm 的额外开销。如果您计划扩展到更大的多节点部署,可以部署到远程机器,因为您会更快地发现使用 swarm 的陷阱。

您需要考虑如何淘汰旧版本并将最新版本的容器引入 swarm,这通常称为调度。

可以使用的一种简单方法是:

  1. 从旧 运行ning 容器中删除流量
  2. 停止旧的 运行ning 容器
  3. 拉取最新的容器
  4. 启动最新容器 冲洗并重复所有 运行ning 容器。

这是在 docker swarm 中通过声明服务来完成的。然后更新可以作为任务观看的图像。有关此过程的详细信息,请参阅 Apply rolling update to swarm and for how to do this in Amazon updating docker containers in ecs