题
这是我的情况:
- 我有一个用Go写的项目存储在Github上
- 我在负载均衡器后面有3个应用服务器(app1,app2,app3)
- 我有一个Dockerfile作为git中项目的一部分,当用于构建图像时,它知道如何安装我的所有应用程序依赖项(包括Go)并为我的应用程序获取工作环境
- 我有容器运行在所有3个应用服务器上,一切都工作得很好
现在我想更改一些代码并将我的更改重新部署到这3台服务器。我可以想到3种可能的方法来促进这个自动化:
- 作为我的dockerfile的一部分,我可以添加一个从Github提取代码并构建它的步骤。因此,要重新部署,我需要一个脚本登录到3台服务器并重建并运行容器,从而在此过程中提取所有新代码。最多我需要推送到服务器的是Dockerfile。
- 作为我的Dockerfile的一部分,我可以有一个ADD命令将我的代码捆绑到容器中。然后,我需要使用Capistrano或Fabric之类的东西将我的整个项目部署到每台服务器,然后杀死旧容器,重建并运行。
- 我可以使用指定的机器(或我的开发环境)基于当前源代码构建新映像。然后将此映像推送到注册表。然后有一个脚本登录到我的服务器并将新映像拉下来,杀死旧容器并运行新容器。
1号似乎是我读过的关于码头工人的最简单但大多数其他讨论倾向于像3这样的情况,这对我来说似乎相当啰嗦。
这里(或不在这里)的最佳选择是什么,我是Docker的新手,所以我错过了什么?我问了一个了解码头工人的人,他们的回答是"你没有用码头工人的方式思考",那么码头工人的方式是什么?
解决方案
我认为选项3的想法是您只能构建一次图像,这意味着所有服务器都会运行相同的图像。另外两个可以产生不同的图像。
e.g。在稍微介绍的情况下,如果您使用选项1,这三个构建甚至可以选择不同的提交。
其他提示
选项2和3的组合可以与 法布里西奥.这是一个延伸到 织物;织物, ,因此 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'],
)
使用上面的配置定义,您可以键入 fab --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模式 这可能对您的配置非常有用。
不隶属于 StackOverflow