というわけで。
久しぶりに開発のために
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 mountedcgroupの問題とな。
このメッセージで検索すると、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 件のコメント:
コメントを投稿