次に、docker0ブリッジネットワークに所属するDockerコンテナに割り当てられているIPアドレスを確認してみましょう。まずは、CentOS 7.2のOSテンプレートイメージからdockerコンテナを起動します。コンテナ名は「test01」としました。
# docker run -itd --name test01 centos:centos7.2.1511 /bin/bash
起動したDockerコンテナtest01のIPアドレスを確認してみます。
# docker exec -it test01 /bin/bash [root@1c8ff583d95f /]# export http_proxy=http://proxy.yoursite.com:8080 ←プロキシサーバの設定 [root@1c8ff583d95f /]# yum install -y iproute ←ipコマンドのインストール [root@1c8ff583d95f /]# ip a ←ipコマンドでDockerコンテナに付与されたIPアドレスを確認 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo ... 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 ←付与されたIPアドレス ...
Dockerコンテナtest01に、172.17.0.2/16が自動的に割り当てられていることが分かります。ホストOS上で提供されるNATにより、172.17.0.0/16に所属するDockerコンテナが送信するパケットは、ホストOSのeth0を経由して外部と通信することになります。
Dockerコンテナが起動した状態で、ホストOSのネットワークはどんな状態でしょうか。ホストOSで再び「ip a」を入力してみてください。
# ip a ... 7: vethc06ae92@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 76:ab:10:43:ae:91 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::74ab:10ff:fe43:ae91/64 scope link valid_lft forever preferred_lft forever
すると、先ほどのDockerホスト上で確認した出力に加え、なにやら新たに「vethXXXXXXXXXX」というインタフェースが生成されていると思います。このインタフェースは、「バーチャルイーサネット」(Virtual Ethernet、通称veth)と呼ばれる、Dockerコンテナ内のeth0と通信を行うための仮想的なレイヤ2のインタフェースです。Dockerコンテナ側のeth0とveth同士は、仮想的なスイッチを経由せずにLANケーブルで直接接続されていると考えて差し支えありません。Dockerコンテナが生成されるたびに、eth0と直結の内部的な仮想インタフェースのvethが生成されます。
では、このホストOS上に現れたvethは、どのインタフェースと接続されているのでしょうか。Dockerコンテナのeth0は、docker0ブリッジを経由して外部にアクセスできます。しかし、Dockerコンテナが生成されるたびにホストOS上にvethが生成され、しかもvethは、Dockerコンテナ内のeth0と直結です。実は、Dockerコンテナ側のeth0がdocker0を経由して外部とアクセスするには、Dockerコンテナ側のeth0がホストOS上のvethと接続し、さらにvethがdocker0と接続されていないと、外部とは通信できません。すなわち、docker0ブリッジインタフェースは、vethと接続されている必要があります。
Copyright © ITmedia, Inc. All Rights Reserved.