我一直在研究围绕 Docker 的大量实践,并且已经取得了很大进展。 但有一件事一直让我困惑,那就是使用纯数据容器。
以下是我当前设置的简要概述:
# nginx
web:
extends:
file: _common.yml
service: web
ports:
- "80:80"
environment:
APPLICATION_ENV: prod
volumes_from:
- data
links:
- db
- redis
# php5-cli
app:
extends:
file: _common.yml
service: app
environment:
APPLICATION_ENV: prod
volumes_from:
- data
links:
- db
- redis
data:
image: <censored-url>
volumes:
- "/var/lib/mysql"
- "/app"
# percona
db:
extends:
file: _common.yml
service: db
volumes_from:
- data
# redis
redis:
extends:
file: _common.yml
service: redis
<censored-url>
您看到的是使用此 Dockerfile 构建的镜像:
FROM busybox
COPY . /app
现在这个设置可以工作,但我只是不知道如何处理新版本。 我的源代码在 git 中,当我想部署到生产时,我想我创建一个新镜像(FROM busybox 可能应该替换为我现有的镜像 url)并在我的生产服务器上拉入新镜像。
但是我如何获取要更新的 Web 容器等数据?我还必须确保我的持久数据(/var/lib/mysql)仍然存在。
我希望问题很清楚,我很乐意在必要时进行澄清。
最佳答案
Now this setup works but I just can't figure out how to handle a new release. My source is in git, when I want to deploy to production I imagine I create a new image (FROM busybox should probably be replaced with my existing image url) and pull in the new image on my production server.
除了关于 busybox 的声明(我不遵循)之外,这似乎非常正确。通常,您重新构建镜像,推送到注册表,然后从生产服务器中拉取。正如 @Mario Marin 所建议的,明智地对待标签是值得的,这样您就可以在需要时轻松回滚,并且可以准确地知道部署了哪个版本的应用程序。
But how do I get the data to update for my web container and such? I also have to make sure my persistent data (/var/lib/mysql) remains.
我认为这是指您的数据容器,您以一种不寻常的方式完成了该操作。首先,我将拉出 mysql 目录并将其放入其自己的数据容器中。我将为此使用 percona 图像,以便正确设置所有权限。当您创建数据容器时,您不会让它运行,因此无需担心容器会过时;它实际上只是目录的命名空间。
下一步是处理应用程序目录,我认为它不是数据,而是代码?在这种情况下,我会将其包含在您的网络图像中(根本不使用卷)。在 Dockerfile 中,我通常会执行 git 克隆以保持镜像最新。在开发过程中,您可以使用主机中的代码在应用程序目录的顶部安装一个卷,以便您可以立即进行更改。
有关数据容器的更多信息,请查看 http://container42.com/2014/11/18/data-only-container-madness/
关于Docker 仅数据容器并处理新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462058/