第32回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(前編)古賀政純の「攻めのITのためのDocker塾」(2/3 ページ)

» 2016年12月14日 08時00分 公開

ホストOSと同一LANに所属するブリッジネットワークの作成

 それでは実際に、NATを使わずにDockerコンテナをホストOSと同一LANに所属させる手順を解説します。今回構成するネットワーク構成は、以下のとおりです。

ホストA docker1 docker0
IPアドレス 172.16.44.254/16 172.17.0.1/16(使用せず)
コンテナ用ネットワーク名 mynet1 -
コンテナ用のセグメント 172.16.0.0/16 -

ホストB docker1 docker0
IPアドレス 172.16.44.253/16 172.17.0.1/16(使用せず)
コンテナ用ネットワーク名 mynet2 -
コンテナ用のセグメント 172.16.0.0/16 -

 話を簡単にするため、ホストOSのブリッジインタフェースは「docker1」のみを使用し、Dockerエンジンがデフォルトで使用する「docker0」は使わない構成とします。また、ホストOSは、CentOS 7.2を想定します。以下では、ホストAについて解説します。まずは、ホストOS上のブリッジインタフェース「docker1」の設定ファイルを作成します。この設定ファイルには、ホストOSの固定IPアドレスを割り当てます。「docker1」のIPアドレスとして172.16.44.254/16を割り当てます。


# vi /etc/sysconfig/network-scripts/ifcfg-docker1
DEVICE="docker1" ←独自のブリッジインタフェースを作成
BOOTPROTO="none"
NM_CONTROLLED="no" ←NetworkManagerで制御しない
ONBOOT="yes" ←ホストOS起動時に自動的にインタフェースを有効にする
TYPE="Bridge" ←種別はブリッジ
IPADDR="172.16.44.254" ←ブリッジdocker1に付与するIPアドレス
NETMASK="255.255.0.0" ←ブリッジdocker1に付与したIPアドレスに対するネットマスク
GATEWAY=172.16.1.1 ←ブリッジdocker1のデフォルトゲートウェイのIPアドレス
DNS1=172.16.1.1 ←DNSサーバーのIPアドレス

 ブリッジインタフェース「docker1」に対応するNICの設定ファイル「ifcfg-eth0」を作成します。以下の設定例のように、ブリッジインタフェース「docker1」に対応するeth0のMACアドレス(HWADDR行)を明示的に指定する必要がありますので、注意してください。


# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 ←デバイス名
BOOTPROTO=static
HWADDR="52:54:00:34:83:35" ←eth0のMACアドレスを記述 
ONBOOT=yes ←ホストOS起動時に自動的にインタフェースを有効にする
TYPE=Ethernet←種別はイーサネット
BRIDGE="docker1" ←対応するブリッジインタフェースを指定

 設定ファイルifcfg-docker1とifcfg-eth0が作成できたら、ホストOSを再起動します。


# reboot

 ホストOS再起動後、docker1にIPアドレスが正しく割り当てられているかを確認します。


# ip -4 a
...
4: docker1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    inet 172.16.44.254/16 brd 172.16.255.255 scope global docker1
       valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

 この時点で、ホストOSのブリッジの設定状況を確認しておきます。ブリッジの設定状況は、brctlコマンドで確認することができます。


# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242e33d590d       no
docker1         8000.525400348335       no              eth0

 上記の結果から、ブリッジ「docker1」に対応するNICは、ホストOSが稼働する物理サーバのeth0であることが分かります。

コンテナ用ネットワーク「mynet1」の作成

 次に、現時点でDockerエンジンが管理しているネットワークを確認します。


# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7a4860b5a107        bridge              bridge              local
e03c2b8fd288        host                host                local
4b3a1c4185c8        none                null                local

 上記より、まだコンテナ用のネットワーク「mynet1」は存在しません。今回は、docker1のブリッジインタフェースに割り当てられているIPアドレスである172.16.44/254と同一LANセグメントに所属するコンテナ用ネットワーク「mynet1」を作成します。mynet1は、172.16.0.0/16のLANセグメントになります。


# docker network create \
> --driver bridge \
> --subnet=172.16.0.0/16 \
> --gateway=172.16.44.254 \
> --aux-address "DefaultGatewayIPv4=172.16.1.1" \
> --opt "com.docker.network.bridge.name"=docker1 \
> mynet1
92b40f71016eaeebe9e6f4d14af057f52b3439aac0f679d463f511d0b8045ac7

 「docker network create」は、コンテナ用のネットワークを作成しますが、オプションでコンテナ用ネットワークのドライバ(上記の場合はブリッジ)、サブネット、ゲートウェイとなるホストOSのブリッジインタフェースのIPアドレス、ホストOSのデフォルトゲートウェイ、使用するブリッジインタフェース名などを指定します。

 作成したmynet1の状態は、「docker network ls」で確認します。「mynet1」がブリッジネットワークとして存在することが分かります。


# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
fe88f418f9cc        bridge              bridge              local
e03c2b8fd288        host                host                local
92b40f71016e        mynet1              bridge              local
4b3a1c4185c8        none                null                local

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ