- Update 2014-07-28: Dockerで開発環境をつくる - Nginx
Nginxの手軽なDockerコンテナが必要になったので、phusion/baseimageでDockerイメージを作ろうと思い、Node.jsとNginxのサンプルを探していました。Docker Misconceptionsのポストでpassenger-dockerを紹介していました。
PassengerはRubyだけかと思っていましたが、Python,Node.js,Meteorまで対応しています。
Node.jsのpm2やforeverをDockerでどうやって使うのか考えるよりPassengerで簡単にできそうです。
Node.js用のイメージはphusion/baseimageから派生したphusion/passenger-nodejsになります。
Dockerfile
最初に今回作成したDockerfileです。
| FROM phusion/passenger-nodejs:0.9.11 | 
Node.jsアプリ
Phusion Passenger: Node.js tutorialを読むとNode.jsをPassengerで動かす場合、nodeコマンドで起動するファイルはapp.jsである必要があります。
| application directory | 
単純なHellow Worldを作成します。
listenするポートは8000にしていますが、Passengerの場合意味がなく、3000ポートでlistenするようです。
| var http = require('http'); | 
Nginxを有効にする
phusion/passenger-nodejsイメージではでフォルトでNginxが有効になっていません。
downファイルを削除して有効にします。
| RUN rm -f /etc/service/nginx/down | 
site-enabled
Passengerで有効にするWebアプリの設定をconfに書いて配置します。
| server { | 
Dockerfileでは以下のように、最初にdefaultを削除します。defaultでは80でlistenしているため、
追加するconfと競合してしまいます。
| ADD webapp.conf /etc/nginx/sites-enabled/webapp.conf | 
build と run
Dockerイメージをビルドします。
| $ cd ~/docker_apps/nodejs | 
Dockerコンテナを実行します。
| $ docker run --rm -p 80:80 -i -t masato/nodejs | 
Dockerホストからブラウザで確認します。
 
docker-bashコマンド
passenger-dockerにはDockerホストにインストールして使う、便利なコマンドがあります。
| $ cd Downloads | 
書式です。
| $ docker-bash YOUR-CONTAINER-ID | 
コンテナIDを指定して、SSHログインできます。
| $ sudo docker-bash 8bbcde370741 | 
また、コンテナにSSHログインして、ワンショットのコマンドを実行できます。
| docker-bash 8bbcde370741 echo hello world | 
まとめ
PassengerでNode.jsを初めて使ってみましたが、通常の利用では自動的にNginxがリバースプロキシしてくれるのはかなり便利です。
ただ、複数のDockerコンテナが開いているポートへ、Nginxがリバースプロキシしてほしかったので、ちょっと用途が違いました。
仕方がないので自分でphusion/baseimageのrunitを使いイメージを作ることにします。