タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【Docker】Bridge IPアドレスの変更でハマる

DockerネットワークのホストOS側のIPアドレスは、デフォルトでは「172.17.42.1/16」のIPアドレス(bridge IPアドレス)が割り当てられます。
(※追記: Docker1.11.2で試したところ、172.17.42.1ではなく、172.17.0.1/16のIPアドレスとなりましたでした。)


この物語は、そのIPアドレスを変更したく、Dockerトーシローとして悪戦苦闘し、何度も何度も困難に立ち向かった(ただ無知なだけという話もあるが)戦いの記録である・・・(TVドラマ『スクール☆ウォーズ』のイントロ風に読んでください)。

検証1

(1) Dockerネットワーク現状確認

まずは、Docker起動中のネットワークを確認。

$ ifconfig
docker0   Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0 
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:164998 errors:0 dropped:0 overruns:0 frame:0
          TX packets:200582 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:219239813 (209.0 MiB)  TX bytes:153663854 (146.5 MiB)
:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
link-local      *               255.255.0.0     U     1002   0        0 eth0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 docker0 <<<<<<<<<<<<

確かに、172.17.0.0/16のネットワークが構成されています。

(2) Docker起動時のbipアドレスの設定

  • 初期 bipアドレスを「192.168.100.1/24」へ変更する設定例は、下記の通りです。

Docker停止

# service docker stop
docker を停止中:                                           [  OK  ]

「/etc/sysconfig/docker」を編集

# vim /etc/sysconfig/docker

#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d

other_args="--bip=192.168.100.1/24"   <-- 編集

(3) Docker起動

# service docker start
Starting docker:                                           [  OK  ]

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0    *              255.255.255.0   U     0      0        0 docker0 <<<<<<
link-local       *              255.255.255.0   U     1002   0        0 eth0
192.168.1.0      *              255.255.255.0   U     0      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

Serverを再起動しても、bipは指定した通りに起動してくれました!


検証2

(1) Dockerネットワーク現状確認

# ip addr show
:
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:3aff:fef8:662/64 scope link
       valid_lft forever preferred_lft forever

(2) Docker起動時のbipアドレスの設定

  • 検証1と同じく、初期 bipアドレスを「192.168.100.1/24」へ変更します。

Docker停止

# systemctl stop docker

「/usr/lib/systemd/system/docker.service」を編集

# vim /usr/lib/systemd/system/docker.service
:
ExecStart=/usr/bin/dockerd                            // before
ExecStart=/usr/bin/dockerd --bip=192.168.100.1/24     // after

(3) Docker起動

# systemctl daemon-reload

# systemctl start docker

# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.100.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether xx:xx:xx:xx:xx:xx  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

こちらも、Serverを再起動しても、bipは指定した通りに起動してくれました!


今回は、かなりハマってしまいました。。。
ブリッジIPアドレスの認識も甘く、自分でbipのインタフェースの設定ファイルを作ったり、「brctl addbr」コマンドでブリッジを作成してしまったりと、うまく制御させることができませんでした・・・。

結果、サービスの起動ファイルにOPTIONを付加するというシンプルな形に落ち着きました。

今回もまた、「基本を知れ!」という教訓を得ることとなりましたとさ。