環境
- Dockerホストマシン: CentOS 7.2
- Docker : version 1.12
経緯
Dockerのデフォルトのネットワークdocker0
には初期設定だと172.17.0.0/16
が設定されます。
今回Dockerホストマシンのネットワークアドレス帯に172.x.0.0/16
を使っていたため、Dockerホストマシンにアクセス出来ない問題が発生していたのでdocker0
の設定を変更する必要がありました。
やったこと
1.Dockerの停止とネットワークの確認・破棄
Dockerが起動している場合にはDockerサービスを停止させます。
$ sudo systemctl stop docker
$ sudo systemctl status docker
Dockerサービスが停止しているのを確認したら、現在のホストマシンのネットワーク設定を確認してみます。
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
gateway 0.0.0.0 255.255.255.255 UH 100 0
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024249a6703e no veth089452c
Dockerサービスを再起動するときのために一旦docker0
のブリッジを破棄しておきます。
$ ip link set dev docker0 down
$ brctl delbr docker0
2.Docker起動時のオプション設定
ホストマシンがCentOS7なのでDockerはsystemd管理下にあります。
Dockerの起動時のオプションを設定するために/lib/systemd/system/docker.service
のExecStart
設定を変更します
Service
の設定内に--bip
オプションを追記します。IPは都合のいい値に自由に変更できます。(ただしホストマシンのネットワークで使用していないIPに限ります。)
[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
↓
[Service]
Type=notify
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--bip=182.17.0.1/16 \
(追記)
/lib/systemd/system/docker.service
を変更するのちょっと気持ち悪かったので別の方法探していたら/etc/sysconfig/docker
に設定するのがよさそうでした。
下記のように追記すると上の方法と同じようにIPアドレスを変更できます。
OPTIONS="--bip=180.17.0.1/16"
3.Dockerの起動
Dockerを起動させます。 起動時のオプションを変更したのでdaemonを読み込み直しておきます。
$ sudo systemctl daemon-reload
$ sudo systemctl start docker
Dockerの起動後、設定した内容が反映されているか確認します。
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eth0
180.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
gateway 0.0.0.0 255.255.255.255 UH 100 0 0 eth0
注意点
起動オプションで設定出来るのはいまのところdocker0
の設定だけのようです。
docker network create
実行時のIPアドレスの範囲を指定しておきたかったのですがいい方法が見つかりませんでした。
新しく自分でネットワーク作る際にIPアドレスなどを指定するコマンドは下記になります。
docker network create --driver [brige|hostなど] --gateway=[IPアドレス] --subnet=[IPアドレス] [ネットワーク名]
$ docker network create --driver bridge --gateway=180.18.0.1/16 --subnet=180.18.0.0/16 default_network
https://github.com/docker/docker/pull/29376
このようなPRが出ているのでそのうち実装されそうな気がしてます。