我喜欢将某些服务器服务(例如 MySQL)隔离到容器中并仅将它们提供给需要它们的服务(例如,SqlUsingApp)的想法。
如果我理解正确的话,通常的方法是有一个 SqlUsingApp 和一个 MySQL 容器,通过运行 SqlUsingApp 来链接
docker run --link MySqlContainer:mysql SqlUsingApp
但是,如果需要重新启动 MySQL,启动 MySQLContainer 会断开链接并使 SqlUsinApp 失效。这不是通常的服务的工作方式,通常的服务通过端口链接,如果其中一个服务重新启动,端口可以随时重新连接。因此,具有非 docker 服务的通常服务器可以随时重新启动其中任何一个,而无需重新启动其他服务。
针对此问题的 docker 风格解决方案是什么?
答案1
我确实使用fig
(现已“重命名”为docker-compose
)来解决此类问题。可以表示“部署”中涉及的各个 docker 容器(我现在将这样称呼它,请任何人:如果您知道更好的术语,请发表评论。请耐心等待,我是德国人)。这是在名为fig.ylm
(如果您已迁移到 docker-compose)的文件中以 YAML 符号完成的。然后,您可以通过诸如、docker-compose.yml
之类的命令启动、停止等所描述的容器集。fig start
fig stop
让一切运行起来最方便的命令是fig up
(构建所有包含并启动它们所有,就像一个带有组合控制台输出的单个应用程序一样)。
要在脚本中以类似守护进程的方式执行此操作,请使用 -d 参数:fig up -d
像单个守护进程一样运行整个过程。
Fig 文档链接:http://www.fig.sh
对于 docker-compose 也一样:https://docs.docker.com/compose/
现在我将向您发布一个由 Gitlab、Postgres 和 Redis 服务组成的 Gitlab“部署”的完整示例。它在 Ubuntu 主机上运行,并由 upstart 脚本在系统启动时自动启动:
fig.yml
(在主机/root/docker_gitlab/
上):
postgresql:
image: sameersbn/postgresql:9.1-1
environment:
- DB_USER=gitlab
- DB_PASS=secretpassword
- DB_NAME=gitlabhq_production
gitlab:
image: sameersbn/gitlab:latest
links:
- redis:redisio
- postgresql:postgresql
ports:
- "10080:80"
- "10022:22"
volumes:
- /opt/gitlab/data:/home/git/data
environment:
- SMTP_HOST=smtp.germanprovider.de
- [email protected]
- SMTP_PASS=verysecret
- GITLAB_HOST=projectserver
- GITLAB_PORT=10080
- GITLAB_SSH_PORT=10022
redis:
image: sameersbn/redis:latest
upstart 脚本gitlab.conf
(在/etc/init/
主机上):
description "gitlab service runner"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
chdir /root/docker_gitlab
script
# Wait for docker to finish starting up first.
FILE=/var/run/docker.sock
while [ ! -e $FILE ] ; do
inotifywait -t 2 -e create $(dirname $FILE)
done
/usr/local/bin/fig start
end script
Fig 似乎太“docker 风格”了,docker 团队将其合并为 docker-compose。所以在这方面一切都应该没问题...
答案2
对于监听它们的守护进程,您可以向 docker 容器发送信号,docker 容器会将它们传递给使用 CMD 或 ENTRYPOINT 启动的东西。IIRC,mysql 在发送 HUP 信号时将重新启动。
不幸的是,这不是一个通用的解决方案。第三方应用程序(如 geard)试图在 docker 之外解决其中一些问题。