Dockerをアップデートしたら翌日ディスクフルになった
概要
先日、Dockerをv20から最新のv24にアップデートしました。既存の数個のコンテナは問題なく再起動出来たのですが、翌日linuxマシンがディスクフルになっている事に気が付きました。
さくらvps、HDDモデル。Cent OS 7
Docker engineの最新版は2023/12時点でv24です。
原因
v23.0からStorageDriverのdevicemapperがデフォルト無効になり、vfsが使われるようになった。vfsは安定しているがディープコピーをするのでストレージ容量が肥大化する。
また、自分の環境だとストレージがxfsでftype=0の設定になっている事も理由に含まれる。
容量が欲しくてSSDモデルじゃなくてHDDモデルを選んだ事がアダになったか?
対策
/etc/docker/daemon.json
に以下の内容を記載する。
後述するが最新のoverlay2は使えなかった。
{
"storage-driver": "devicemapper"
}
ソースは以下のURL
これを指定すると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参照
この方法でも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
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は下記の通り。
Discussion