24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dockerでdocker0ネットワークのIPアドレスを変更する

Last updated at Posted at 2017-02-15

環境

  • 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.serviceExecStart設定を変更します
Serviceの設定内に--bipオプションを追記します。IPは都合のいい値に自由に変更できます。(ただしホストマシンのネットワークで使用していないIPに限ります。)

docker.service

[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が出ているのでそのうち実装されそうな気がしてます。

参考にした資料

Docker公式ドキュメント
【Docker】Bridge IPアドレスの変更でハマる

24
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?