それでは実際に、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であることが分かります。
次に、現時点で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
第29回 Docker Networkingの基礎知識 標準的なネットワークを理解する
第30回 Docker Swarmを知る 複数の物理サーバでDocker環境をクラスタ化する方法
第31回 Docker Swarmクラスタのオーバレイネットワークを構築する方法Copyright © ITmedia, Inc. All Rights Reserved.