それでは実際に、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
Copyright © ITmedia, Inc. All Rights Reserved.