3.22.2014

How to Connect Directly to the Docker Container on boot2docker with Static IP Address

Docker: boot2docker 上の Docker コンテナに狙ったIPアドレスで直接接続する方法

 

boot2docker を導入した Mac OS 環境で {Mac, boot2docker VM, Dockerコンテナ} の三者を
同一のネットワークに所属させ、それぞれに対して固定IPアドレスでアクセスできるようにしたい。

ただし pipework の README にもあるように、闇雲にこの方式を採用するのはお勧めしない。

 

環境

  • OS: Mac OS X 10.9 (Mavericks)
  • VirtualBox: 4.3.6
  • boot2docker: v0.7.0 (Docker 0.9.0 を含む)
  • jpetazzo/pipework (作業手順の中でダウンロードする)

 

事前準備

  • boot2docker のセットアップ
    boot2docker ssh が実行できる状態となっていること。
  • Mac から docker コマンドが利用できること
    Docker クライアントがインストールされていて、環境変数 DOCKER_HOST が
    tcp://127.0.0.1:4243 のように設定されていること
  • IP アドレス/ネットワークの決定
    VirtualBox のホストオンリーネットワーク上に静的に設定するIPアドレスを決める。
    今回の例では以下のように設定。
    • Gateway: 192.168.99.1/24
    • boot2docker VM (Dockerホスト): 192.168.99.2/24
    • Dockerコンテナ1: 192.168.99.101/24
    • Dockerコンテナ2: 192.168.99.102/24

作業手順

コマンドはすべて Mac上で実行するべく記述している。

1. boot2docker VM 起動時処理の追加

boot2docker では、Docker の実行環境それ自体が Docker コンテナとして構築されている。
そのため、boot2docker ssh でネットワーク周りの設定をしても、boot2docker VM を再起動すると
設定が初期化されてしまう。

/var/lib/boot2docker/bootlocal.sh を作成すれば、VM(の中のコンテナ?)起動時にこのシェルが実行される。
永続化したい処理はここに書くのがセオリーだ。

  • boot2docker 起動
    $ boot2docker up
  • pipework 最新版のダウンロード
    $ boot2docker ssh " \
    sudo mkdir -p /var/lib/boot2docker/bin && \
    sudo curl -o /var/lib/boot2docker/bin/pipework https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework && \
    sudo chmod +x /var/lib/boot2docker/bin/pipework"
    

    pipework の実行ファイル(実態はシェルスクリプト)を永続化対象の /var/lib/boot2docker/bin 配下に
    置き、VM 起動時に /usr/local/bin/pipework へシンボリックリンクを張る戦略。
  • bootlocal.sh の作成
    $ boot2docker ssh "sudo bash -c '
    echo -e \"ln -s /var/lib/boot2docker/bin/pipework /usr/local/bin/pipework
    \nip addr add 192.168.99.2/24 dev eth1
    \nip link set eth1 up\" > /var/lib/boot2docker/bootlocal.sh
    && chmod +x /var/lib/boot2docker/bootlocal.sh
    '"
    

    ここで、boot2docker VM のIPアドレスを指定する。

    実際の bootlocal.sh は以下のような内容になる。(shebang を付けたほうがいいかもしれない)

    ln -s /var/lib/boot2docker/bin/pipework /usr/local/bin/pipework
    ip addr add 192.168.99.2/24 dev eth1
    ip link set eth1 up

 

2. VirtualBox ホストオンリーアダプタの設定

VirtualBox の GUI でも操作可能だが、スクリプト化したいのでコマンドで実行してみる。

  • 目的に適したアダプタが既に存在するかどうか確認
    $ VBoxManage list -l hostonlyifs
    IPアドレス(192.168.99.1)、ネットワークマスク(255.255.255.0)が一致するものが存在していれば、
    そのアダプタを利用する。
  • アダプタが存在していなければ、新規作成
    $ VBoxManage hostonlyif create
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Interface 'vboxnet0' was successfully created
    $ VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.99.1 --netmask 255.255.255.0
    $ VBoxManage list -l hostonlyifs
    
    表示されたインタフェース名に対して変更を施し、確認。
  • boot2docker 停止
    $ boot2docker stop
  • boot2docker VM にホストオンリーインタフェースを追加
    $ VBoxManage modifyvm boot2docker-vm --nic2 hostonly --hostonlyadapter2 vboxnet0
    $ VBoxManage modifyvm boot2docker-vm --nicpromisc2 allow-all
    先ほど作成したホストオンリーアダプタの名前(ここでは vboxnet0)を指定。
    nic1 は NATアダプタとして既に存在しているので、ここでは nic2 を作成する。
    Docker コンテナ間の通信を可能とするため、Promiscuous Mode の設定を変更する。
  • boot2docker 起動
    $ boot2docker up
  • 疎通確認
    $ ping 192.168.99.2
    $ ssh docker@192.168.99.2
    まずは boot2docker VM (Dockerホスト) に対して直接アクセスできるようになった。

 

3. コンテナの起動と pipework の実行

ここでは、CentOS 6.4 上で sshd が動くだけの Docker コンテナ (mogproject/sshd Repository | Docker Index) を
2つ立ち上げて、pipework の動作を確認してみる。

  • コンテナの起動
    $ CID1=$(docker run -d -t mogproject/sshd)
    $ CID2=$(docker run -d -t mogproject/sshd)
    $ docker ps
  • pipework の実行
    $ boot2docker ssh sudo pipework eth1 $CID1 192.168.99.101/24
    $ boot2docker ssh sudo pipework eth1 $CID2 192.168.99.102/24
    コンテナID と IPアドレスを指定し、boot2docker VM上のホストオンリーアダプタ(eth1)と対応付ける。
  • 疎通確認
    $ ping 192.168.99.101
    $ ping 192.168.99.102
    $ ssh ssh-user@192.168.99.101    ### パスワードも ssh-user
    [ssh-user@xxxxxxxxxxxx ~]$ ping 192.168.99.102
    [ssh-user@xxxxxxxxxxxx ~]$ exit
    $ ssh ssh-user@192.168.99.102
    [ssh-user@xxxxxxxxxxxx ~]$ ping 192.168.99.101
    [ssh-user@xxxxxxxxxxxx ~]$ exit
    
    Mac から Docker コンテナに直接アクセスできる。
    さらに、そのIPアドレスを使ってコンテナ間通信もできるようになった。

このように、pipework のおかげで Docker コンテナの活用の幅はますます広がりそうだ。

なお、pipework の設定は、コンテナが停止すると同時に削除される。

 

 

 

References

0 件のコメント:

コメントを投稿