コンテナの自動起動¶
Docker 1.2 から 再起動ポリシー が Docker の機能に組み込まれました。これはコンテナ終了時に再起動するための仕組みです。再起動ポリシーを設定しておけば、Docker デーモンの起動時、典型的なのはシステムの起動時に自動的にコンテナを開始します。リンクされたコンテナであっても、再起動ポリシーは適切な順番で起動します。
必要に応じて再起動ポリシーを使わないでください(例:Docker ではないプロセスが Docker コンテナに依存する場合)。そのような場合は、再起動ポリシーの代わりに upstart 、 systemd 、 supervisor といったプロセス・マネージャをお使いください。
プロセス・マネージャを使う場合¶
デフォルトの Docker は再起動ポリシーを設定しません。しかし、多くのプロセス・マネージャと衝突を引き起こす可能性については知っておいてください。もしプロセス・マネージャを使うのであれば、再起動ポリシーを使わない方が良いでしょう。
イメージのセットアップが完了したら、コンテナを実行できるようになり満足でしょう。この実行をプロセス・マネージャに委ねられます。 docker start -a
を実行したら、Docker は自動的に実行中のコンテナにアタッチします。そして、実行後は必要に応じて全てのシグナルを転送しますので、コンテナの停止をプロセス・マネージャが検出したら、適切に再起動するでしょう。
以下では systemd と upstart を Docker と連携する例を紹介します。
例¶
この例では2つの有名なプロセス・マネージャ、upstart と systemd 向けの設定ファイルを扱います。これらの例では、既に作成しているコンテナ --name=redis_server
を使って Redis を起動するのを想定しています。これらのファイルは新しいサービスを定義し、docker サービスが起動した後で自動的に起動するものです。
upstart¶
description "Redis container"
author "Me"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
/usr/bin/docker start -a redis_server
end script
systemd¶
[Unit]
Description=Redis container
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a redis_server
ExecStop=/usr/bin/docker stop -t 2 redis_server
[Install]
WantedBy=default.target
redis コンテナに( --env
のような)オプションを渡したい場合は、 docker run
に代わって docker start
を使う必要があります。次の例は、起動したコンテナのサービスが停止、または、サービス停止によってコンテナが削除されたとしても、新しいコンテナを毎回作成します。
[Service]
...
ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
ExecStop=/usr/bin/docker stop -t 2 redis_server
ExecStopPost=/usr/bin/docker rm -f redis_server
...
参考
- Automatically start containers
- https://docs.docker.com/engine/admin/host_integration/