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/