IPv6アドレスを運用しているNW上のホストでdockerが動かない場合の対応

dockerが突然動かなくなったので調べたら,IPv6を導入するとエラーが出るらしいの で設定を修正した.

dockerが動かない

こんなエラーを吐いて,dockerdがstartできない.

$ sudo service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2020-07-03 11:32:23 JST; 14min ago
     Docs: https://docs.docker.com
  Process: 2807 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status Main PID: 2807 (code=exited, status=1/FAILURE)

Jul 03 11:32:23 hostname systemd[1]: docker.service: Service hold-off time over, scheduling restart.
Jul 03 11:32:23 hostname systemd[1]: docker.service: Scheduled restart job, restart counter is at 3.
Jul 03 11:32:23 hostname systemd[1]: Stopped Docker Application Container Engine.
Jul 03 11:32:23 hostname systemd[1]: docker.service: Start request repeated too quickly.
Jul 03 11:32:23 hostname systemd[1]: docker.service: Failed with result 'exit-code'.
Jul 03 11:32:23 hostname systemd[1]: Failed to start Docker Application Container Engine.

調べて出てきた原因の可能性

  • /lib/systemd/system/docker.service内のファイルパス等がミスっているとdocker.service: Start request repeated too quickly.が出るらしい
    • 合っていた
  • ipv6に対応してないとかしているとかいう記事もある
    • ⇒これかも...?

syslogを見てみる.

Jul  3 11:49:50 hostname dockerd[3708]: time="2020-07-03T11:49:50.999199769+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Jul  3 11:49:51 hostname dockerd[3708]: time="2020-07-03T11:49:51.001215506+09:00" level=info msg="stopping event stream following graceful shutdown" error="<nil>" module=libcontainerd namespace=moby
Jul  3 11:49:51 hostname dockerd[3708]: failed to start daemon: Error initializing network controller: Error creating default "bridge" network: could not find an available, non-overlapping IPv6 address pool among the defaults to assign to the network
Jul  3 11:49:51 hostname systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Jul  3 11:49:51 hostname systemd[1]: docker.service: Failed with result 'exit-code'.

どうやら,networkまわりでエラーが出ているらしい. IPv6,あやしい…

IPv6対応

NW I/Fの確認

まず,現状でIPv6アドレスをdockerのインターフェースが持っているか見てみる.

$ ip a
(...)
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:7d:62:5a:64 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
(...)

ない.

ipv6設定

なので,設定する. 設定は/etc/docker/daemon.jsonにある.どうやら最初からipv6は有効になっている ようだが,v6 NWを指定してやると直るという情報があるので,設定してみた.

ちなみに,NWアドレスはこのアドレスが記事で使われていたので使ってみたが, NWアドレスを変更するとエラーが再発したので,どうもこのアドレス体系でないと ダメらしい…?

--- daemon.json.org     2020-07-03 11:57:46.451425472 +0900
+++ daemon.json 2020-07-03 12:00:50.722780714 +0900
@@ -1,3 +1,4 @@
 {
-    "ipv6": true
+    "ipv6": true,
+    "fixed-cidr-v6": "2001:db8:1::/64"
 }

動作確認

直すと,こうなる...動いた…!

$ sudo service docker start
$ sudo service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-07-03 12:07:58 JST; 48s ago
     Docs: https://docs.docker.com
 Main PID: 5524 (dockerd)
    Tasks: 26
   CGroup: /system.slice/docker.service
           └─5524 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 03 12:07:57 hostname dockerd[5524]: time="2020-07-03T12:07:57.355983222+09:00" level=warning msg="Your kernel does not
Jul 03 12:07:57 hostname dockerd[5524]: time="2020-07-03T12:07:57.356053285+09:00" level=warning msg="Your kernel does not
Jul 03 12:07:57 hostname dockerd[5524]: time="2020-07-03T12:07:57.356085196+09:00" level=warning msg="Your kernel does not
Jul 03 12:07:57 hostname dockerd[5524]: time="2020-07-03T12:07:57.356417606+09:00" level=info msg="Loading containers: sta
Jul 03 12:07:57 hostname dockerd[5524]: time="2020-07-03T12:07:57.904427807+09:00" level=info msg="Default bridge (docker0
Jul 03 12:07:58 hostname dockerd[5524]: time="2020-07-03T12:07:58.020581169+09:00" level=info msg="Loading containers: don
Jul 03 12:07:58 hostname dockerd[5524]: time="2020-07-03T12:07:58.094013984+09:00" level=info msg="Docker daemon" commit=3
Jul 03 12:07:58 hostname dockerd[5524]: time="2020-07-03T12:07:58.094141391+09:00" level=info msg="Daemon has completed in
Jul 03 12:07:58 hostname dockerd[5524]: time="2020-07-03T12:07:58.140468154+09:00" level=info msg="API listen on /var/run/
Jul 03 12:07:58 hostname systemd[1]: Started Docker Application Container Engine.
comments powered by Disqus