CentOS7.3でdocker0がないため/ネットワークの重複でdocker0が作成されなかったのでdocker.serviceが立ち上がらなかった

docs.docker.com

↑に従ってインストールしてる時、

$ sudo systemctl start docker

で失敗した

以下はjournalctlのログ

12月 20 16:09:52 example systemd[1]: docker.service holdoff time over, scheduling restart.
12月 20 16:09:52 example systemd[1]: Starting Docker Application Container Engine...
-- Subject: Unit docker.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has begun starting up.
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.180328678+09:00" level=info msg="parsed scheme: \"unix\"" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.180393506+09:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.180440304+09:00" level=info msg="parsed scheme: \"unix\"" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.180449023+09:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.183865860+09:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.184705891+09:00" level=info msg="ccResolverWrapper: sending new addresses to cc: [{unix:///run/containerd/containerd.sock 0  <nil>}]" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.184734395+09:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.184783244+09:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420612910, CONNECTING" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.184977899+09:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420612910, READY" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.185005436+09:00" level=info msg="ccResolverWrapper: sending new addresses to cc: [{unix:///run/containerd/containerd.sock 0  <nil>}]" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.185016987+09:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.185046636+09:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420612be0, CONNECTING" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.185160010+09:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420612be0, READY" module=grpc
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.188935526+09:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
12月 20 16:09:52 example dockerd[26871]: time="2018-12-20T16:09:52.189454109+09:00" level=info msg="Loading containers: start."
12月 20 16:09:52 example dockerd[26871]: Error starting daemon: Error initializing network controller: list bridge addresses failed: no available network
12月 20 16:09:52 example systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
12月 20 16:09:52 example systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is failed.

以上はjournalctlのログ

Error starting daemon: Error initializing network controller: list bridge addresses failed: no available network

ほう

$ ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:50:56:b9:26:14 brd ff:ff:ff:ff:ff:ff
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:50:56:b9:76:49 brd ff:ff:ff:ff:ff:ff

なんでdocker0が生成されないんだ…

何故

追記(2018/12/24)

ちゃんと見てなかったのでとても恥ずかしいんですが、上記ルーティングの ens192 というやつがこういうroutingをしていた

$ ip r
172.16.0.0/12 via 10.26.149.254 dev ens192  proto static  metric 100

docker0 が作りたいルーティングは以下の通りで、ホストアドレス部分が被ってしまうためdockerインストール時にルーティングが作られないようだった

172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1

また、このままホストアドレス部分が被っているとまずいので被っているルーティングについて解決する必要がある

今回は ens192 側のサブネットマスクを大きくして必要な部分だけルーティングで追加していくのが手っ取り早そうだったので ens192 側を解決させた(ここでは省略するけども)

追記ここまで(2018/12/24)

作られなかったブリッジを作る

というわけで本来作ってくれるはずだった仮想ブリッジの docker0 を作ってあげます

$ sudo ip link add name docker0 type bridge
$ sudo ip addr add dev docker0 172.17.0.1/16
$ sudo systemctl start docker.service
$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2018-12-20 16:32:23 JST; 3min 27s ago

docker0の使用するip帯を変えるには

追記(2018/12/24)

もしdocker側を変えたい場合はdocker daemon起動時の引数に --bip=他のアドレス を指定すると良いです

$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down
$ sudo ip link del dev docker0
$ ip r
default via 10.0.2.2 dev enp0s3  proto static  metric 100
10.0.2.0/24 dev enp0s3  proto kernel  scope link  src 10.0.2.15  metric 100
172.18.0.0/16 dev br-da27a92cc9df  proto kernel  scope link  src 172.18.0.1
192.168.100.0/24 dev enp0s8  proto kernel  scope link  src 192.168.100.20  metric 100
// docker0 がないことを確認する

$ cat /usr/lib/systemd/system/docker.service
~~省略~~
[Service]
~~省略~~
+EnvironmentFile=/etc/sysconfig/docker
-ExecStart=/usr/bin/dockerd -H unix://
+ExecStart=/usr/bin/dockerd -H unix:// $OPTIONS
~~省略~~

$ cat /etc/sysconfig/docker
+OPTIONS="--bip=10.17.0.1/16"

$ sudo systemctl daemon-reload
$ sudo systemctl start docker
$ ip r
default via 10.0.2.2 dev enp0s3  proto static  metric 100
10.0.2.0/24 dev enp0s3  proto kernel  scope link  src 10.0.2.15  metric 100
172.18.0.0/16 dev br-da27a92cc9df  proto kernel  scope link  src 172.18.0.1
10.17.0.0/16 dev docker0  proto kernel  scope link  src 10.17.0.1
192.168.100.0/24 dev enp0s8  proto kernel  scope link  src 192.168.100.20  metric 100
// docker0のdestがbipで指定したやつになっている💯

追記ここまで(2018/12/24)

さいごに

おわりです

参考

github.com

qiita.com