古いバージョンのブラウザーを使用しています。MSN を最適にご利用いただくために、サポートされているバージョンをご使用ください。

第38回 pipeworkでDockerコンテナに固定IPアドレスを付与する(構築編その1)

ITmedia エンタープライズ のロゴ ITmedia エンタープライズ 2017/03/28
第38回 pipeworkでDockerコンテナに固定IPアドレスを付与する(構築編その1): 画像:ITmedia © ITmedia エンタープライズ 提供 画像:ITmedia

 今回は、前回紹介したソフトウェア定義型ネットワークを実現する「pipework」のコンテナを実際に使って、ホストOSとDockerコンテナを同一LANセグメントに所属させることで、マルチホストのコンテナ間通信を行ってみます。

 pipeworkを使って、ホストOSと同一LANセグメントの固定IPアドレスをDockerコンテナに付与する手順は以下のとおりです。

1. ホストOSにOpen vSwitchをインストールし、OVSブリッジを構成

2. Dockerエンジンのインストール

3. pipeworkをインストール

4. ネットワークインタフェースを付与せずに、Dockerコンテナを稼働

5. pipeworkコマンドで、Dockerコンテナに固定IPアドレスを付与

6. 同一LANセグメント内のクライアントからの疎通確認

 OSは、CentOS 7.3を想定します。また、Dockerエンジンは、2017年3月時点での最新バージョンである「17.03.0-ce」(Docker エンジンのコミュニティエディション)を使用しています。ネットワーク構成は、以下のとおりです。

 今回は、pipeworkを使って、コンテナc1とコンテナc2に固定IPアドレスを付与します。そして、コンテナc2にWebサーバをインストールし、コンテナc1と、同一LANセグメント上のクライアントマシンなどから、コンテナc2が提供するテスト用のWebコンテンツにアクセスできるかどうかをテストします。

●pipeworkを稼働させる

 pipework稼働の前提条件として、連載第35回で紹介した内容を元に、ホストOSにOpen vSwitch(OVS)とDockerエンジンをインストールしておいてください(※)。

●※補足

連載の第35回では、OVSをインストールするにあたり、2017年1月時点でのOpenStackコミュニティのバージョン「Newton」に対応したリポジトリを追加する方法を紹介しましたが、2017年3月時点では、以下のように、OpenStackの最新バージョン「Ocata」に対応したリポジトリを追加することで、OVSの最新パッケージをインストールできます。

# yum install -y \ https://repos.fedorapeople.org/repos/openstack/openstack-ocata/rdo-release-ocata-2.noarch.rpm

 まずは、物理サーバの1号機と2号機のホストOSにpipeworkをインストールします。curlコマンドで入手しますので、プロキシサーバ経由でインターネットにアクセスする場合は、以下のように事前にhttp_proxyやhttps_proxyの環境変数をセットしてください。

# export http_proxy=http://proxy.your.site.com:8080

# export https_proxy=http://proxy.your.site.com:8080

# curl -sL https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework > /usr/local/bin/pipework

# file /usr/local/bin/pipework

/usr/local/bin/pipework: POSIX shell script, ASCII text executable

# chmod +x /usr/local/bin/pipework

# ls -l /usr/local/bin/pipework

# which pipework

/usr/local/bin/pipework

 また、pipeworkの動作に必要なパッケージもホストOS上にインストールしておきます。

# yum install -y iproute

 以上で、pipeworkコマンドをホストOSにインストールすることができました。

●pipeworkを使った固定IPアドレスをDockerコンテナの起動

 では物理サーバの1号機で、CentOS 6.8ベースのコンテナc1を稼働させるため、CentOS 6.8のOSテンプレートイメージを入手します。

# docker pull centos:6.8

# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos 6.8 0cd976dc0a98 4 months ago 194.5 MB

 コンテナc1を起動します。pipeworkコンテナを使った固定IPアドレスの付与では、ovs-dockerと同様に、コンテナにネットワークインタフェース(仮想NIC)が自動的に付与されないように、「--net=none」を指定します。

# docker run \

-itd \

--name=c1 \

-h c1 \

--net=none \

centos:6.8 \

/bin/bash

 これでコンテナc1が起動しましたが、IPアドレスはまだ付与されていません。起動したコンテナc1に固定IPアドレス「172.16.1.91/16」を割り当ててみます。ホストOS上からpipeworkコマンドで以下のように入力します。

# pipework \

br-ex \ ←ホストOSのOVSブリッジインタフェース

-i eth0 \ ←コンテナ内に作成する仮想NIC

c1 \ ←コンテナ名

172.16.1.91/16@172.16.1.1 \ ←c1に割り当てる固定IPアドレス、デフォルトゲートウェイ

00:01:02:03:04:05 ←c1のeth0に割り当てるMACアドレス

 コンテナc1にIPアドレスが付与されているかどうかを確認します。

# docker exec -it c1 ifconfig eth0 |head -2

eth0 Link encap:Ethernet HWaddr 00:01:02:03:04:05

inet addr:172.16.1.91 Bcast:172.16.255.255 Mask:255.255.0.0

 この時点で、コンテナc1(172.16.1.91/16)に所属するホストOS以外の外部のクライアントからpingで疎通確認をしてください。

client $ ping -c 3 172.16.1.91

●Webサーバーコンテナの起動

 物理サーバ1号機と同様に、物理サーバ2号機でも、コンテナc2(ホスト名は、c2)を起動します。IPアドレス、デフォルトゲートウェイ、MACアドレスをpipeworkにより明示的に設定して、コンテナc2を起動しますが、今回は、Webサーバーをコンテナc2内で稼働させますので、2号機のホストOS上でDockerfileを作成し、Webサーバ入りのDockerイメージを作成しておきましょう。以下のDockerfileの2行目と3行の「ENV」で始まる行では、プロキシサーバを経由してインターネットにアクセスする場合に必要なhttp_proxyとhttps_proxyを設定しています。プロキシサーバを利用していない環境では、以下のDockerfile内の2行目と3行目は不要ですので、それらを除いたDockerfileを作成してください。

# mkdir /root/c2

# cd /root/c2

# vi Dockerfile

FROM centos:6.8 ←CentOS 6.8のOSテンプレートを使ってDockerイメージを作成

ENV http_proxy http://proxy.your.site.com:8080 ←自社のプロキシ・サーバの設定

ENV https_proxy http://proxy.your.site.com:8080 ←自社のプロキシ・サーバの設定

RUN yum install -y httpd iproute パッケージのインストール

RUN echo "Hello pipework." > /var/www/html/test.html ←Webコンテンツを配置

CMD httpd -DFOREGROUND ←コンテナ起動時に自動的にWebサービスを起動

 作成したDockerfileを元に、Webサーバ入りのDockerイメージをビルドします。Dockerイメージ名は、「c68:websvr」としました。

# pwd

/root/c2

# docker build -f ./Dockerfile -t c68:websvr .

 ビルドしたDockerイメージを確認します。

# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

c68 websvr b1b27960745d 18 seconds ago 311 MB

 作成したDockerイメージ「c68:websvr」からDockerコンテナ「c2」を起動します。

# docker run \

-itd \

--name=c2 \

-h c1 \

--net=none \

c68:websvr

 コンテナc1と同様に、pipeworkを使ってコンテナc2に固定IPアドレスを付与しま

# pipework \

br-ex \ ←ホストOSのOVSブリッジインタフェース

-i eth0 \ ←コンテナ内に作成する仮想NIC

c2 \ ←コンテナ名

172.16.1.92/16@172.16.1.1 \ ←c2に割り当てる固定IPアドレス、デフォルトゲートウェイ

00:01:02:03:04:06 ←このc2のeth0に割り当てるMACアドレス

 コンテナc2のIPアドレスを確認します。

# docker exec -it c2 ifconfig eth0 |head -2

eth0 Link encap:Ethernet HWaddr 00:01:02:03:04:06

inet addr:172.16.1.92 Bcast:172.16.255.255 Mask:255.255.0.0

 以上で、固定IPアドレスが付与されたコンテナc1とc2が稼働しました。クライアントからコンテナc2が提供するWebコンテンツtest.htmlが閲覧できれば成功です。

client $ export http_proxy=""

client $ export http_proxy=""

client $ export no_proxy="172.16.1.92"

client $ curl http://172.16.1.92/test.html

Hello pipework.

 以上で、ホストOSと同一LANセグメントに所属するコンテナc1、コンテナc2を作成し、コンテナc2が提供するWebコンテンツtest.htmlをコンテナc1とクライアントから閲覧することができました。

 次回は、pipeworkの機能の1つであるDHCPクライアントの機能を使って、Dockerコンテナに動的IPアドレスを割り当てる具体的な手順を紹介します。

●古賀政純(こがまさずみ)

日本ヒューレット・パッカード オープンソース・Linuxテクノロジーエバンジェリスト。兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師、SIを経験。2006年、米国ヒューレット・パッカードからLinux技術の伝道師として「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。プリセールスMVPを4度受賞。現在は日本ヒューレット・パッカードにて、Hadoop、Spark、Docker、Linux、FreeBSDなどのサーバー基盤のプリセールスSE、文書執筆を担当。日本ヒューレット・パッカードが認定するオープンソース・Linux テクノロジーエバンジェリストとして、メディアでの連載記事執筆、講演活動なども行っている。Red Hat Certified Virtualization Administrator, Novell Certified Linux Professional, Red Hat Certified System Administrator in Red Hat OpenStack, Cloudera Certified Administrator for Apache Hadoopなどの技術者認定資格を保有。著書に「OpenStack 実践ガイド」「Docker 実践ガイド」「CentOS 7実践ガイド」「Ubuntu Server実践入門」などがある。趣味はレーシングカートとビリヤード。

ITmedia エンタープライズの関連記事

image beaconimage beaconimage beacon