Dockerコンテナを作成したものの、Dockerホストが何らかの理由でダウンしたり、リブートがかかったりした場合、Dockerホスト上で稼働していたコンテナも同時にダウンしてしまいます。
これらをsystemd
経由で操作し、Dockerホスト起動時(今回はCentOSを例に記述します)に自動でコンテナもstartするようにする例を記載します。
DockerコンテナのUnit設定ファイルを作成
CentOSの場合、既存の起動スクリプトは、/usr/lib/systemd/system/
に配置されています。
$ ll /usr/lib/systemd/system | head
合計 772
-rw-r--r--. 1 root root 403 1月 14 2015 -.slice
-rw-r--r--. 1 root root 225 12月 8 2014 NetworkManager-dispatcher.service
-rw-r--r--. 1 root root 281 12月 8 2014 NetworkManager-wait-online.service
-rw-r--r--. 1 root root 400 12月 8 2014 NetworkManager.service
-rw-r-----. 1 root root 602 6月 10 2014 auditd.service
lrwxrwxrwx. 1 root root 14 2月 5 2015 autovt@.service -> getty@.service
-rw-r--r-- 1 root root 1044 3月 6 07:03 avahi-daemon.service
-rw-r--r-- 1 root root 874 3月 6 07:03 avahi-daemon.socket
-rw-r--r--. 1 root root 546 1月 14 2015 basic.target
このままこのディレクトリに作成してもよいのですが、今回は/etc/systemd/system/
に起動スクリプトを作成します。
$ cd /etc/systemd/system
$ vim [コンテナ名].service
[コンテナ名]の部分は何でもよいのですが、第三者にもわかりやすいようにコンテナ名で作成します。
$ cat [コンテナ名].service
[Unit]
Description=[コンテナ名]
After=[コンテナ名].service
Requires=[コンテナ名].service
[Service]
ExecStart=/usr/bin/docker start [コンテナ名]
[Install]
WantedBy=multi-user.target
上記形式の設定ファイルを作成します。
[Service]セクションにある起動コマンドが起動コマンドとして認識されます。
上記の例では、docker start
コマンドでコンテナを起動しています
Dockerホスト起動時に自動起動するようにする
前項で作成した設定ファイルをsystemd
に認識させ、CentOS起動時に自動実行するようにします。
// 状態確認(not-foundである事を確認)
$ sudo systemctl status [コンテナ名].service
[コンテナ名].service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
8月 07 16:16:05 docker-host.llxc systemd[1]: Cannot add dependency job for unit [コンテナ名].service, ignoring: Unit [コンテナ名].service failed to load: No such file or directory.
// 有効にする
$ sudo systemctl enable [コンテナ名].service
// 有効になっているか確認(enabledになっている事を確認)
$ sudo systemctl status [コンテナ名].service
[コンテナ名].service - [コンテナ名]
Loaded: loaded (/etc/systemd/system/[コンテナ名].service; enabled)
Active: inactive (dead)
8月 07 16:16:05 docker-host.llxc systemd[1]: Cannot add dependency job for unit [コンテナ名].service, ignoring: Unit [コンテナ名].service failed to load: No such file or directory.
登録してすぐの状態では、Cannot add dependency job
エラーが表示されますが、今の状態でこれが表示されている状態は問題ありません。
問題なく起動出来るか実行してみます。
// 動いているコンテナを一旦止める
$ sudo docker stop [コンテナ名]
// systemdから起動してみる
$ sudo systemctl start [コンテナ名].service
// 状態確認
$ sudo systemctl status [コンテナ名].service
[コンテナ名].service - [コンテナ名]
Loaded: loaded (/etc/systemd/system/[コンテナ名].service; enabled)
Active: inactive (dead) since 月 2015-08-10 13:23:13 JST; 35min ago
Process: 2304 ExecStart=/usr/bin/docker start [コンテナ名] (code=exited, status=0/SUCCESS)
Main PID: 2304 (code=exited, status=0/SUCCESS)
8月 10 13:23:12 docker-host.llxc systemd[1]: Starting [コンテナ名]...
8月 10 13:23:12 docker-host.llxc systemd[1]: Started [コンテナ名].
8月 10 13:23:13 docker-host.llxc docker[2304]: [コンテナ名]
状態確認で、上記のようになっていれば完了です。
(Loaded
に、先ほど作成した設定ファイルが確認出来ます)