備忘録、はじめました。

作業したこと忘れないようにメモっておきます。

Dockerのコンテナに任意のIPアドレスを割り当てる方法

はじめに

Dockerのコンテナは起動すると次の2つが自動で行われます。

2つ目のIPアドレスの割当ては昇順に自動で引っ張ってきます。
しかし、手動でIPアドレスを割り当てたいケースがあります。
今回、2つ目のIPアドレスの割当てを手動で行う方法の1つを説明します。

環境と概要

環境

  • Ubuntu 14.04
  • Docker Client: 1.1.2
必要なもの
  • arping(apt-get)
  • bridge-utils(apt-get)
  • Pipework

概要

Pipeworkというものを使って実現していきます。
jpetazzo/pipework · GitHub
pipeworkが何なのかを説明する前に、
dockerで生成されたブリッジからコンテナに接続されたネットワークは以下の図を示します。
f:id:tkyshm:20140811000942p:plain
図から、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を使って、具体的に何がしたいのかというのを、図で示します。
f:id:tkyshm:20140812083456p:plain


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

追記:ssh面倒な方は、pingでも何でもいいので接続を確認してみても大丈夫だと思います。