第39回 DHCPとpipeworkでDockerコンテナに動的IPアドレスを付与する(構築編その2):古賀政純の「攻めのITのためのDocker塾」(1/2 ページ)
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兼用 |
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)を指定
関連記事
- 第38回 pipeworkでDockerコンテナに固定IPアドレスを付与する(構築編その1)
ソフトウェア定義型ネットワークを実現する「pipework」のコンテナを実際に使って、ホストOSとDockerコンテナを同一LANセグメントに所属させることで、マルチホストのコンテナ間通信を行う手順を解説します。 - 第37回 Dockerでソフトウェア定義型ネットワーキングツール「pipework」を活用する
前回まで、3回に渡ってOpenStackでも利用されているソフトウェア定義型ネットワーキングを実現するOpen vSwitch(OVS)とovs-dockerを使ってホストOSとコンテナを同一LANセグメントに所属させ、マルチホストのコンテナ間通信を実現しました。今回は、Docker基盤で古くから利用されている「pipework」を使ったネットワーキングをご紹介します。 - 第35回 Open vSwitchで作るDockerのネットワーク(OVSで構築する編)
Dockerでは、OpenStackなどクラウド基盤ソフトウェアでも広く採用されている「Open vSwitch」(OVS)を利用してネットワークを構築することができます。今回は、実際にOVSを利用したネットワークを構築してみましょう。 - 第36回 Open vSwitchで作るDockerのネットワーク(OVSを管理する編)
「Open vSwitch」(OVS)を利用したDockerネットワークの特徴や構築方法について解説してきました。今回は、構築したネットワークを管理するためのコマンドやツールをご紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.