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

时间:2014-06-04 18:01:30

标签: deployment docker

这是我的情况:

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

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

  1. 作为我的dockerfile的一部分,我可以添加一个从Github中提取代码并构建它的步骤。因此,要重新部署,我需要一个登录3个服务器并重建并运行容器的脚本,从而在该过程中提取所有新代码。最重要的是我需要推送到服务器的是Dockerfile。
  2. 作为我的Dockerfile的一部分,我可以使用ADD命令将我的代码捆绑到容器中。然后我需要使用像Capistrano或Fabric之类的东西将我的整个项目部署到每个服务器,然后杀死旧容器,重建并运行。
  3. 我可以使用指定的机器(或我的开发环境)根据当前源代码构建新图像。然后将此图像推送到注册表。然后有一个脚本登录到我的服务器并拉下新图像,杀死旧容器并运行新容器。
  4. 数字1似乎是最容易的,但我在Dockers上阅读的大多数其他讨论都倾向于像3这样的情况,这对我来说似乎相当啰嗦。

    这里最好的选择是什么(或者不是这里),我是Docker的新手,所以我错过了什么?我问过一个知道Docker的人,他们的回答是“你没有想到Docker的方式”,那么Doc​​ker的方式是什么?

2 个答案:

答案 0 :(得分:5)

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

E.g。在一个稍微复杂的场景中,如果你使用选项1,这三个版本甚至可以选择不同的提交。

答案 1 :(得分:0)

选项2和3的组合可与Fabricio一起使用。这是Fabric的扩展,因此您项目的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'], ) 可能如下所示:

fab --list

使用上面的配置定义,您可以从项目根目录中键入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命令列表:

<button id="myToggleButton">CLICK ME</button>

还有一堆examples of how to use Fabricio,包括Docker swarm mode,可能对您的配置非常有用。