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


# 概要
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/

```bash:コピー&編集
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で使えるように登録

## 実際にやってみる
### 参考
http://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/

### 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はいろんなことに使える