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