Docker daemonが ルートディレクトリの容量を圧迫するのを回避する
Dockerのイメージを大量にビルドなどしていると、気づくとルート(/
)の容量がいっぱいになっていることがあります。
$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 udev 126G 0 126G 0% /dev tmpfs 26G 2.5M 26G 1% /run /dev/sda3 275G 273G 0 100% / ←100%になっている
フォルダ容量を調べてみると、 /var/lib/docker/overlay2
が大きく容量を取っていることがわかります。
/var/lib/docker# du -sh * 88K buildkit 120K containers 266M image 64K network 211G overlay2 16K plugins 4.0K runtimes 4.0K swarm 4.0K tmp 4.0K trust 28K volumes
既存のイメージを削除していく方法はいくつか見つけました。
dockerで/var/lib/docker/overlay2 が肥大化した時の対処 - 1 Minute Tech Tips
/var/lib/docker/overlay2のストレージ肥大化対応 - /home/jiro4989
ここでは /var/lib/docker/overlay2
の容量を確保し、いくらdocker buildしても大丈夫な環境を構築したいと思います。
物理パーテションには空きはないので、ルートパーテションを確保するにはOSの再インストールから行わないといけません。それはやりたくない。 そこで、容量に余裕がある他のディレクトリ(ここではホームディレクトリ (/home/rnakato)とする)にディレクトリを移動し、そこにリンクを貼るやり方を試してみます。
# systemctl stop docker # mv /var/lib/docker/overlay2 /home/rnakato/var_lib_docker_overlay2/ # ln -s /home/rnakato/var_lib_docker_overlay2/ /var/lib/docker/overlay2 # systemctl start docker
しかしこの方法だとうまくいきません。docker buildを使うと以下のようなエラーが出ます。 どうやらシンボリックリンクディレクトリだとdocker は動作しないようです。
failed to create shim: OCI runtime create failed: runc create failed: invalid rootfs: not an absolute path, or a symlink: unknown
Docker 'is not an absolute path or is a symlink' error - Stack Overflow
そこで、ホームディレクトリに新しく作ったディレクトリを mount
コマンドでbindしてみることにします。
# systemctl stop docker # mv /var/lib/docker/overlay2 /home/rnakato/var_lib_docker_overlay2/ # mkdir /var/lib/docker/overlay2 # mount --bind /home/rnakato/var_lib_docker_overlay2/ /var/lib/docker/overlay2 # systemctl start docker
Dockerの/var/lib/dockerを移動する - Qiita
この方法だとうまくいきました。
$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 udev 126G 0 126G 0% /dev tmpfs 26G 2.6M 26G 1% /run /dev/sda3 275G 63G 199G 24% /