Dockerイメージの格納先変更



Ubuntuでインストールしたdockerはデフォルトでは
/var/lib/docker配下にイメージを格納します。

とは言うでも/var/lib/dockerを含んだ
ボリュームのサイズがそんなに大きくないよ!
なんてことあると思います。

その変更方法。(とハマった部分)



# (失敗例) /etc/defaults/dockerを変更

## dockerの向き先の変更
dockerの各種ファイルの格納先を変更するには、
/etc/defaults/dockerを編集するらしい。

DOCKER_OPTSを変更すればよし。

```Bash:/etc/defaults/dockerの変更内容
DOCKER_OPTS="-g /opt/docker"
```

## 変更の反映

```Bash:変更の反映
sudo systemctl restart docker
```

よし、これで... **反映されてない**。

## そして失敗

/etc/defaults/dockerファイルを見てみるとこんな記述が。

```txt:dockerファイルの記述
#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/articles/systemd/
#
```

はい、死んだ。:cry: 
systemdではこのファイルは読まれませんとの注意書きが...... :skull: 

# (成功例) docker.serviceを変更

じゃあ、systemdからdockerのプロセス立ち上げるときに
設定を入れればいいよねということで、systemdからdockerプロセス
を立ち上げる際の設定を確認する。

そもそもsystemdのdockerプロセス立ち上げの設定が
どこにあるのか分からないので、まずはそこから探してみる。

systemdのdocker.serviceの設定を覗く(チラチラ)。

```Bash:docker.serviceの状態
sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2016-07-10 09:52:28 UTC; 20min ago
     Docs: https://docs.docker.com
 Main PID: 2061 (docker)
    Tasks: 17
   Memory: 14.5M
      CPU: 685ms
   CGroup: /system.slice/docker.service
           ├─2061 /usr/bin/docker daemon -H fd://
           └─2068 docker-containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime docker-runc --start-timeout 2m

```

設定ファイルは **/lib/systemd/system/docker.service** にあるみたい。

## docker.serviceの中身

```ini:docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/docker daemon -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

[Install]
WantedBy=multi-user.target
```

ExecStartの設定を変えると良さそう。
ということで変更。

```ini:docker.service(変更後)
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/docker daemon -H fd:// -g /opt/docker
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

[Install]
WantedBy=multi-user.target
```
## docker再起動と確認、そして成功
```Bash:docker再起動
sudo systemctl restart docker
```

```Bash:出力メッセージ
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
```


...そーいや、systemdの構成ファイル変更したらsystemctl daemon-reloadいるんでした。

```Bash:docker再起動(正しい版)
sudo systemctl daemon-reload
sudo systemctl restart docker
```

特に何もなくプロンプトが戻ってきた。

```Bash:dockerプロセスの状態確認
ps -ef | grep docker

root      2891     1  3 10:23 ?        00:00:00 /usr/bin/docker daemon -H fd:// -g /opt/docker
root      2899  2891  0 10:23 ?        00:00:00 docker-containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime docker-runc --start-timeout 2m
ubuntu    2955  1465  0 10:23 pts/0    00:00:00 grep --color=auto docker
```

ちゃんと指定した部分が反映されている。よかった。

念のため、-gで指定したディレクトリの中も覗いてみる。

```Bash:/opt/dockerディレクトリのチェック
ls /opt/docker
aufs  containers  image  network  tmp  trust  volumes
```

/var/lib/docker配下と同等のディレクトリ構成が確認できた。
多分これでいいはず。

**イメージ以外の部分も変更されちゃってるけどそこは勘弁してください。**

# もっと行儀の良い方法(追記版)
docker.serviceファイルのExecStartの値を直接いじっていたけれどもできれば今後、dockerのデーモン立ち上げの際のオプションについては色々検討したいのでいじれるようにしたい。

けども、 **docker.serviceファイルは直接いじりたくない** ので
ExecStartの中で指定している **dockerコマンドのオプション部分だけ外部化したい**。

ということで、こんな感じにdocker.serviceファイルを変更してみた。


```ini:docker.serviceファイルの内容(抜粋・変更前)
[Service]
Type=notifycgroup feature set required
ExecStart=/usr/bin/docker daemon -H fd:// -g /opt/docker
```

```ini:docker.serviceファイルの内容(抜粋・変更後)
[Service]
Type=notify
EnvironmentFile=/opt/config/docker
ExecStart=/usr/bin/docker daemon $OPTIONS

```

EnvironmentFileで/opt/config/dockerに記載の環境変数を読み込むように変更。

```Bash:/opt/config/dockerの内容
OPTIONS="-H fd:// -g /opt/docker"
```

で、dockerを再起動。今度はしくじらぬぞ。

```Bash:docker再起動
sudo systemctl daemon-reload
sudo systemctl restart docker
```

```Bash:dockerプロセスの確認
ps -ef | grep docker
root      4034     1  0 11:45 ?        00:00:00 /usr/bin/docker daemon -H fd:// -g /opt/docker
root      4040  4034  0 11:45 ?        00:00:00 docker-containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime docker-runc --start-timeout 2m
ubuntu    4098  1465  0 11:46 pts/0    00:00:00 grep --color=auto docker
```

OK.OKこれで安心。