dockerでnginx を使ってリバースプロキシをたてる

概要

前回node プロジェクトの dokcer image を作成した。
express などで作成した node でサーバは well known port を使用できないので、80 ポートで HTTP 通信するには、nginx などの web サーバが必要になる。

今回はnginx でリバースプロキシのコンテナを作成しnode のサーバと通信できるようにする。

nginx設定

nginx に行ってもらいたいことは、

  1. 80 ポートで HTTP リクエストをうけいれる
  2. 受けたリクエストを Backend の特定ポートでまつサーバになげる
    である。

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 を作成して利用すればよい。