以下に、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.