web-dev-qa-db-ja.com

Dockerコンテナでリバースプロキシを使用してnginxを使用しても機能しない

/apiで始まるすべてのものをhttp://localhost:3007に転送したい

これは私のnginx.confです

user nginx;
worker_processes  1;

daemon off;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/html;
            index  index.html index.htm;
        }

        location /api {
            proxy_pass http://localhost:3007;
            proxy_read_timeout 5m;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    include servers/*;
}

Macでローカルに実行すると機能します。しかし、docker-containerで実行すると機能しません。

これは私のdocker-fileです:

FROM smebberson/Alpine-nginx:latest
COPY /dist /usr/html/
COPY nginx.conf /etc/nginx/nginx.conf

これは私のdocker-composeです:

version: "2"
services:
  web:
    build: .
    ports:
     - "80:80"

私がnginxから得ているエラー:

2017/06/28 13:06:51 [error] 200#0: *9 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET /api HTTP/1.1", upstream: "http://127.0.0.1:3007/api", Host: "localhost"
2
Joe

おそらく、localhost:3007ではなく、api-upstream-server:3007のようなものが必要です。これは、アプリサーバーコードを実行し、ポート3007を公開する別のコンテナーです。

コンテナ内では、localhostはコンテナであり、ホストマシンではありません。 Dockerは、コンテナーをホストノードから分離します。

ただし、Dockerコンテナで他のすべて(データベースなど)も実行する必要があることに注意してください。

1
saabeilin