🌊

Dockerをアップデートしたら翌日ディスクフルになった

2023/12/26に公開

概要

先日、Dockerをv20から最新のv24にアップデートしました。既存の数個のコンテナは問題なく再起動出来たのですが、翌日linuxマシンがディスクフルになっている事に気が付きました。
さくらvps、HDDモデル。Cent OS 7

Docker engineの最新版は2023/12時点でv24です。
https://docs.docker.com/engine/release-notes/

原因

v23.0からStorageDriverのdevicemapperがデフォルト無効になり、vfsが使われるようになった。vfsは安定しているがディープコピーをするのでストレージ容量が肥大化する。
https://github.com/containers/buildah/pull/4832
https://docs.docker.com/engine/deprecated/#device-mapper-storage-driver

また、自分の環境だとストレージがxfsでftype=0の設定になっている事も理由に含まれる。
容量が欲しくてSSDモデルじゃなくてHDDモデルを選んだ事がアダになったか?

対策

/etc/docker/daemon.jsonに以下の内容を記載する。
後述するが最新のoverlay2は使えなかった。

{
  "storage-driver": "devicemapper"
}

ソースは以下のURL
https://docs.docker.com/storage/storagedriver/device-mapper-driver/
これを指定するとdocker infoにwarningが出る。

$sudo docker info
Client: Docker Engine - Community
 Version:    24.0.7
略
 Storage Driver: devicemapper
  Pool Name: docker-253:4-2568162560-pool
  Pool Blocksize: 65.54kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data file: /dev/loop2
  Metadata file: /dev/loop3
  Data loop file: /var/lib/docker/devicemapper/devicemapper/data
  Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
  Data Space Used: 19.33MB
  Data Space Total: 107.4GB
  Data Space Available: 107.4GB
  Metadata Space Used: 17.37MB
  Metadata Space Total: 2.147GB
  Metadata Space Available: 2.13GB
  Thin Pool Minimum Free Space: 10.74GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.170-RHEL7 (2020-03-24)
略
WARNING: The devicemapper storage-driver is deprecated, and will be removed in a future release.
         Refer to the documentation for more information: https://docs.docker.com/go/storage-driver/
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
         Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.

最新のoverlay2にしたいからvps乗り換えようかな。

他の方法

dockerdに-s devicemapperを指定する方法でも可。
sudo vim /lib/systemd/system/docker.serviceの以下の部分に、
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -s devicemapper -H略 を指定する。

書き換えた後は以下のコマンド実行

>systemctl daemon-reload
>systemctl restart docker

dockerdの設定は以下のURL参照
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-storage-driver

この方法でもdocker infoには同じくwarningが出る

調査内容

古いバージョンのdockerを入れる方法

過去のdockerのバージョンを確認する

>yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64            3:24.0.5-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.4-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.3-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.2-1.el7                     docker-ce-stable 
略

バージョンの3:24.0.5-1.el7を入れたい場合、24.0.5-1.el7以下のコマンドを実行、
先頭の3:を抜く必要があった。
sudo yum install -y docker-ce-24.0.5-1.el7 docker-ce-cli-24.0.5-1.el7 containerd.io docker-buildx-plugin docker-compose-plugin

https://docs.docker.com/engine/install/centos/
上記のURLにはfor example docker-ce-3:24.0.0-1.el8と書かれていた。このままだとエラーは出ないが指定されたバージョンのdocker-ceやdocker-ce-cliがインストールされない。警告は出るが。
なんで過去のバージョンのdockerが入らないのか悩んだ。

今はdocker-ceとdocker-ce-cliのバージョンが同じだが、本当はちゃんと調べたほうが良いだろう。
docker-compose-pluginもバージョン指定をする時は同じ方法が使えるだろう。

現状のディスクがoverlay2に対応していない事の裏付け

docker的には2023/12時点でoverlay2というストレージドライバが推奨になっている。
これがcentOS 7に対応しているのかを確認するまでの流れ。

以下のURLによると、CentOSはoverlay2に対応している。

ファイルシステムがxfsか、ext4である必要があるらしい。

以下のコマンドを実行。ルートにマウントしているドライブは/dev/vda4。その情報をxfs_infoで確認すると、ftype=0とある。

$ df -T
/dev/vda4      xfs   /
$ xfs_info /dev/vda4 
meta-data=/dev/vda4              isize=256    agcount=907, agsize=230015 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=208538107, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0 ★ここ
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

xfsの場合はftype=1の必要があるので、今の環境ではoverlay2は使えないらしい。

参考URLは下記の通り。
https://docs.docker.com/storage/storagedriver/select-storage-driver/
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/xfs_info/

Discussion