Docker0 ブリッジのカスタマイズ¶
このセクションでは Docker のデフォルト・ブリッジをどのようにカスタマイズするか説明します。bridge
という名称の bridge
ネットワークは、Docker インストール時に自動的に作成されるものです。
注釈
Docker ネットワーク機能 を使えば、デフォルト・ブリッジ・ネットワークに加え、自分で定義したネットワークも作成できます。
デフォルトでは、Docker サーバはホスト・システム上の docker0
インターフェースを Linux カーネル内部の イーサネット・ブリッジ (Ethernet bridge) として設定・作成します。1つのイーサネット・ネットワークとして振る舞い、パケットの送受信や、別の物理ないし仮想ネットワーク・インターフェースに転送します。
Docker は docker0
の IP アドレス、ネットマスク、IP 割り当て範囲(レンジ)を設定します。ホストマシンはブリッジに接続されたコンテナに対するパケットの送受信が可能です。そして、 MTU ( maximum transmission unit )の指定値や、インターフェースが扱えるパケット値の超過を指定する値は、Docker ホスト上のデフォルトでルーティングされるインターフェース値からコピーされます。これらのオプションはサーバ起動時に設定可能です。たとえば、 --bip-CIDER
は bridge0
ブリッジに対して特定の IP アドレスとネットマスクを指定、ここでは 192.168.1.5/24
のような通常の CIDR で指定するものです。
--fixed-cidr=CIDR
:docker0
サブネットが使い IP 範囲を172.167.1.0/28
のような標準的な CIDR 形式で指定します。この範囲は IPv4 で固定される(例: 10.20.0.0/16 )必要があり、ブリッジの IP 範囲(docker0
あるいは--bridge
で指定 )のサブセットである必要もあります。例えば--fixed-cidr=192.168.1.0/25
を指定すると、コンテナの IP アドレスは前半の192.168.1.0/24
サブネットから割り当てられます。
--mtu=バイト数
:docker0
上の最大パケット長を上書きします。
1つまたは複数のコンテナを実行すると、ホストマシン上で brctl
コマンドを実行すると、出力の interfaces
列から、 Docker が docker0
ブリッジに適切に接続していることが分かります。次の例は、ホスト上で2つの異なったコンテナが接続しています。
# ブリッジ情報の表示
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
vethdda6
brctl
コマンドが Docker ホスト上にインストールされていなければ、Ubuntu であれば sudo apt-get install bridge-utils
でインストール可能です。
最後に、 docker0
イーサネット・ブリッジの設定は新しいコンテナを作成する度に行われます。Docker は docker run
で多らしいコンテナを実行する時、毎回ブリッジは利用可能な範囲にある空き IP アドレスを選び、コンテナの eth0
インターフェースにその IP アドレスとブリッジのネットマスクを設定します。Docker ホスト自身が IP アドレスをブリッジする設定の場合は、ブリッジにデフォルト・ゲートウェイが用いられ、各コンテナが他のインターネット環境と接続できるようになります。
# コンテナから見えるネットワーク
$ docker run -i -t --rm base /bin/bash
$$ ip addr show eth0
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::306f:e0ff:fe35:5791/64 scope link
valid_lft forever preferred_lft forever
$$ ip route
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
$$ exit
Docker はホスト側の ip_forward
システム設定が 1
でなければ、Docker ホストはコンテナのパケットをインターネット側に転送できないので注意してください。詳細については 外の世界との通信 をご覧ください。
参考
- Customize the docker0 bridge
- https://docs.docker.com/engine/userguide/networking/default_network/custom-docker0/