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 でも操作可能だが、スクリプト化したいのでコマンドで実行してみる。
- 目的に適したアダプタが既に存在するかどうか確認
IPアドレス(192.168.99.1)、ネットワークマスク(255.255.255.0)が一致するものが存在していれば、$ VBoxManage list -l hostonlyifs
そのアダプタを利用する。 - アダプタが存在していなければ、新規作成
表示されたインタフェース名に対して変更を施し、確認。
$ 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 にホストオンリーインタフェースを追加
先ほど作成したホストオンリーアダプタの名前(ここでは vboxnet0)を指定。$ VBoxManage modifyvm boot2docker-vm --nic2 hostonly --hostonlyadapter2 vboxnet0
$ VBoxManage modifyvm boot2docker-vm --nicpromisc2 allow-all
nic1 は NATアダプタとして既に存在しているので、ここでは nic2 を作成する。
Docker コンテナ間の通信を可能とするため、Promiscuous Mode の設定を変更する。 - boot2docker 起動
$ boot2docker up
- 疎通確認
まずは boot2docker VM (Dockerホスト) に対して直接アクセスできるようになった。$ ping 192.168.99.2
$ ssh docker@192.168.99.2
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 の実行
コンテナID と IPアドレスを指定し、boot2docker VM上のホストオンリーアダプタ(eth1)と対応付ける。$ boot2docker ssh sudo pipework eth1 $CID1 192.168.99.101/24
$ boot2docker ssh sudo pipework eth1 $CID2 192.168.99.102/24
- 疎通確認
Mac から Docker コンテナに直接アクセスできる。$ 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
さらに、そのIPアドレスを使ってコンテナ間通信もできるようになった。
このように、pipework のおかげで Docker コンテナの活用の幅はますます広がりそうだ。
なお、pipework の設定は、コンテナが停止すると同時に削除される。
0 件のコメント:
コメントを投稿