コンテナの自動起動

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

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

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

デフォルトの Docker は再起動ポリシーを設定しません。しかし、多くのプロセス・マネージャと衝突を引き起こす可能性については知っておいてください。もしプロセス・マネージャを使うのであれば、再起動ポリシーを使わない方が良いでしょう。

イメージのセットアップが完了したら、コンテナを実行できるようになり満足でしょう。この実行をプロセス・マネージャに委ねられます。 dockerstart-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 containerRequires=docker.serviceAfter=docker.service[Service]Restart=alwaysExecStart=/usr/bin/docker start -a redis_serverExecStop=/usr/bin/docker stop -t 2 redis_server[Install]WantedBy=default.target

redis コンテナに( --env のような)オプションを渡したい場合は、 dockerrun に代わって dockerstart を使う必要があります。次の例は、起動したコンテナのサービスが停止、または、サービス停止によってコンテナが削除されたとしても、新しいコンテナを毎回作成します。

[Service]...ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redisExecStop=/usr/bin/docker stop -t 2 redis_serverExecStopPost=/usr/bin/docker rm -f redis_server
...

参考

Automatically start containers

https://docs.docker.com/engine/admin/host_integration/