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に、先ほど作成した設定ファイルが確認出来ます)