ノードアプリケーションにリバースプロキシとして機能するスーパーシンプルなノードアプリケーションとNginx設定があります。私がNginx(homebrew経由で)とNodeアプリケーションをローカルで実行すると、すべてうまく動作します。ポート8080でNginx設定で定義されているサーバーにアクセスすると、ポート3000上で動作しているノードアプリケーションから出力が得られます。Dockerを使用して実行しているときにNginxがアップストリームノードのアプリケーションを見つけることができません
Dockerを使用するようにこの単純な設定を変換しようとしています。次ドッカー・コンファイル:
version: '3.0'
services:
web:
build: .
ports:
- 3000:3000
nginx:
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- 8080:8080
docker-compose up
を実行するには画像が構築され、コンソールにエラーメッセージはありません。 localhost:3000
を訪れるに私はノードアプリから応答を得るが、localhost:8080
を訪問に私はnginxの502エラーページや、端末に次のエラーを取得:
は(接続)(111:接続が拒否されました)失敗に接続中 上流、クライアント:172.18.0.1、サーバー:localhostを、要求: "GET/ HTTP/1.1"、上流: "http://127.0.0.1:3000/"、ホスト: "localhostを:8080"
マイDockerfileノードアプリのルックスについてそうですね:
FROM node:carbon
WORKDIR /app
ADD . /app
RUN npm install
CMD ["node", "."]
EXPOSE 3000
とDockerfile.nginxはそうのようになります(ドッカーを起動するには
events {
worker_connections 1024;
}
http {
upstream node_app {
server 127.0.0.1:3000;
}
server_tokens off;
# Define the MIME types for files.
include mime.types;
default_type application/octet-stream;
# Speed up file transfers by using sendfile()
# TODO: Read up on this
sendfile on;
server {
listen 8080;
server_name localhost;
location/{
proxy_pass http://node_app;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
を私はnginxのは、ポート8080上で実行されていることがわかります。
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
とnginx.confがそうのように見えます502 Nginxのページが表示されるので)、ノードアプリケーションが実行中であることがわかります(私はlocalhost:3000でアクセスできるため)。なぜ私は502をnginxから手に入れることができません。
私はlinks
とdepends_on
をリンクするのに何も違いはないように、さまざまな使い方を試しました。また、変更するたびに以前のビルドをキャッシュしていないことを確認するためにdocker-compose up --build
を使用しています。
EDIT:それを動作させるように見える何かがドッキングウィンドウ-構成するにCONTAINER_NAMEプロパティを追加することです:
web:
container_name: nodeapp
build:
context: .
dockerfile: Dockerfile.node
ports:
- 3000:3000
、その後nginx.confの上流node_appの設定で、そのコンテナ名を使用して:
私には意味がありませんか?
は、ドッキングウィンドウのためのネットワーキングのドキュメントはhttps://docs.docker.com/compose/networkingを構成するチェックアウト/、具体的には名前で発見可能なコンテナに関する最初の段落です。そのため、nginx confファイルのコンテナ名で動作します。 Dockerにはいくつかのネットワークモードがあります。ドッカーネットワークがどのように機能するかを理解するために、https://docs.docker.com/engine/userguide/networking/#default-networksのこちらの記事を読むことができます。 –
リンクがあり、名前でコンテナを発見できることを説明してくれてありがとう。これらのドキュメントを再読み込みすると、今より多くの意味があります。 –