第33回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(後編)古賀政純の「攻めのITのためのDocker塾」(3/4 ページ)

» 2016年12月21日 08時00分 公開

実際にnsenterを使ってコンテナのIPアドレスを設定してみる

 以下に、nsenterコマンドによってコンテナに固定IPアドレスを付与する手順を示します。まずは、ホストOS側にnsenterコマンドをインストールします。nsenterコマンドは、util-linux RPMパッケージに含まれています。ホストOSは、CentOS 7.2を想定しています。


# yum install -y util-linux

 次に、コンテナを起動します。前回と同様に、Webサーバ入りのDockerイメージlarsks/thttpdを使って、コンテナtest03を起動します。


# docker run -itd --name test03 larsks/thttpd

 Webサーバ入りのコンテナtest03が起動しました。コンテナtest03のプロセスID、dockerエンジンによって自動的に割り振られたIPアドレス、ネットマスクをそれぞれシェル変数に保存します。


# PID=`docker inspect --format '{{.State.Pid}}' test03`
# IP=`docker inspect --format '{{.NetworkSettings.IPAddress}}' test03`
# MASK=`docker inspect --format '{{.NetworkSettings.IPPrefixLen}}' test03`

 上記でコンテナtest02のプロセスIDは、シェル変数「PID」に、IPアドレスはシェル変数「IP」に、そして、ネットマスクは、シェル変数「MASK」に保存されました。念のため、シェル変数の値をホストOS上で確認しておきます。


# echo $PID
11731
# echo $IP
172.16.0.2
# echo $MASK
16

 上記により、コンテナtest03には、IPアドレスとして172.16.0.2/16が自動的に割り当てられていることが分かります。固定IPアドレスを割り当てる前に、まずは現在のコンテナtest03のIPアドレスをnsenterコマンドで削除します。


# nsenter -t $PID -n ip addr del ${IP}/${MASK} dev eth0

 これでコンテナtest03のIPアドレス(172.16.0.2/16)が削除されましたので、異なる固定IPアドレスを割り当ててみます。今回は、172.16.0.3/16を割り当てることにします。


# nsenter -t $PID -n ip addr add 172.16.0.3/16 dev eth0

 デフォルトゲートウェイも設定しておきます。現在のホストOSのデフォルトゲートウェイの値をシェル変数「GW」に保存します。nsenterコマンドにより、コンテナtest03が持つネットワークインタフェースeth0に対して、シェル変数「GW」を使ってデフォルトゲートウェイを設定します。まずは、ホストOS側のデフォルトゲートウェイを確認します。


# ip route
default via 172.16.1.1 dev docker1
169.254.0.0/16 dev docker1  scope link  metric 1004
172.16.0.0/16 dev docker1  proto kernel  scope link  src 172.16.44.1

 ホストOSで設定されているデフォルトゲートウェイのIPアドレスをシェル変数「GW」に保存します。


# GW=$(ip route | awk '/default/ { print $3 }')

 シェル変数「GW」の内容を確認します。


# echo $GW
172.16.1.1

 コンテナtest03に対して、シェル変数「GW」の値を使って、デフォルトゲートウェイを設定します。


# nsenter -t $PID -n route add default gw $GW eth0

 ホストOSや外部のクライアントPCなどから、コンテナtest03に割り当てられた固定IPアドレスに対してHTTPでアクセスし、コンテナtest03が提供するテスト用のWebコンテンツにアクセスできるかを確認してください。


# curl http://172.16.0.3/
...

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ