状況
Fedora を31 にアップグレードすると、Docker が起動しなくなってしまった。
# systemctl start docker .130
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
journalctl でログを見ると、以下のようなメッセージが出力されていました。
myserver systemd[1]: Starting Docker Application Container Engine...
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="libcontainerd: new containerd process, pid: pppp"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="failed to rename /var/lib/docker/tmp for background deletion: %!s(<nil>). Deleting synchronously"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man ...
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="devmapper: Base device already exists and has filesystem xfs on it. User specified filesystem will be ignored."
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="[graphdriver] using prior storage driver: devicemapper"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="Graph migration to content-addressability took 0.00 seconds"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Your kernel does not support cgroup memory limit"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find cpu cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find blkio cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find cpuset cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="mountpoint for pids not found"
myserver dockerd[pppp]: Error starting daemon: Devices cgroup isn't mounted
その中で、Error starting daemon: Devices cgroup isn't mounted
というメッセージが今回の直接的な原因とみて、これを起点に調査を開始したところ、以下のページがヒットしました。
- Bug 1746355 - Error starting daemon: Devices cgroup isn't mounted
原因としてはFedora 31 からsystemd が使うcgroup がcgroup v1 からcgroup v2 に変更されたためで、Docker(moby-engine) がまだそれに対応していないためです。
Fedora チームとしては、Docker の対応を待つ方針のようで、Fedora サイドからDocker に合わせて対応することはなさそうです。
しかしDocker が使えなくなるのは、人によってはかなり困ることになるかと思います。
ということでFedora 31 にて、かろうじてDocker を動かす方法について、備忘録として残しておこうと思います。
起動kernel コマンドラインパラメータの変更
cgroup v2 を使用しないようにするために、起動時のkernel コマンドラインパラメータにてunified_cgroup_hierarchy=0
(false)を指定するようにします。
これを0 に設定することでハイブリットもしくはレガシーなcgroup ヒエラルキを使用するようになります。
/etc/sysconfig/grub
ファイルを開き、GRUB_CMDLINE_LINUX
変数の値を以下のように変更します。
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet console=ttyS0,115200"
↓ ↓ ↓
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet console=ttyS0,115200 systemd.unified_cgroup_hierarchy=0"
変更が完了したら、grub.cfg ファイルのリビルドを行います。
# BIOS boot の場合
# grub2-mkconfig -o /boot/grub2/grub.cfg
# EFI boot の場合
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
リビルドが完了したらOS を再起動し、Docker が正常に起動することを確認してください。
まとめ
Fedora にてDocker を使っている場合は、まだFedora 31 にアップグレードしないほうが良いかも知れません。
Fedora 31 にアップグレードしてしまった人は、Docker(moby-engine) がcgroup v2 に対応するのも時間の問題と思うので、それまでは本対応を実施して運用をするのが良いでしょう。
参考
-
Bug 1746355 - Error starting daemon: Devices cgroup isn't mounted
-
26.5. CUSTOMIZING THE GRUB 2 CONFIGURATION FILE
-
systemd