boot2dockerのネットワーク周りでちょっとハマったので書いた。間違いがあったら突っ込みお願いします。
Dockerの構造
フロントエンドとデーモン
dockerフロントエンドと、実際にコンテナを操作するデーモンは、go言語で書かれた同一バイナリだが別物だ。フロントエンドは、MacなどLinux以外の環境でも動作する。デーモンは現状ではDebian/CentOSでしか動作しない。通常はフロントエンドとデーモンはUNIXソケットで通信を行う。
デーモンを外部接続を許可させる起動方法
$ docker -d -H tcp://0.0.0.0:4243/ -H unix:///var/run/docker.socket
Debian/CentOSにどういう方法でインストールしたかによるかもしれないが、通常は外部接続を許してないので、起動スクリプトを上記のように変更する。
リモート接続する方法
$ export DOCKER_HOST="tcp://192.168.1.2:4243"
フロントエンド側も通常はUNIXソケットを見に行くので、リモート接続する場合DOCKER_HOSTの環境変数の設定が必要となる。
boot2docker
Linux以外の環境でお手軽にdockerを試すことのできるboot2dockerイメージは、dockerに最小限必要なものだけがインストールされたものだ。Macのbrewで一発インストールできるようになったboot2dockerフロントエンドは、VirtualBoxでboot2dockerイメージを操作するvagrantのようなラッパーだ。
boot2dockerをはじめとした仮想マシン上でデーモンが動作している場合は、コンテナ内部で立ち上げたサーバー類のポートフォワードなどを考えないといけない。方法としてはVirtualBoxのCLIであるVBoxManageを使う方法はhttp://qiita.com/ikuyamada/items/3f12de859a87d51fdd79に書かれている。別の方法としてはsshで接続してsshのポートフォワード機能を使うなどがある。
httpdを起動して、ネットワーク周りを探る
$ cat > Dockerfile
FROM centos
RUN yum install -y httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
$ docker build -t httpd .
$ docker run -d httpd
この状態でhttpdを起動した場合、httpdにアクセスするためには、対象のコンテナのIPを調べて直接アクセスする必要がある
$ docker inspect `docker ps -l -q` | grep IPAddress | cut -d '"' -f 4
$ curl http://出てきたIP/
起動方法を変えることでポートマッピングをすることもできる
$ docker run -d -p 80:80 httpd
$ curl http://localhost/
※この時boot2dockerとかを使ってる場合は、さらにもう一段ポートフォワードする必要があることを忘れないように。