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

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

nsenterを使った固定IPアドレスの再設定

 docker networkにより、独自のコンテナ用のネットワーク(本連載の例では、mynet1)を作成すれば、docker run時の「--ipオプション」によりコンテナに固定IPアドレスを付与することができました。しかし先程(前ページ)の方法のように、コンテナ用のネットワークを作成していない場合は、コンテナ起動時に「--ip」オプションによる固定IPアドレスの付与ができません。独自のコンテナ用のネットワークが存在しない環境で、コンテナに固定IPアドレスを付与することはできないのでしょうか。

 少し裏技のような感じになりますが、実はコンテナ用のネットワークが存在しない環境でも、ホストOS上にインストールしたnsenter(Name Space Enter)と呼ばれるコマンドで、コンテナ起動後にIPアドレスを再設定することができます。

 nsenterは、1つあるいは複数のプロセス群の名前空間に入り、そこで特定のプログラムを実行させることができます。nsenterを使えば、稼働中のDockerコンテナへの接続や、コンテナが持つIPアドレスなどのパラメータの変更が可能です。docker execが存在しない古いDocker環境では、稼働中のコンテナに入る方法として、nsenterが利用されていました。nsenterは、コンテナ環境に限らず、別の名前空間に入る、あるいは、プロセス(コンテナ)の設定を変更するためのコマンドとして古くから利用されています。

 やや話はそれますが、nsenterの具体例を挙げます。以下は、「docker exec」を使わずに、nsenterを使ってCentOS 6.8のコンテナ「c68test01」に入る例です。


# docker run -itd --name c68test01 centos:6.8 /bin/bash
# PID=$(docker inspect --format {{.State.Pid}} c68test01)
# nsenter --target $PID --mount --uts --ipc --net --pid
[root@ef3c12f9d9a5 /]# export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
[root@ef3c12f9d9a5 /]# cat /etc/redhat-release
CentOS release 6.8 (Final) ←コンテナc68test01のOSバージョンを確認
[root@ef3c12f9d9a5 /]#

 上記のように、nsenterを使うことで、指定したプロセスの名前空間に入る――すなわち、「コンテナに入る」ことができます。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ