概要
DockerのコンテナはホストOSが再起動したりすると停止する。
初回起動時や再起動時に自動で指定のコンテナを起動する方法をいくつか試す。
docker の -r オプションを使う
これはなに?
リブート時にコンテナを再起動するように設定するオプション。
docker起動時に設定する。
-r, --restart=true Restart previously running containers
Dockerの設定ファイルを作成して配置する
AWSのCoreOSはデフォルトでDockerが起動するように設定されている
また、その設定ファイルを変更することはrootで合ってもできない
解決方法として、上書き用の設定ファイルを別の場所に作成することにより設定を変更できるようになる
デフォルトの設定ファイル
/usr/lib64/systemd/system/docker.service
(32bit版は/usr/lib/systemd/system/docker.serviceなんじゃないかな)
systemdについては後述
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
[Service]
Environment="TMPDIR=/var/tmp/"
ExecStartPre=/bin/mount --make-rprivate /
LimitNOFILE=1048576
LimitNPROC=1048576
# Run docker but don't have docker automatically restart
# containers. This is a job for systemd and unit files.
ExecStart=/usr/bin/docker -d -s=btrfs -r=false -H fd://
[Install]
WantedBy=multi-user.target
コピーして編集する
コピー先は
/etc/systemd/system/
sudo cp /usr/lib64/systemd/system/docker.service /etc/systemd/system/
sudo vi /etc/systemd/system/docker.service
変更する箇所
ExecStart=/usr/bin/docker -d -s=btrfs -r=false -H fd://
を
ExecStart=/usr/bin/docker -d -s=btrfs -r=true -H fd://
に編集する。
動作確認
CoreOSを再起動
再起動後、dockerのサービス状態を確認する
systemctl status docker -l
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; disabled)
Active: active (running) since Tue 2014-07-01 05:41:02 UTC; 3h 48min ago
Docs: http://docs.docker.io
Process: 563 ExecStartPre=/bin/mount --make-rprivate / (code=exited, status=0/SUCCESS)
Main PID: 564 (docker)
CGroup: /system.slice/docker.service
└─564 /usr/bin/docker -d -s=btrfs -r=true -H fd:// -D
.....
こんなかんじの出力があるので、一番下の行を見る。
/usr/bin/docker -d -s=btrfs -r=true -H fd:// -D
[-r=true]になっていることを確認する。
あとはコンテナを立てて再起動後、同じコンテナが立っていることを確認する。
実は非推奨
docker.serviceにも書いてあるとおり、このやり方は簡単だけども非推奨になっている。
そういったのの役目はsystemdとかcloud-config.ymlを使うのがよいらしい。
systemdを使う
systemdとはなにか?
- CoreOSではサービスの管理はこれを使用する(Docker再起動したりなど)
- 起動時の処理などを管理してくれるもの。
- chkconfig/serviceと大体同じ役割と思っておけばよさそう。
- Fedora系で採用されているようだ
ざくっとした設定の流れ
- 起動時にこんな処理しといてねというファイル作成
- 指定の場所に配置
- systemctlで使えるように登録
実際にやってみる
参考
CoreOSのsystemdの置き場所
/etc/systemd/system/
ファイルを作成して配置
内容は下記
[Unit]
Description=My Service
After=docker.service
Requires=docker.service
#After/Requiresはそのサービスが起動後に実行される
[Service]
ExecStart=/usr/bin/docker run busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
#ExecStartはサービス起動コマンドで任意のコマンドを指定できる
#systemctl start [ファイル名] でコマンドが実行されるようになる
#コンテナを再開させたい場合は、/usr/bin/docker start [コンテナID]とすればいい
#ここでは一秒ごとにHello Worldを出力するDockerのコンテナを立てている
[Install]
WantedBy=multi-user.target
#WantedByはランレベルにあたるもの。multi-user.targetとしとけばだいたいよさげ
#普通に起動した時、ExecStartのコマンドを実行してくれる
ファイルの登録と実行
ファイルを作成後、次のコマンドを実行する
#systemctl enable [ファイルのパス] で起動時に実行するように登録
sudo systemctl enable /etc/systemd/system/hello.service
#手動実行。もしくはCoreOSをリブートでもよい
sudo systemctl start hello.service
動作確認
ちゃんどコンテナが立っているか確認する
journalctl -f -u hello.service
これで一秒ごとにHello Worldが出力されていれば起動成功
後始末
このままだと起動するたびに新規コンテナが立つので、登録したファイルを削除しておく
sudo systemctl disable /etc/systemd/system/hello.service
systemctl enable/disableは
/etc/systemd/system/multi-user.target.wants/
ここにシンボリックリンクを張ったり消したりするだけのようだ
まとめ
- 長くなったのでcloud-config.ymlについてはまた今度
- -rはお手軽だけど非推奨
- systemdはいろんなことに使える