boot2docker上のコンテナにポートフォワーディングでアクセスする
はじめに
“Macに正式対応したdocker ver 0.8 のセットアップ"では、Mac OSXにboot2dockerをインストールしてdockerを扱う環境を整備しました。
直接dockerコマンドを叩けるようになったとはいえ、コンテナはboot2dockerのVM上にあるのでアクセスするには一手間かける必要があります。
コンテナ作成
とりあえずは接続するためのコンテナを作成してみます。
Elasticsearchサーバーを立ててみましょう。
Dockerfile
# Elasticsearch server
FROM ubuntu:12.04
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update -qq
RUN apt-get upgrade -y
RUN apt-get install -y python-software-properties
RUN add-apt-repository ppa:webupd8team/java -y
RUN apt-get update
RUN echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
RUN apt-get install -y git curl oracle-java7-installer wget
RUN wget -O /tmp/elasticsearch.tar.gz https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.10.tar.gz
RUN cd /tmp && tar xzf /tmp/elasticsearch.tar.gz
RUN rm -rf /tmp/elasticsearch.tar.gz
RUN mv /tmp/elasticsearch-0.90.10 /elasticsearch
WORKDIR /elasticsearch
VOLUME /elasticsearch
EXPOSE 9200
CMD ./bin/elasticsearch -f
Elasticsearchサーバー構築のためのDockerfileを用意して、同一ディレクトリでdocker build
します。
$ docker build -t="elasticsearch" .
これでElasticsearchサーバーのイメージが構築できました。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
elasticsearch latest 19028ec10089 2 days ago 792.6 MB
ubuntu 12.04 9cd978db300e 9 days ago 204.4 MB
コンテナに接続
先ほど作成したコンテナをポートと指定して起動してみます。
$ docker run -p 9200:9200 elasticsearch
これでboot2docker VM上からなら、9200番ポートでコンテナにアクセス可能になっています。
あとはローカルからboot2dockerへの経路を作るだけですね。
boot2dockerのssh待ち受けポートは2022なので、そこを指定してポートフォワードします。
$ ssh -N -L 9292:127.0.0.1:9200 docker@localhost -p 2022
これでローカルホストの9292番にアクセスしてみると
{
"ok" : true,
"status" : 200,
"name" : "Master Menace",
"version" : {
"number" : "0.90.10",
"build_hash" : "0a5781f44876e8d1c30b6360628d59cb2a7a2bbb",
"build_timestamp" : "2014-01-10T10:18:37Z",
"build_snapshot" : false,
"lucene_version" : "4.6"
},
"tagline" : "You Know, for Search"
}
コンテナ上のElasticsearchサーバーにアクセスできました。
まとめ
一手間かける必要はありますが、boot2docker上のコンテナにも直接アクセスすることが出来ました。
少しシェルスクリプトを書けば、もう少し手軽になるでしょう。
コンテナ間の通信や、DockerHostを超えたコンテナを繋ぐ方法に関しては徐々にベストプラクティスが構築されていくと思います。
LXCのためのSDN(Software-Defined Networking)ツールであるpipeworkあたりも要注目です。