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を使いイメージを作ることにします。