Dockerを起動すると接続できなくなる場合の対応方法(docker0ブリッジの削除と再設定)


社内のネットワーク設定とdockerのデフォルトブリッジ設定が衝突しているせいで、毎回設定し忘れてハマるのでメモ。

そしてDocker-CEになる前の設定方法を見ていてハマったのでメモ。

そもそもの原因

操作しているPCが172.17.x.xのネットワークに属している場合に、dockerでデフォルトで設定される仮想ブリッジネットワークが172.17.0.1/16なので衝突してしまいdockerホストに接続できなくなってしまう。

対処方法

docker0仮想ブリッジを削除して、手動設定で再作成する。

環境

  • CentOS 7
  • Docker-CE 19.03
  • 開発PCがのIPアドレスが172.17.x.x
  • 設定変更用の172.17.0.0/16以外のPC

手順とコマンド

CentOSだったのでrootで操作。Ubuntuの場合は適宜sudoしてください。

衝突の確認

# ip addr
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:f7:ae:5c:3e 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
# nmcli
...
docker0: 接続済み to docker0
        "docker0"
        bridge, 02:42:F7:AE:5C:3E, sw, mtu 1500
        inet4 172.17.0.1/16
        route4 172.17.0.0/16

確かに172.17.0.1/16が使われていることを確認

dockerの停止

# systemctl stop docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead) since 火 2019-07-23 16:55:20 JST; 19s ago
     Docs: https://docs.docker.com
  Process: 58478 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)
 Main PID: 58478 (code=exited, status=0/SUCCESS)
...

ブリッジの停止と削除

# ip link set dev docker0 down  # 停止
# nmcli
...
docker0: 管理無し
        "docker0"
        bridge, 02:42:F7:AE:5C:3E, sw, mtu 1500
...
#
# ip link delete docker0  # 削除
# nmcli
...
(docker0が表示されなくなる)
...

docker0仮想ブリッジのIPを変更

/etc/docker/daemon.jsonとして以下内容のファイルを配置する。

{
  "bip": "192.168.1.1/16"
}

ここでは192.168.1.1にしているが、クラスC192.168.x.xも使われている可能性があるので、10.0.x.xとか適宜変更(DNSサーバーとぶつかって名前解決できなくなった……orz)。

参考: Customize the docker0 bridge

/etc/sysconfig/docker/etc/default/docker/etc/systemd/system/docker.serviceなどを利用した方法はDocker-CEになる以前の1.x系の設定方法なので使えません。

dockerを起動

# systemctl start docker
# nmcli
...
docker0: 接続済み to docker0
        "docker0"
        bridge, 02:42:38:75:80:FD, sw, mtu 1500
        inet4 192.168.1.1/16
        route4 192.168.0.0/16

これで172.17.x.x/16ネットワーク上のPCからでも接続できるようになる。