dockerでnginx を使ってリバースプロキシをたてる
概要
前回node プロジェクトの dokcer image を作成した。
express などで作成した node でサーバは well known port を使用できないので、80 ポートで HTTP 通信するには、nginx などの web サーバが必要になる。
今回はnginx でリバースプロキシのコンテナを作成しnode のサーバと通信できるようにする。
nginx設定
nginx に行ってもらいたいことは、
Backend のサーバには、3000 ポートで待機する node サーバを利用する。/api で{hello: "world"}を返すだけの単純なサーバである。
最小限の修正で確認するために次のファイルを作成する。
default.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app:3000; # (1) appはコンテナ名にする
proxy_pass_request_headers on;
}
}
proxy_pass
に Backend で待機するサーバのホスト名とポート名を記述する。
同一サーバ内であれば、localhost:3000 と記述すれば Backend に流してくれるが、コンテナを使う場合 localhost ではアクセスできない。
代わりコンテナ名が必要となり、ここではapp
と決め撃ちする。
これで設定ファイルは作成できたので次にコンテナを起動していく。
node コンテナの起動
先に backend のサーバを起動するため、以下を実行する
docker run -d --name node -p 3000:3000 tsweb
tsweb は、express x typescript で作成した web サーバイメージである。
nginx コンテナ起動
backend サーバと接続できるように以下を実行する
docker run -d --name web -v ~/conf.d:/etc/nginx/conf.d -p 80:80 --link node:app nginx
先程作成したdefault.conf
を格納したディレクトリを-v
オプションで指定し、コンテナ内の/etc/nginx/conf.d/default.conf
を上書きして起動する。
--link
オプションを利用して、app という名前で node コンテナにアクセスできるようにしている。default.conf
で記述したhttp://app:3000
も名前解決できるわけである。
docker psの出力結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d36e0f3a8885 nginx "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp web fe6e3c3beae5 tsweb "/bin/sh -c 'npm sta…" 6 minutes ago Up 6 minutes 0.0.0.0:3000->3000/tcp node
curl localhost/api
と入力して期待した json が帰ってくることを確認できる。
docker-composeなら
docker-compose で記述するなら以下の通りとなる。
docker-compose.yml
version: "3" services: web: image: nginx depends_on: - api volumes: - ~/conf.d:/etc/nginx/conf.d ports: - "80:80" api: image: tsweb expose: - "3000"
depends_onを利用して、nodeコンテナ起動後に、nginxコンテナを起動させている。
以上で nginx を使ってリバースプロキシコンテナを起動できることを確認できたので、次は conf を整理した image を作成して利用すればよい。