発生した事象について(2023/5月時点)
systemctlコマンドでCentOS上のDockerを起動しようとすると以下のようにステータスが「failed」となり起動できなくなった。
$ systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
$ systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since 火 2023-05-14 09:13:23 JST; 1s ago
Docs: https://docs.docker.com
Process: 11497 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 11497 (code=exited, status=1/FAILURE)
5月 14 09:13:21 ip-10-12-31-72 systemd[1]: Failed to start Docker Application Container Engine.
5月 14 09:13:21 ip-10-12-31-72 systemd[1]: Unit docker.service entered failed state.
5月 14 09:13:21 ip-10-12-31-72 systemd[1]: docker.service failed.
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: docker.service holdoff time over, scheduling restart.
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: Stopped Docker Application Container Engine.
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: start request repeated too quickly for docker.service
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: Failed to start Docker Application Container Engine.
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: Unit docker.service entered failed state.
5月 14 09:13:23 ip-10-12-31-72 systemd[1]: docker.service failed.
原因
「docker.service」がデフォルトの値に書き換わっていた。
CentOSでDockerデーモンを起動する際、devicemapperを明示的に指定する必要があった。
解決方法
「docker.service」の「ExecStart」に「-s devicemapper」とdevicemapperを明示的に指定する。
修正前(デフォルト値)
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修正後
ExecStart=
ExecStart=/usr/bin/dockerd -s devicemapper --containerd=/run/containerd/containerd.sock
※ファイル修正後は「systemctl daemon-reload」を実行し、修正内容を反映する
※おま環かもしれませんが・・・
ExecStartに「-H fd://」を指定したままだと「systemctl start docker」でデーモンの起動はできるが各種dockerコマンドが実行できないことがあった
余談1
dockerdコマンドでデーモンを起動した際、以下のエラーが発生していた。
ERRO[2023-02-14T17:04:24.149475577+09:00] [graphdriver] prior storage driver devicemapper is deprecated and will be removed in a future release; update the the daemon configuration and explicitly choose this storage driver to continue using it; visit https://docs.docker.com/go/storage-driver/ for more information
-
上記エラーは「devicemapper」が使用されたことが検出され、「devicemapper」が将来のリリースで廃止されることが通知されたことを意味している
これが原因で「systemctl」コマンドでのデーモン起動ができなかった -
Ubuntuなどにおいて、Docker 1.13以前では「devicemapper」が、Docker 1.13以降では「overlay2」がデフォルトのストレージドライバーとして使用されている
一方で、CentOSではバージョンを問わず「devicemapper」がデフォルトとなっているため、「devicemapper」を使おうとして怒られている状態だといえる -
将来的にdevicemapperをサポートしなくなるため、devicemapperを使用し続けるには、「-s」で明示的に設定する必要がある
余談2
CentOSでもoverlay2をサポートしているから、devicemapperを使ってる人は早めに移行したほうがいいよという話(2023/5月時点)
devicemapperについての詳細:https://docs.docker.com/storage/storagedriver/select-storage-driver/
The devicemapper storage driver requires direct-lvm for production environments, because loopback-lvm, while zero-configuration, has very poor performance. devicemapper was the recommended storage driver for CentOS and RHEL, as their kernel version did not support overlay2. However, current versions of CentOS and RHEL now have support for overlay2, which is now the recommended driver.