Tengo una aplicación Node.js/Express simple:
const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))Funciona bien cuando lo inicio como: node src/app.js
Ahora estoy tratando de ejecutarlo en un contenedor Docker. Dockerfile es:
FROM node:8 WORKDIR /app ADD src/. /app/src ADD package.json package-lock.json /app/ RUN npm install COPY . /app EXPOSE 3000 CMD [ "node", "src/app.js" ] Comienza bien: docker run <my image>:
Listening on port 3000Pero ahora no puedo acceder a él en mi navegador: http://localhost:3000
This site can't be reached localhost refused to connect.Lo mismo sucede si trato de ejecutarlo dentro de docker-compose:
version: '3.4' services: service1: image: xxxxxx ports: - 8080:8080 volumes: - xxxxxxxx myapp: build: context: . dockerfile: Dockerfile networks: - private ports: - 3000 command: node src/app.jsNo estoy seguro si trato bien con los puertos en ambos archivos acoplables
Cuando trabaja con Docker, debe definir el host de su aplicación como 0.0.0.0 en lugar de localhost .
Para su aplicación express, puede definir el host en app.listen call.
Consulte la documentación : app.listen([puerto[, host[, backlog]]][, devolución de llamada])
Su código expreso debe actualizarse a:
const port = 3000 const host = '0.0.0.0' app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, host, () => console.log(`Example app listening on ${port}!`))También es importante publicar puertos docker:
docker run -p 3000:3000 <my image> services: myapp: build: context: . dockerfile: Dockerfile networks: - private ports: - 3000:3000 command: node src/app.jsNecesitas publicar puertos
docker run -p 3000:3000 <my image> -p - significa publicar
prueba esto:
services: myapp: build: context: . dockerfile: Dockerfile networks: - private ports: - 3000:3000 ##THIS IS THE CHANGE, YOU NEED TO MAP MACHINE PORT TO CONTAINER command: node src/app.js