作为 Docker 容器启动和停止服务

作为 Docker 容器启动和停止服务

我喜欢将某些服务器服务(例如 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 startfig 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 之外解决其中一些问题。

相关内容