第40回 pipeworkでDockerコンテナの送信帯域幅制御を行う(構築編その3)古賀政純の「攻めのITのためのDocker塾」(1/2 ページ)

今回は、ソフトウェア定義型ネットワークを実現する「pipework」を使って、Dockerコンテナのネットワーク帯域幅を制御する具体的な手順をご紹介します。

» 2017年04月07日 10時00分 公開

 第39回では、ソフトウェア定義型ネットワークを実現する「pipework」のDHCPクライアント機能により、Dockerコンテナに動的IPアドレスを割り当てる手順をご紹介しました。今回は、pipeworkを使ったDockerコンテナのネットワーク帯域幅制御の手順をご紹介します。

 コンテナからの送信帯域幅制御ができているかを確認するには、Webサーバコンテナに100Mバイトのファイル「testfile」を用意し、このtestfileをクライアントからwgetコマンドで入手するときの速度を測るのが簡単です。Webサーバが動作しているDockerコンテナが提供する、testfileを入手する際の伝送速度をクライアント側で確認し、pipeworkによるコンテナの送信帯域幅制御が機能しているかを判断します。

 このため、テスト環境はWebサーバコンテナが稼働するサーバが1台と、Webサーバが提供するtestfileの入手を行うクライアントの2台で構成します。Dockerコンテナのネットワーク通信に関する帯域幅制御を行うシステム構成は、以下のとおりです。

ネットワーク構成
物理マシン サーバ1号機 Linux PC
役割 Webサーバーコンテナc4の稼働 クライアント
ホストOS CentOS 7.3 CentOS 7.3
Dockerエンジン 17.03.0-ce
稼働させるコンテナ c4 なし
ホストOSのIPアドレス 172.16.1.161/16 172.16.1.163/16
ホストOSのゲートウェイ 172.16.1.1 172.16.1.1
ホストOSのDNS参照先 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
コンテナc4 eth0 00:01:02:03:04:08 172.16.1.94/16
図. Dockerコンテナの送信帯域幅制御を行うシステム構成 図. Dockerコンテナの送信帯域幅制御を行うシステム構成

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

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

 まずは、ネットワークインタフェースを付与しない状態でコンテナc4を起動します。

# docker run \
-itd       \
--name=c4  \
-h c4      \
--net=none \
centos:6.8 \
/bin/bash

 コンテナc4が起動したら、pipeworkにより、固定IPアドレス「172.16.1.94/16」を付与します。以下は、OVSブリッジ「br-ex」が利用可能なホストOSにおいて、稼働中のコンテナc4に、「eth0」という仮想NICに動的IPアドレスを割り当て、MACアドレスとして「00:01:02:03:04:08」を設定する例です。

# pipework \
br-ex \ ←ホストOSのOVSブリッジインタフェース
-i eth0 \ ←コンテナ内に作成する仮想NIC
c4 \ ←コンテナ名
dhclient \ ←pipeworkが提供するDHCPクライアント機能を利用
00:01:02:03:04:08 ←コンテナc3のeth0に割り当てるMACアドレス

 これでコンテナc4に、172.16.1.94/16の固定IPアドレスが付与されましたので、サーバ1号機で稼働するコンテナc4のIPアドレスとMACアドレスを確認します。

# docker exec -it c4 ifconfig eth0 |head -2
eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:08
          inet addr:172.16.1.94  Bcast:172.16.255.255  Mask:255.255.0.0

 次に、コンテナc4をWebサーバにするために、httpdパッケージをインストールします。プロキシサーバ経由でインターネットにアクセスする場合は、Dockerコンテナ内の /etc/yum.conf ファイルにプロキシサーバの設定を行っておきます。以下では、分かりやすいようにコンテナc4のコマンドプロンプトを「c4 #」で表すとします。

# docker exec -it c4 /bin/bash
c4 # echo "proxy=http://proxy.your.site.com:8080" >> /etc/yum.conf
c4 # yum install -y httpd

 コンテナc4で、httpdサービスを稼働させます。

c4 # service httpd start
c4 # ps -ef |grep httpd |grep -v grep
root       160     0  0 09:02 ?        00:00:00 /usr/sbin/httpd
apache     162   160  0 09:02 ?        00:00:00 /usr/sbin/httpd
apache     163   160  0 09:02 ?        00:00:00 /usr/sbin/httpd
...

 httpdサービスが立ちあがったら、コンテナc4上に100Mバイトのtestfileを用意します。

c4 # dd if=/dev/zero of=/var/www/html/testfile bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.170172 s, 616 MB/s
c4 # ls -lh /var/www/html/testfile
-rw-r--r-- 1 root root 100M Mar  8 09:04 /var/www/html/testfile

 以上で、コンテナc4のWebサービスとtestfileが用意できましたので、ホストOSのコマンドプロンプトに戻ります。

c4 # exit 
# 
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ