J'ai une application Node.js / Express simple:
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.js
Cela fonctionne bien quand je la lance comme: node src / app.js
Maintenant je ' J'essaye de l'exécuter dans un conteneur Docker. Dockerfile est:
This site canât be reached localhost refused to connect.
Ça démarre bien: docker run
Listening on port 3000
Mais maintenant je ne peux pas y accéder dans mon navigateur: http: // localhost: 3000
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" ]
Il en va de même si je essayez de l'exécuter dans docker-compose:
const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
Je ne sais pas si je gère correctement les ports dans les deux fichiers docker
3 Réponses :
Vous devez publier les ports
docker run -p 3000:3000 <my image>
-p
- signifie publier
essayez ceci:
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
Lorsque vous travaillez avec docker, vous devez définir l'hôte de votre application comme 0.0.0.0
au lieu de localhost
.
Pour votre application express, vous pouvez définir l'hôte lors de l'appel app.listen
.
Vérifiez le documentation : app.listen ([port [ hôte [ backlog]]] [ callback])
Votre code express doit être mis à jour en:
services: myapp: build: context: . dockerfile: Dockerfile networks: - private ports: - 3000:3000 command: node src/app.js
Il est également important de publier les ports docker:
docker run -p 3000: 3000
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}!`))
Si la publication de ports n'a pas aidé comme d'autres réponses mentionnées, et si vous êtes sur MacOS, essayez: app.listen (port, '0.0.0.0', () => console.log (`Exemple d'application écoutant sur le port $ {port}! `)) à la place.