Intento crear una aplicación web con contenedores docker y se me niega la conexión cuando intento ejecutar Nginx como un proxy inverso para mi aplicación de nodo. No estoy seguro de si es un problema de configuración del servidor nginx o un problema de configuración de docker-compose.
[error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.20.0.1, server: foo.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:7770/", host: "foo.com"Recibo este error cuando presiono foo.com, lo extraño es que mi aplicación funciona cuando se hace referencia al número de puerto, por lo que foo.com:7770 ejecuta la aplicación.
Mi configuración del servidor nginx:
server { listen 80; server_name foo.com; port_in_redirect off; autoindex on; location / { proxy_pass http://127.0.0.1:7770; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }Mi archivo Docker Compose: (Puede haber algunas cosas redundantes aquí)
version: "2" services: nginx: build: ./nginx ports: - "80:80" depends_on: - app links: - app app: build: context: . dockerfile: DockerFile ports: - "7770:7770" links: - mongo depends_on: - mongo mongo: image: mongo ports: - "27017:27017" volumes_from: - mongodata depends_on: - mongodata mongodata: image: tianon/true volumes: - /data/dbMi nodo Dockerfile:
FROM node:latest ADD package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/ WORKDIR /opt/app ADD . /opt/app EXPOSE 7770 CMD ["npm", "start"]Mi Dockerfile ngnix
FROM nginx:1.10 COPY default.conf /etc/nginx/conf.d/default.confEn npm start esto se ejecutará:
app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'index.html')); }); app.listen(7770, function(err) { if (err) { console.log(err); return; } console.log('Listening at http://localhost:7770'); });Esta es mi primera ejecución en Docker, por lo que es posible que haya confundido algunas cosas. También apunto foo.com a 127.0.0.1 en /private/etc/hosts.
c-holmes,
En primer lugar, debe recordar que cada contenedor tiene su propia pila de red, por lo que no puede usar localhost dentro del contenedor para llegar a un servicio que se ejecuta en el host de la ventana acoplable.
Para este proyecto específico, deberá señalar la directiva proxy_pass en la configuración de su servidor Nginx a un valor que llegue al contenedor de la app . Algo como:
proxy_pass http://app:7770;
Deberá hacerlo bien porque en el contexto docker-compose el nombre de su contenedor se asignará a una entrada DNS interna. Con eso, no necesitará publicar 7770 del contenedor de aplicaciones en el mundo exterior y si su MongoBD solo será accedido por su contenedor de aplicaciones, tampoco necesitará publicar el puerto 27017.
Si desea enrutar el tráfico de nginx a la app , debe usar la dirección IP o dns del contenedor de la app en proxy_pass . Con Docker Compose, los servicios pueden descubrirse entre sí con nombres de servicio, así que cambie en nginx conf
proxy_pass http://app:7770;
No necesita publicar el puerto 7770 en el mundo exterior. Además, para mongo no necesita publicar el puerto 27017.