Docker0 ブリッジのカスタマイズ

このセクションでは Docker のデフォルト・ブリッジをどのようにカスタマイズするか説明します。bridge という名称の bridge ネットワークは、Docker インストール時に自動的に作成されるものです。

注釈

Docker ネットワーク機能 を使えば、デフォルト・ブリッジ・ネットワークに加え、自分で定義したネットワークも作成できます。

デフォルトでは、Docker サーバはホスト・システム上の docker0 インターフェースを Linux カーネル内部の イーサネット・ブリッジ (Ethernet bridge) として設定・作成します。1つのイーサネット・ネットワークとして振る舞い、パケットの送受信や、別の物理ないし仮想ネットワーク・インターフェースに転送します。

Docker は docker0 の IP アドレス、ネットマスク、IP 割り当て範囲(レンジ)を設定します。ホストマシンはブリッジに接続されたコンテナに対するパケットの送受信が可能です。そして、 MTU ( maximum transmission unit )の指定値や、インターフェースが扱えるパケット値の超過を指定する値は、Docker ホスト上のデフォルトでルーティングされるインターフェース値からコピーされます。これらのオプションはサーバ起動時に設定可能です。たとえば、 --bip-CIDERbridge0 ブリッジに対して特定の IP アドレスとネットマスクを指定、ここでは 192.168.1.5/24 のような通常の CIDR で指定するものです。

  • --fixed-cidr=CIDRdocker0 サブネットが使い 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 ホストはコンテナのパケットをインターネット側に転送できないので注意してください。詳細については 外の世界との通信 をご覧ください。