2019年12月8日日曜日

いつの間にかGentoo LinuxでDockerが起動しなくなっていた(cgroup v2)

明日は誕生日です。プレゼントは随時受け付けています。

というわけで。

久しぶりに開発のためにdockerコマンドを使おうとしたところ、デーモンが起動していないくさいメッセージが表示されました。

その対応に2〜3日使った話です。

ちょっと長いので結論だけ知りたい人は「結論」セクションを見てください。

やったこと一覧(失敗)

Dockerデーモンを起動

何はともあれ、とりあずコレ。
$ sudo 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.
なんかエラーが出てるみたい。

ではアドバイスどおり調べてみよう。
$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2019-11-17 11:50:06 JST; 11s ago
     Docs: https://docs.docker.com
  Process: 27485 ExecStart=/usr/bin/dockerd -H fd:// (code=exited, status=1/FAILURE)
 Main PID: 27485 (code=exited, status=1/FAILURE)
      CPU: 208ms

11月 17 11:50:06 midgard systemd[1]: docker.service: Failed with result 'exit-code'.
11月 17 11:50:06 midgard systemd[1]: Failed to start Docker Application Container Engine.
11月 17 11:50:06 midgard systemd[1]: docker.service: Service RestartSec=100ms expired, scheduling r>
11月 17 11:50:06 midgard systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
11月 17 11:50:06 midgard systemd[1]: Stopped Docker Application Container Engine.
11月 17 11:50:06 midgard systemd[1]: docker.service: Start request repeated too quickly.
11月 17 11:50:06 midgard systemd[1]: docker.service: Failed with result 'exit-code'.
11月 17 11:50:06 midgard systemd[1]: Failed to start Docker Application Container Engine.
なるほどわからん

-s overlay2をつけてみた

とりあえずメッセージ内のFailed to start Docker Application Container Engine.で検索したら、Ubuntu18.04でDockerが起動しなくなったので直す - Qiitaという記事が出てきました。

今回はUbuntuじゃなくてGentooだけど、ここに書いてあるとおり-s overlay2をつけて再起動。
$ sudo 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.
$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2019-11-17 11:52:55 JST; 3s ago
     Docs: https://docs.docker.com
  Process: 27905 ExecStart=/usr/bin/dockerd -H fd:// -s overlay2 (code=exited, status=1/FAILURE)
 Main PID: 27905 (code=exited, status=1/FAILURE)
      CPU: 228ms

11月 17 11:52:55 midgard systemd[1]: docker.service: Failed with result 'exit-code'.
11月 17 11:52:55 midgard systemd[1]: Failed to start Docker Application Container Engine.
11月 17 11:52:55 midgard systemd[1]: docker.service: Service RestartSec=100ms expired, scheduling r>
11月 17 11:52:55 midgard systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
11月 17 11:52:55 midgard systemd[1]: Stopped Docker Application Container Engine.
11月 17 11:52:55 midgard systemd[1]: docker.service: Start request repeated too quickly.
11月 17 11:52:55 midgard systemd[1]: docker.service: Failed with result 'exit-code'.
11月 17 11:52:55 midgard systemd[1]: Failed to start Docker Application Container Engine.
変わらず。

/var/run/docker.sock/run/docker.sock

今度はカーネルが何かエラーを出していないか確認。
$ dmesg | grep docker
[    5.998243] systemd[1]: /lib/systemd/system/docker.socket:6: ListenStream= references a path below legacy directory /var/run/, updating /var/run/docker.sock → /run/docker.sock; please update the unit file accordingly.
なんか出てた。ソケットファイルのパスを変えろという話か。

仰せのままに変えてもやはり結果は変わらず。

cgroup_enable=memory swapaccount=1

今度はdockerdのログを確認。
$ journalctl -u docker.service
11月 17 14:32:01 midgard dockerd[5251]: Error starting daemon: Devices cgroup isn't mounted
cgroupの問題とな。

このメッセージで検索すると、Docker 1.8.1でdocker daemonを実行したらエラーになった際の対処 - Qiitaという記事を発見。

ここに書いてあるとおり、/etc/default/grubを変更。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
これでもやっぱり変わらない。

正確には、変更したのはGRUB_CMDLINE_LINUX_DEFAULTなんですが、そのへんの細かいことはこの際どうでもいいです。

うまくいったやつ

Dockerに、カーネルがDocker用に設定されているかをチェックするスクリプトがあるそうな。こいつを実行してみよう。
$ /usr/share/docker/contrib/check-config.sh 
warning: /proc/config.gz does not exist, searching other paths for kernel config ...
info: reading kernel config from /usr/src/linux-4.19.82-gentoo/.config ...

Generally Necessary:
- cgroup hierarchy: nonexistent??
    (see https://github.com/tianon/cgroupfs-mount)
- CONFIG_NAMESPACES: enabled
- CONFIG_NET_NS: enabled
...(略)...
またcgroupがどうのとかいってる。

…そういえば、今のGentooのカーネルはcgroup v2がデフォルトになったんだっけ?

というわけで検索したところ、日本人が書いたっぽいThe current adoption status of cgroup v2 in containersという記事を発見。

…ふむふむ。
…ふむふむ。
While the adoption of cgroup v2 is an inevitable step toward 2020s, most container implementations including Docker/Moby and Kubernetes still don’t support cgroup v2.
まだ対応してないんかい!

少し下にTL;DR if you just want to start Docker on Fedora 31 right nowというセクションがあったので、そこに書いてあるコマンドを参考に/etc/default/grubを変更
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=0"
今度こそうまくいった!!!!

結論

2019年12月現在、cgroup v2を使っているLinuxカーネルでDockerを使う場合は、/etc/default/grubの以下の部分を変更してください。
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=0"

0 件のコメント:

コメントを投稿