……というのを書いてみた。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
やっていることは
- boot2docker のセットアップ
- Dockerfile からイメージの作成
- コンテナを起動
- boot2docker の VM に ssh して、Docker コンテナにポートフォワーディング
- 終了時にはコンテナを削除
ってな感じ。ポイントは 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... %