/var/lib/docker を別パーティションに移動した覚書 (CentOS)

2018-12-02

/var/lib/docker の使用量が増え続けてディスク容量を圧迫しているので、別ディスクを増設して、/var/lib/docker をそちらに移動することにしてみた。

詳細は割愛するが、新しいパーティションは /dev/vdb1 に xfs で確保されている。

新しいパーティションをどこにマウントするかだが、以下のようなどちらかが考えられると思う。

今回、後者にしようと思う。 (注: 後で方針変更する。後述)

[nsmrtks@test ~]$ sudo mkdir /docker

[nsmrtks@test ~]$ ls -ld /var/lib/docker /docker
drwxr-xr-x.  2 root root   6 Oct 30 14:42 /docker
drwx--x--x. 14 root root 183 Oct  9 12:24 /var/lib/docker

ディレクトリのファイルモードがちょっと違うようだが後に行う rsync -a で直ると思う。

[nsmrtks@test ~]$ sudoedit /etc/fstab

/etc/fstab の末尾に、以下で示す行を追加した。

/dev/vdb1	/docker		xfs	defaults	0 1

マウントする..

[nsmrtks@test ~]$ sudo mount -av
/                        : ignored
mount: /docker does not contain SELinux labels.
       You just mounted an file system that supports labels which does not
       contain labels, onto an SELinux box. It is likely that confined
       applications will generate AVC messages and not be allowed access to
       this file system.  For more details see restorecon(8) and mount(8).
/docker                  : successfully mounted

SELinux の何かが出るが、大丈夫だろうか..

[nsmrtks@test ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   15G  5.5G  73% /
devtmpfs        897M     0  897M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M  540K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
tmpfs           184M     0  184M   0% /run/user/2101
/dev/vdb1        40G   33M   40G   1% /docker

一応マウントされたようだ。

最終的には Docker を停止させてファイルをコピーしないといけないかもしれないが、停止時間を最小にするために、まずは事前にコピーしておく。

[nsmrtks@test ~]$ cd /var/lib

[nsmrtks@test lib]$ date ; sudo rsync -a docker/ /docker/ ; date
Tue Oct 30 14:53:50 JST 2018

ところがこれでコピーすると、コピー先の 40GB を使い切ってもまだコピーが終了しないという症状になった。

df で見ると以下のような状態である。

[nsmrtks@test ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   15G  5.3G  74% /
devtmpfs        897M     0  897M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M  540K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
/dev/vdb1        40G   40G   44K 100% /docker
tmpfs           184M     0  184M   0% /run/user/2101

◎ ちょっとやり直し

以下を参考にする。

Dockerの/var/lib/dockerを移動する - Qiita
dockerで、pathの場所を、/var/lib/dockerから/mnt/foobar/に変更する方法 (Fedora版) - Qiita
How to change the docker image installation directory? - Stack Overflow
Exteml: /var/lib/docker の移動
docker の /var/lib/dockerに別パーティションをマウント | pepechoko's blog

これらによると、以下のようである。

40GB コピーしても終わらなかったのは、rsync に -S を付けていなかったせいかもしれない。

ここでは、/var/lib/docker をシンボリックリンクでなくすのは後で対応するとして、まずコピー (rsync) をやり直す。

[nsmrtks@test ~]$ cd /docker

[nsmrtks@test docker]$ ls -a
ls: cannot open directory .: Permission denied

[nsmrtks@test docker]$ sudo -i
[sudo] password for nsmrtks: 

[root@test ~]# pwd
/root

[root@test ~]# cd /docker

[root@test docker]# pwd
/docker

[root@test docker]# ls -a
.   builder     containers  network  plugins   swarm  trust
..  containerd  image       overlay  runtimes  tmp    volumes

[root@test docker]# date ; rm -fr * ; date
Wed Oct 31 15:01:22 JST 2018
Wed Oct 31 15:04:18 JST 2018

[root@test docker]# ls -a
.  ..

[root@test docker]# exit
logout

[nsmrtks@test docker]$ cd /var/lib

[nsmrtks@test lib]$ date ; sudo rsync -aXS docker/ /docker/ ; date
Wed Oct 31 15:10:47 JST 2018
[sudo] password for nsmrtks: 
〜

ところが、それでもコピー先の 40GB を使い切ってもコピーが終わらなかった。

◎ さらにやり直し

/var/lib/docker/overlay/ の下にあるやつが悪さをしているのだろうか。

以下を見ると、

OverlayFS ストレージの使用 — Docker-docs-ja 1.11.0 ドキュメント

「下位のレイヤと共有するデータを効率的に参照する手法として、ハードリンクが使われます。」などとある。
ここで、rsync の man をよく見ると、-a オプションは preserve hard links (-H あるいは --hard-links) を含まないようだ。

また、以下のようにすると、

nsmrtks@test:/var/lib$ mount | egrep overlay
overlay on /var/lib/docker/overlay/1978cc1b247c1143a5afe286d0ca9b997debe879dac02df7122478eeefaea8ac/merged type overlay (rw,relati
me,seclabel,lowerdir=/var/lib/docker/overlay/76c4195fe653cd76a0586c578eefdb718f9ef65d65a7380adbb54ba10e542aad/root,upperdir=/var/l
ib/docker/overlay/1978cc1b247c1143a5afe286d0ca9b997debe879dac02df7122478eeefaea8ac/upper,workdir=/var/lib/docker/overlay/1978cc1b2
47c1143a5afe286d0ca9b997debe879dac02df7122478eeefaea8ac/work)

たしかに /var/lib/docker/overlay において overlay 機能が使われているようだ。

overlay マウントのことは置いておいて、まずは rsync に -H を付けるようにしてみる。

nsmrtks@test:~$ sudo -i
[sudo] password for nsmrtks: 

[root@test ~]# cd /docker

[root@test docker]# ls -a
.  ..  builder  containerd  containers  image  network  overlay  plugins  runtimes  swarm  tmp  trust  volumes

[root@test docker]# date ; rm -fr * ; date
Thu Nov  1 13:41:39 JST 2018
Thu Nov  1 13:44:52 JST 2018

[root@test docker]# ls -a
.  ..

[root@test docker]# logout

nsmrtks@test:~$ cd /var/lib/docker

nsmrtks@test:/var/lib/docker$ cd /var/lib

nsmrtks@test:/var/lib$ date ; sudo rsync -aXSH docker/ /docker/ ; date
Thu Nov  1 13:46:02 JST 2018
Thu Nov  1 15:02:41 JST 2018

すると、ちゃんとしたサイズと思われるサイズでコピーが終了した。

nsmrtks@test:/var/lib$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   15G  5.2G  75% /
devtmpfs        897M     0  897M   0% /dev
tmpfs           920M   72K  920M   1% /dev/shm
tmpfs           920M  604K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
/dev/vdb1        40G  9.5G   31G  24% /docker
tmpfs           184M     0  184M   0% /run/user/2101

ところで、ここでこのマシンで「registry」コンテナが動いていたのが、それを停止し削除してみた。 (docker stop / docker rm -v)
すると..

nsmrtks@test:/var/lib$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
7b6278491a15        registry:2          "/entrypoint.sh /etc…"   3 weeks ago         Up 3 weeks          0.0.0.0:5000->5000/tcp   registry

nsmrtks@test:/var/lib$ docker stop registry
registry

nsmrtks@test:/var/lib$ docker rm -v registry
registry

nsmrtks@test:/var/lib$ docker ps -a | egrep registry

nsmrtks@test:/var/lib$ mount | egrep overlay

overlay マウントが無くなった。

だが、やはり Docker を停止させた状態で、あらためて /var/lib/docker をコピーしようと思う。
それには、次のようなシェルスクリプトを使用し、夜になったら Docker を停止しコピーすることにする。

#!/bin/sh
# 2018-11-01 nsmrtks

# Usage:
#	sudo sh dockersync.sh
#	sudo systemctl start docker

set -x

sleep 25000

systemctl status docker
systemctl stop docker
systemctl status docker
ps ax | egrep -i docker

ls -a /docker/

cd /var/lib

date ; rsync -aXSH --del docker/ /docker/ ; date

ls -a /docker/

df -h

# EoF
nsmrtks@test:~$ sudo sh dockersync.sh
[sudo] password for nsmrtks: 
+ sleep 25000
+ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-11-01 17:10:47 JST; 7h ago
     Docs: https://docs.docker.com
 Main PID: 1624 (dockerd)
    Tasks: 16
   Memory: 37.2M
   CGroup: /system.slice/docker.service
           ├─1624 /usr/bin/dockerd
           └─1628 docker-containerd --config /var/run/docker/containerd/containerd.toml

Nov 01 17:10:45 test.novalocal dockerd[1624]: time="2018-11-01T17:10:45.897021213+09:00" level=error msg="layer does not exist, ... linux"
Nov 01 17:10:46 test.novalocal dockerd[1624]: time="2018-11-01T17:10:46.056163276+09:00" level=error msg="layer does not exist, ... linux"
Nov 01 17:10:46 test.novalocal dockerd[1624]: time="2018-11-01T17:10:46.382877950+09:00" level=info msg="Graph migration to cont...econds"
Nov 01 17:10:46 test.novalocal dockerd[1624]: time="2018-11-01T17:10:46.385253209+09:00" level=info msg="Loading containers: start."
Nov 01 17:10:46 test.novalocal dockerd[1624]: time="2018-11-01T17:10:46.844767648+09:00" level=info msg="Default bridge (docker0...ddress"
Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.040307850+09:00" level=info msg="Loading containers: done."
Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.053719596+09:00" level=info msg="Docker daemon" commit=f...05.0-ce
Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.053834309+09:00" level=info msg="Daemon has completed in...zation"
Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.063142533+09:00" level=info msg="API listen on /var/run/...r.sock"
Nov 01 17:10:47 test.novalocal systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
+ systemctl stop docker
+ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Fri 2018-11-02 00:27:45 JST; 8ms ago
     Docs: https://docs.docker.com
  Process: 1624 ExecStart=/usr/bin/dockerd (code=exited, status=0/SUCCESS)
 Main PID: 1624 (code=exited, status=0/SUCCESS)

Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.053834309+09:00" level=info msg="Daemon has completed in...zation"
Nov 01 17:10:47 test.novalocal dockerd[1624]: time="2018-11-01T17:10:47.063142533+09:00" level=info msg="API listen on /var/run/...r.sock"
Nov 01 17:10:47 test.novalocal systemd[1]: Started Docker Application Container Engine.
Nov 02 00:27:44 test.novalocal systemd[1]: Stopping Docker Application Container Engine...
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.784226871+09:00" level=info msg="Processing signal 'terminated'"
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.787267981+09:00" level=info msg="stopping event stream f...ns.moby
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.787356574+09:00" level=info msg="stopping healthcheck fo...tainerd
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.787442203+09:00" level=info msg="stopping event stream f...ce=moby
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.789620680+09:00" level=info msg="transport: http2Client....le=grpc
Nov 02 00:27:44 test.novalocal dockerd[1624]: time="2018-11-02T00:27:44.789799462+09:00" level=info msg="transport: http2Client....le=grpc
Hint: Some lines were ellipsized, use -l to show in full.
+ egrep -i docker
+ ps ax
 2282 pts/3    S+     0:00 grep -E -i docker
16331 pts/3    S+     0:00 sudo sh dockersync.sh
16368 pts/3    S+     0:00 sh dockersync.sh
+ ls -a /docker/
.  ..
+ cd /var/lib
+ date
Fri Nov  2 00:27:45 JST 2018
+ rsync -aXSH --del docker/ /docker/
+ date
Fri Nov  2 01:37:44 JST 2018
+ ls -a /docker/
.  ..  builder  containerd  containers  image  network  overlay  plugins  runtimes  swarm  tmp  trust  volumes
+ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   14G  6.3G  69% /
devtmpfs        897M     0  897M   0% /dev
tmpfs           920M   72K  920M   1% /dev/shm
tmpfs           920M  472K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
/dev/vdb1        40G  8.4G   32G  21% /docker
tmpfs           184M     0  184M   0% /run/user/2101

翌朝、ファイルのコピーが完了しており、Docker も停止していることを一応確認したら、以下のように、マウントポイントを付け替える。

nsmrtks@test:~$ ps ax | egrep -i docker
22330 pts/3    R+     0:00 grep -E --color=auto -i docker

nsmrtks@test:~$ sudo umount /docker
[sudo] password for nsmrtks: 

nsmrtks@test:~$ sudoedit /etc/fstab

/etc/fstab の末尾の 1行を今度は以下のように変更した。

/dev/vdb1       /var/lib/docker xfs     defaults        0 1

そして、以下のように、今度は /var/lib/docker としてマウントする。

nsmrtks@test:~$ sudo rmdir /docker

nsmrtks@test:~$ cd /var/lib

nsmrtks@test:/var/lib$ ls -ld docker*
drwx--x--x. 14 root root 183 Nov  1 17:10 docker

nsmrtks@test:/var/lib$ sudo mv -i docker docker.bak

nsmrtks@test:/var/lib$ sudo mkdir docker

nsmrtks@test:/var/lib$ ls -ld docker*
drwxr-xr-x.  2 root root   6 Nov  2 08:58 docker
drwx--x--x. 14 root root 183 Nov  1 17:10 docker.bak

nsmrtks@test:/var/lib$ sudo mount /var/lib/docker

nsmrtks@test:/var/lib$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   14G  6.3G  69% /
devtmpfs        897M     0  897M   0% /dev
tmpfs           920M   72K  920M   1% /dev/shm
tmpfs           920M  504K  919M   1% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
tmpfs           184M     0  184M   0% /run/user/2101
/dev/vdb1        40G  8.4G   32G  21% /var/lib/docker

● コピー元のファイルの消去

しばらく運用してみて、問題がないようなら、ディスクの増設の際の、コピー元のファイルを消去する。

[nsmrtks@test ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G   14G  6.5G  68% /
devtmpfs        3.8G     0  3.8G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G  564K  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vdb1        40G   13G   28G  32% /var/lib/docker
tmpfs           783M     0  783M   0% /run/user/2101

[nsmrtks@test ~]$ cd /var/lib

[nsmrtks@test lib]$ ls -ld docker*
drwx--x--x. 14 root root 183 Nov  2 09:07 docker
drwx--x--x. 14 root root 183 Nov  1 17:10 docker.bak

[nsmrtks@test lib]$ sudo rm -fr docker.bak
[sudo] password for nsmrtks: 

[nsmrtks@test lib]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  5.3G   15G  27% /
devtmpfs        3.8G     0  3.8G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G  564K  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vdb1        40G   13G   28G  32% /var/lib/docker
tmpfs           783M     0  783M   0% /run/user/2101

以上


index