78
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS+CoreOS+Dockerでコンテナの自動起動 1

Posted at

概要

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については後述

docker.service
[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/

ファイルを作成して配置

内容は下記

/etc/systemd/system/hello.service
[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はいろんなことに使える
78
80
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?