Open vSwitch(OVS)を構築したホストOS上で、ソフトウェア定義型ネットワークを実現する「pipework」を利用し、DHCPクライアントの機能を使って、Dockerコンテナに動的にIPアドレスを割り当てる手順を紹介します。
第38回では、Open vSwitch(通称OVS)を構築したホストOS上に、ソフトウェア定義型ネットワークを実現する「pipework」をインストールし、DockerコンテナにホストOSと同一LANセグメントの固定IPアドレスを割り当てる手順を紹介しました。
今回は、pipeworkの機能の1つである、DHCPクライアントの機能を使って、Dockerコンテナに動的にIPアドレスを割り当てる具体的な手順をご紹介します。
Dockerコンテナに動的IPアドレスを付与するには、DHCPサーバが1台必要になりますが、ここではこのDHCPサーバもDockerコンテナで稼働させてみましょう。今回のネットワーク構成は、以下のとおりです。
| 物理マシン | サーバ1号機 | サーバ2号機 | Linux PC |
|---|---|---|---|
| 役割 | コンテナc3の稼働 | DHCPサーバコンテナd1の稼働 | クライアント |
| ホストOS | CentOS 7.3 | CentOS 7.3 | CentOS 7.3 |
| Dockerエンジン | 17.03.0-ce | 17.03.0-ce | − |
| 稼働させるコンテナ | c3 | d1 | なし |
| ホストOSのIPアドレス | 172.16.1.161/16 | 172.16.1.162/16 | 172.16.1.163/16 |
| ホストOSのゲートウェイ | 172.16.1.1 | 172.16.1.1 | 172.16.1.1 |
| ホストOSのDNS参照先 | 172.16.1.254 | 172.16.1.254 | 172.16.1.254 |
| マシン | NIC | ブリッジ | MACアドレス | IPアドレス |
|---|---|---|---|---|
| ホストOS | eth0 | br-ex | 6C:3B:E5:50:3B:30 | 172.16.1.161/16 |
| コンテナc3 | eth0 | − | 00:01:02:03:04:07 | 動的割り当て |
| マシン | NIC | ブリッジ | MACアドレス | IPアドレス |
|---|---|---|---|---|
| ホストOS | eth0 | − | 3C:4A:92:B2:8B:64 | 172.16.1.162/16 |
| コンテナd1 | eth0 | − | − | ホストOS兼用 |
pipeworkのDHCPクライアント機能により、コンテナc3に動的IPアドレスを付与するため、サーバ2号機にDHCPサーバコンテナを稼働させます。DHCPサーバのコンテナ名は「d1」にしました。DHCPサーバコンテナは、OVS構成、または、非OVS構成のどちらのDocker環境でも稼働させられます。
OVSを設定していないDocker環境の場合、DHCPサーバコンテナは、ホストOSのIPアドレスを兼用する「ホストモード」を利用することで、サーバ2号機のホストOSと同一のLANセグメントに所属する、その他の物理マシンやDockerコンテナに、DHCPサービスを提供できます。
今回、このサーバ2号機は、OVS構成ではなく、通常のeth0のインタフェースであるため、DHCPサーバコンテナは、ホストOSとIPアドレスを兼用するホストモードの構成になります。
では、具体的に、DHCPサーバコンテナを稼働させてみます。まず、DHCPサーバコンテナを稼働させるサーバ2号機のホストOSのネットワークインタフェース名を確認します。
# ip -4 a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 172.16.1.162/16 brd 172.16.255.255 scope global eth0
valid_lft forever preferred_lft forever
...
DHCPサーバコンテナを稼働させるホストOSのNICとして、eth0がありますので、このeth0を使ってDHCPサーバコンテナ「d1」を稼働させます。DHCPサーバを実現するDockerイメージは、コミュニティによって複数公開されていますが、今回は「networkboot/dhcpd」を使用します。
DHCPサービスが稼働するDockerコンテナの事前準備として、ホストOS上の /data ディレクトリに dhcpd.conf ファイルを用意しておきます。サーバ2号機のホストOSに /data ディレクトリを作成し、以下のような dhcpd.conf ファイルを作成します。
以下は、ネットワークセグメント「172.16.0.0/16」のLANに所属するマシンに対して、動的IPアドレスを割り当てられる設定ファイルの例です。Dockerコンテナに付与する動的IPアドレスの範囲、デフォルトゲートウェイ、ネットマスク、ブロードキャストアドレス、DNSサーバ、ドメイン名などを dhcpd.conf ファイル内に適切に記述します。
dhcpd.conf ファイル内の「range 172.16.1.2 172.16.1.253」は、Dockerコンテナに対して、172.16.1.2から172.16.1.253の範囲で動的IPアドレスを付与する設定ですが、この「range」で始まる行を記述していない場合、動的IPアドレスの付与に失敗する場合がありますので、注意してください。
# mkdir /data
# vi dhcpd.conf
default-lease-time 7200;
max-lease-time 7200;
subnet 172.16.0.0 netmask 255.255.0.0 {
range 172.16.1.2 172.16.1.253; ←貸し出す動的IPアドレスの範囲
option routers 172.16.1.1; ←デフォルトゲートウェイを設定
option subnet-mask 255.255.0.0; ←サブネットマスク
option broadcast-address 172.16.255.255; ←ブロードキャストアドレス
option domain-name-servers 172.16.1.254; ←DNSサーバのIPアドレス
option domain-name "jpn.linux.hpe.com";
option domain-search "jpn.linux.hpe.com";
}
ホストOSの /data ディレクトリに dhcpd.conf ファイルを配置したら、DHCPサーバコンテナ「d1」を起動します。
# docker run \ -itd \ --net=host \ ←ホストベースのネットワークを使用 -v /data:/data \ ←ホストOSの/dataディレクトリをコンテナd1の/dataに関連付ける --name d1 \ ←DHCPサーバコンテナ名 -h d1 \ ←DHCPサーバコンテナのホスト名 networkboot/dhcpd eth0 ←DHCPサーバコンテナが稼働するホストOSのNIC(eth0)を指定
第38回 pipeworkでDockerコンテナに固定IPアドレスを付与する(構築編その1)
第37回 Dockerでソフトウェア定義型ネットワーキングツール「pipework」を活用する
第35回 Open vSwitchで作るDockerのネットワーク(OVSで構築する編)
第36回 Open vSwitchで作るDockerのネットワーク(OVSを管理する編)Copyright © ITmedia, Inc. All Rights Reserved.