第29回 Docker Networkingの基礎知識 標準的なネットワークを理解する古賀政純の「攻めのITのためのDocker塾」(4/5 ページ)

» 2016年09月21日 08時00分 公開

Dockerコンテナに割り当てられるIPアドレスを調べる

 次に、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.

注目のテーマ