Ubuntuでインストールしたdockerはデフォルトでは
/var/lib/docker配下にイメージを格納します。
とは言うでも/var/lib/dockerを含んだ
ボリュームのサイズがそんなに大きくないよ!
なんてことあると思います。
その変更方法。(とハマった部分)
(失敗例) /etc/defaults/dockerを変更
dockerの向き先の変更
dockerの各種ファイルの格納先を変更するには、
/etc/defaults/dockerを編集するらしい。
DOCKER_OPTSを変更すればよし。
DOCKER_OPTS="-g /opt/docker"
変更の反映
sudo systemctl restart docker
よし、これで... 反映されてない。
そして失敗
/etc/defaults/dockerファイルを見てみるとこんな記述が。
#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
# Please see the documentation for "systemd drop-ins":
# https://docs.docker.com/engine/articles/systemd/
#
はい、死んだ。
systemdではこのファイルは読まれませんとの注意書きが......
(成功例) docker.serviceを変更
じゃあ、systemdからdockerのプロセス立ち上げるときに
設定を入れればいいよねということで、systemdからdockerプロセス
を立ち上げる際の設定を確認する。
そもそもsystemdのdockerプロセス立ち上げの設定が
どこにあるのか分からないので、まずはそこから探してみる。
systemdの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の中身
[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の設定を変えると良さそう。
ということで変更。
[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再起動と確認、そして成功
sudo systemctl restart docker
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
...そーいや、systemdの構成ファイル変更したらsystemctl daemon-reloadいるんでした。
sudo systemctl daemon-reload
sudo systemctl restart 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で指定したディレクトリの中も覗いてみる。
ls /opt/docker
aufs containers image network tmp trust volumes
/var/lib/docker配下と同等のディレクトリ構成が確認できた。
多分これでいいはず。
イメージ以外の部分も変更されちゃってるけどそこは勘弁してください。
もっと行儀の良い方法(追記版)
docker.serviceファイルのExecStartの値を直接いじっていたけれどもできれば今後、dockerのデーモン立ち上げの際のオプションについては色々検討したいのでいじれるようにしたい。
けども、 docker.serviceファイルは直接いじりたくない ので
ExecStartの中で指定している dockerコマンドのオプション部分だけ外部化したい。
ということで、こんな感じにdocker.serviceファイルを変更してみた。
[Service]
Type=notifycgroup feature set required
ExecStart=/usr/bin/docker daemon -H fd:// -g /opt/docker
[Service]
Type=notify
EnvironmentFile=/opt/config/docker
ExecStart=/usr/bin/docker daemon $OPTIONS
EnvironmentFileで/opt/config/dockerに記載の環境変数を読み込むように変更。
OPTIONS="-H fd:// -g /opt/docker"
で、dockerを再起動。今度はしくじらぬぞ。
sudo systemctl daemon-reload
sudo systemctl restart 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これで安心。