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
以下を参考にする。
これらによると、以下のようである。
-a あるいは --archive とは: | archive mode; equals -rlptgoD (no -H,-A,-X) |
-X あるいは --xattrs とは: | preserve extended attributes |
-S あるいは --sparse とは: | turn sequences of nulls into sparse blocks |
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/ の下にあるやつが悪さをしているのだろうか。
以下を見ると、
「下位のレイヤと共有するデータを効率的に参照する手法として、ハードリンクが使われます。」などとある。
ここで、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