L'utilisation de nginx avec le proxy inverse dans le conteneur docker ne fonctionne pas

Je veux que tout commence par /api pour être dirigé vers http://localhost:3007

C'est mon 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 { listn 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/*; } 

Il fonctionne quand je l'exécute localement sur mon Mac. Mais il ne fonctionne pas lorsque je l'exécute dans un conteneur docker.

C'est mon file docker:

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

C'est mon docker-compose:

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

L'erreur que je reçois de 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" 

Très probablement, vous ne voulez pas localhost:3007 mais quelque chose comme api-upstream-server:3007 – un conteneur distinct exécutant le code du server de l'application et exposant le port 3007.

À l'intérieur du conteneur, localhost est le conteneur, et non la machine hôte. Docker isole le conteneur du noeud hôte.

Mais notez que vous devrez probablement exécuter tout le rest (database, etc.) dans les conteneurs docker.