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あたりも要注目です。