Dockerのコンテナに任意のIPアドレスを割り当てる方法
はじめに
Dockerのコンテナは起動すると次の2つが自動で行われます。
2つ目のIPアドレスの割当ては昇順に自動で引っ張ってきます。
しかし、手動でIPアドレスを割り当てたいケースがあります。
今回、2つ目のIPアドレスの割当てを手動で行う方法の1つを説明します。
環境と概要
概要
Pipeworkというものを使って実現していきます。
jpetazzo/pipework · GitHub
pipeworkが何なのかを説明する前に、
dockerで生成されたブリッジからコンテナに接続されたネットワークは以下の図を示します。
図から、docker0のブリッジからは172.17.0.0/24のネットワークが張られていることが分かります。各コンテナはネットワーク内のIPアドレスを自動で割り振られていきます。このとき、各コンテナのゲートウェイがdocker0になります。現時点で、Dockerはこのネットワークの割り当てを固定してあげることができません(多分)。そこで、Pipeworkを使います。
Pipeworkは、Linux Container(LXC)のためのSoftware-Defined Networking(SDN)です。PipeworkはDockerをサポートしており、Docker実現できない複雑なネットワークの設定を手助けしてくれます。ただし、Dockerの範疇でできる設定はPipeworkを利用しないことをお勧めしているので、Dockerを使う上では最後の砦として利用していきます。
Pipeworkでは、ホストとDockerコンテナを接続するためのブリッジを作ります。作成時にDockerコンテナのIPアドレスを手動で割り当てます。
Pipeworkを使って、具体的に何がしたいのかというのを、図で示します。
pipeworkはブリッジbr1を作成してDockerコンテナにeth1なるインターフェースを自動で生成しbr1と接続します。そのときにIPアドレスを割り当てられます。
作業(コマンドベース)
以下、作業に使うコマンドの一覧
- docker
- pipework
- awk(必須じゃない)
- xargs(必須じゃない)
注意:今から紹介する作業は、すでにイメージファイルがある状況を前提とします。また、確認のためsshを使うため、コンテナイメージにsshサーバーがインストールされていること、そしてrootユーザでssh接続可能であることも条件になっています。
はじめに、dockerで適当にイメージを起動します。
私はsshでDockerコンテナに接続できるようにしたいので、次のように起動しました(コマンドの詳細は割愛)。
docker run --name sample -p 22 centos6 /usr/sbin/sshd -D
次に、pipeworkでbr1とDockerコンテナのeth1を接続します(br1はpipeworkを実行すると勝手に作られます)。
流れは以下のようなコマンドを適宜実行します。
docker ps -a # ここでコンテナIDを確認する pipework br1 <コンテナのID> 192.168.1.xxx # IPアドレスを指定する
今の流れをワンライナーで実行すると、以下のようになります。
docker ps -l 1 | awk 'NR>1 {print $1}' | xargs -i{} pipework br1 {} 192.168.1.201
この時点では、まだbr1のIPアドレスが振られていません。下記コマンドでbr1のIPを割り当てます。
ip addr add 192.168.1.254/24 dev br1
sshで接続できるかどうかを確認し、できれば成功です。
ssh root@192.168.1.201