LoginSignup
88
95

More than 5 years have passed since last update.

Dockerイメージの格納先変更

Last updated at Posted at 2016-07-10

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

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

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

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

dockerの向き先の変更

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

DOCKER_OPTSを変更すればよし。

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

変更の反映

変更の反映
sudo systemctl restart docker

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

そして失敗

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

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の設定を覗く(チラチラ)。

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の中身

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の設定を変えると良さそう。
ということで変更。

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再起動と確認、そして成功

docker再起動
sudo systemctl restart docker
出力メッセージ
Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.

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

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

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

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で指定したディレクトリの中も覗いてみる。

/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ファイルを変更してみた。

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

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

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

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

docker再起動
sudo systemctl daemon-reload
sudo systemctl restart docker
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これで安心。

88
95
2

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
88
95