第38回 pipeworkでDockerコンテナに固定IPアドレスを付与する(構築編その1):古賀政純の「攻めのITのためのDocker塾」(2/2 ページ)
ソフトウェア定義型ネットワークを実現する「pipework」のコンテナを実際に使って、ホストOSとDockerコンテナを同一LANセグメントに所属させることで、マルチホストのコンテナ間通信を行う手順を解説します。
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実践入門」などがある。趣味はレーシングカートとビリヤード。古賀氏の最新記事が読めるブログはこちら。
関連記事
- 第37回 Dockerでソフトウェア定義型ネットワーキングツール「pipework」を活用する
前回まで、3回に渡ってOpenStackでも利用されているソフトウェア定義型ネットワーキングを実現するOpen vSwitch(OVS)とovs-dockerを使ってホストOSとコンテナを同一LANセグメントに所属させ、マルチホストのコンテナ間通信を実現しました。今回は、Docker基盤で古くから利用されている「pipework」を使ったネットワーキングをご紹介します。 - 第32回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(前編)
複数の物理サーバで稼働するDockerコンテナ同士を通信させるには「Swarmクラスタ」を使います。実はSwarmクラスタを構成することなく、できる場合があります。今回からその方法を紹介していきましょう。 - 第33回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(後編)
引き続き、「Swarmクラスタ」を使わずに複数の物理サーバで稼働するDockerコンテナ同士を通信させる方法について紹介します。前編ではコンテナ用のネットワーク「mynet1」を用いる方法を取り上げましたが、後編ではこれを使わない方法も取り上げてみたいと思います。 - 第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.