如何使用docker自动化多服务器部署

这是我的情况:

  • 我有一个用Go编写的项目存储在Github上
  • 我在负载平衡器(app1,app2,app3)后面有3个应用程序服务器,
  • 我有一个Dockerfile作为git项目的一部分,当用于构build图像时,知道如何安装我所有的应用程序依赖项(包括Go)并为我的应用程序获取工作环境
  • 我有所有3个应用程序服务器上运行的容器,一切都在奇妙的工作

现在我想更改一些代码并将这些更改重新部署到这3台服务器上。 我可以想到3种可能的方式来促进这种自动化:

  1. 作为我的docker文件的一部分,我可以添加一个步骤,从Github中抽取我的代码并构build它。 因此,为了重新部署,我需要一个脚本,login到3台服务器,并重build和运行容器,从而拉动过程中的所有新代码。 至多我需要推送到服务器是Dockerfile。
  2. 作为我的Dockerfile的一部分,我可以有一个ADD命令将我的代码捆绑到容器中。 然后我需要使用Capistrano或Fabric之类的东西将我的整个项目部署到每个服务器,然后杀掉旧的容器,重build并运行。
  3. 我可以使用指定的机器(或我的开发环境)来构build基于当前源代码的新图像。 然后将这个图像推送到registry。 然后有一个脚本,login到我的服务器,拉下新的图像,杀死旧的容器,并运行新的。

数字1似乎是我阅读过的最简单但其他最多的讨论Dockers倾向于像3这样对我来说似乎相当冗长的情况。

什么是最好的select(或不在这里),我是新来的Docker所以我错过了什么? 我问了一个对Docker有所了解的人,他们的回应是“你没有用Docker的方式来思考”,那么Doc​​ker的方式是什么?

我认为选项3的想法是,你只build立一次图像,这意味着所有的服务器将运行相同的图像。 另外两个可能会产生不同的图像。

例如,在一个稍微更复杂的情况下,如果使用选项1,那么这三个版本甚至可以select不同的提交。

选项2和3的组合可以与Fabricio一起使用。 这是Fabric的扩展,因此您项目的fabfile.py可能如下所示:

 from fabricio import docker, tasks app = tasks.ImageBuildDockerTasks( service=docker.Container( name='app', image='registry/project/image:tag', options={'publish': '8000:8000'}, ), hosts=['user@host1', 'user@host2', 'user@host3'], ) 

使用上面的configuration定义,您可以从项目根目录inputfab --list ,并查看可用的Fabricio命令列表:

 Available commands: app prepare -> push -> backup -> pull -> migrate -> update app.deploy prepare -> push -> backup -> pull -> migrate -> update app.prepare prepare Docker image app.pull pull Docker image from registry app.push push Docker image to registry app.rollback rollback Docker service to a previous version app.update update service to a new version 

还有一堆如何使用Fabricio的例子 ,包括Docker swarm模式 ,这可能对你的configuration非常有用。