第39回 DHCPとpipeworkでDockerコンテナに動的IPアドレスを付与する(構築編その2)古賀政純の「攻めのITのためのDocker塾」(1/2 ページ)

Open vSwitch(OVS)を構築したホストOS上で、ソフトウェア定義型ネットワークを実現する「pipework」を利用し、DHCPクライアントの機能を使って、Dockerコンテナに動的にIPアドレスを割り当てる手順を紹介します。

» 2017年03月31日 11時00分 公開

 第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

サーバ1号機のネットワーク構成(Open vSwitch(OVS)を構成)
マシン 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 動的割り当て

サーバ2号機のネットワーク構成(OVSがないホストモード構成)
マシン NIC ブリッジ MACアドレス IPアドレス
ホストOS eth0 3C:4A:92:B2:8B:64 172.16.1.162/16
コンテナd1 eth0 ホストOS兼用
図. Dockerコンテナに動的IPアドレスを付与するシステム構成 図. Dockerコンテナに動的IPアドレスを付与するシステム構成

DHCPサーバコンテナを起動する

 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)を指定
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ