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 の設定は、コンテナが停止すると同時に削除される。
0 件のコメント:
コメントを投稿