コンテナの自動起動

Docker 1.2 から 再起動ポリシー が Docker の機能に組み込まれました。これはコンテナ終了時に再起動するための仕組みです。再起動ポリシーを設定しておけば、Docker デーモンの起動時、典型的なのはシステムの起動時に自動的にコンテナを開始します。リンクされたコンテナであっても、再起動ポリシーは適切な順番で起動します。

必要に応じて再起動ポリシーを使わないでください(例:Docker ではないプロセスが Docker コンテナに依存する場合)。そのような場合は、再起動ポリシーの代わりに upstartsystemdsupervisor といったプロセス・マネージャをお使いください。

プロセス・マネージャを使う場合

デフォルトの 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=local.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 ; /usr/bin/docker rm -f redis_server
...

参考

Automatically start containers
https://docs.docker.com/engine/admin/host_integration/