第33回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(後編):古賀政純の「攻めのITのためのDocker塾」(2/4 ページ)
引き続き、「Swarmクラスタ」を使わずに複数の物理サーバで稼働するDockerコンテナ同士を通信させる方法について紹介します。前編ではコンテナ用のネットワーク「mynet1」を用いる方法を取り上げましたが、後編ではこれを使わない方法も取り上げてみたいと思います。
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を使うことで、指定したプロセスの名前空間に入る――すなわち、「コンテナに入る」ことができます。
関連記事
- 第29回 Docker Networkingの基礎知識 標準的なネットワークを理解する
引き続きDocker環境におけるネットワーキングの基礎を解説します。今回は、Dockerでの標準的なネットワークを例に、手順を交えながらその構成がどうなっているのかを理解していきましょう。 - 第30回 Docker Swarmを知る 複数の物理サーバでDocker環境をクラスタ化する方法
複数の物理サーバで稼働するDockerコンテナ同士が通信するには、どうすればよいのでしょうか。そのためには、Docker特有のコンポーネントを理解する必要があります。今回は、Docker環境のネットワーキングを実現するソフトウェアコンポーネントと具体的なコンテナ間の通信方法を紹介します。 - 第31回 Docker Swarmクラスタのオーバレイネットワークを構築する方法
複数の物理サーバで稼働するコンテナ同士の通信を可能にするには、Docker Swarmを用いたオーバレイネットワークを構築します。前回はその概要について解説しましたが、今回はこの環境を構築する方法を紹介します。 - 【古賀政純の「攻めのITのためのDocker塾」】バックナンバー
Copyright © ITmedia, Inc. All Rights Reserved.