読者です 読者をやめる 読者になる 読者になる

詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Dockerfile を元にコンテナを走らせてローカルにポートを割り当てるところまでを自動化 (boot2docker のラッパ)

Docker

……というのを書いてみた。boot2docker によって OSX でもかなり簡単に Docker が使えるようになり、開発に必要なミドルウェアを用意する助けになってくれるけれど、いちいち -p オプションでポート番号を指定するまでもなく、ミドルウェア(コンテナ)によって決まったポートが割り当てられていれば十分、ということもよくある。

そこでこの forward2docker。 以下のようにすると、Dockerfile からイメージを作成し、走らせて、EXPOSE されているポート番号 + 10000 番を割り当てて待ち受けてくれる。

% curl -LO https://raw.github.com/motemen/forward2docker/master/forward2docker
% chmod +x forward2docker
% ./forward2docker path/to/Dockerfile

やっていることは

  1. boot2docker のセットアップ
  2. Dockerfile からイメージの作成
  3. コンテナを起動
  4. boot2docker の VMssh して、Docker コンテナにポートフォワーディング
  5. 終了時にはコンテナを削除

ってな感じ。ポイントは ssh-L オプションを使ってるのと、expect 便利ですねってところです。

動作例

以下のような Dockerfile を用意して:

FROM ubuntu

RUN apt-get update
RUN apt-get -y install python
RUN apt-get clean

EXPOSE 8000

CMD [ "python", "-m", "SimpleHTTPServer" ]

こんな感じに動きます:

% ./forward2docker Dockerfile
[2014-02-12 09:42:38] boot2docker-vm is running.
[forward2docker] boot2docker initialized.
[forward2docker] Building image...
Uploading context 2.048 kB
Uploading context
Step 0 : FROM ubuntu
 ---> 9cd978db300e
Step 1 : RUN apt-get update
 ---> Using cache
 ---> d84a5d48bca3
Step 2 : RUN apt-get -y install python
 ---> Using cache
 ---> ea40812f2a47
Step 3 : RUN apt-get clean
 ---> Running in 333d55cc02c8
 ---> ee7660de7b2e
Step 4 : EXPOSE 8000
 ---> Running in 2f2af35885fc
 ---> 382d08a83e30
Step 5 : CMD [ "python", "-m", "SimpleHTTPServer" ]
 ---> Running in 93368aab402d
 ---> 3e29099a8799
Successfully built 3e29099a8799
[forward2docker] Starting container...
[forward2docker] bbde0dd94e1e25f8d8860366cccf5cb827db7147588eda313bb15b0b3833d1d0: listen on port 18000
[forward2docker] Starting port forwarding...
spawn ./boot2docker ssh -L18000:172.17.0.2:8000 -- echo Success! && docker logs -f bbde0dd94e1e25f8d8860366cccf5cb827db7147588eda313bb15b0b3833d1d0
Warning: Permanently added '[localhost]:2022' (RSA) to the list of known hosts.
docker@localhost's password:
Success!

この時点で、http://localhost:18000/ で Docker 上で動いているウェブサーバにアクセスできます。Ctrl-C で(ssh セッションを)終了させると、最後にコンテナを消しさっておわり。

^CKilled by signal 2.
[forward2docker] Cleaning up container...
%