2017-12-26 5 views
0

ノードアプリケーションにリバースプロキシとして機能するスーパーシンプルなノードアプリケーションと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から手に入れることができません。

私はlinksdepends_onをリンクするのに何も違いはないように、さまざまな使い方を試しました。また、変更するたびに以前のビルドをキャッシュしていないことを確認するためにdocker-compose up --buildを使用しています。

EDIT:それを動作させるように見える何かがドッキングウィンドウ-構成するにCONTAINER_NAMEプロパティを追加することです:

web: 
    container_name: nodeapp 
    build: 
     context: . 
     dockerfile: Dockerfile.node 
    ports: 
     - 3000:3000 

、その後nginx.confの上流node_appの設定で、そのコンテナ名を使用して:

私には意味がありませんか?

+1

は、ドッキングウィンドウのためのネットワーキングのドキュメントはhttps://docs.docker.com/compose/networkingを構成するチェックアウト/、具体的には名前で発見可能なコンテナに関する最初の段落です。そのため、nginx confファイルのコンテナ名で動作します。 Dockerにはいくつかのネットワークモードがあります。ドッカーネットワークがどのように機能するかを理解するために、https://docs.docker.com/engine/userguide/networking/#default-networksのこちらの記事を読むことができます。 –

+0

リンクがあり、名前でコンテナを発見できることを説明してくれてありがとう。これらのドキュメントを再読み込みすると、今より多くの意味があります。 –

答えて

1

Nginxの設定では、WebサービスのIPを、ドッカーコンテナを実行しているホストマシンのループバックアドレスである127.0.0.1として参照しています。これはあなたの設定(OS、ファイアウォール)に応じて動作するかもしれませんし、そうでないかもしれません。

正しい方法はnginxサービスがごドッキングウィンドウ-compose.ymlファイルにwebサービスに依存して作成し、名前(web)によってIPアドレスの代わりにして、Webサービスを参照するためにnginxの設定ファイルを更新することです。 Hereドッカーの作成に関する詳細は、機能によって異なります。

更新ドッキングウィンドウ-compose.ymlファイルには、次のようになります。私はwebサービスのポートを暴露停止している

version: '3.0' 
services: 
    web: 
    build: . 
    nginx: 
    build: 
     context: . 
     dockerfile: Dockerfile.nginx 
    ports: 
     - 8080:8080 
    depends_on: 
     - web 

注意してください。 Webサービスを監視するためにそれを保持する必要がありますが、nginxサービスでは必要ありません。ドッキングウィンドウ-compose.ymlファイルにこのアップデートで

次のようにnginxの設定ファイルは次のようになります。

events { 
    worker_connections 1024; 
} 

http { 

    upstream node_app { 
    server web: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; 
    } 
    } 
} 
+0

大変ありがとうございます。本当に有益な答え。 –

関連する問題