1
resposta

Container rodando mas não é possível acessar na Web

Olá Pessoal, montei o dockerfile igual demonstrado no vídeo, porem ao adicionar a parte de variável de ambiente para a porta, eu consigo fazer o build e executar a imagem porem não é possível acessar na web

dockerfile

FROM node:14
WORKDIR /app-node
ARG PORT_BUILD=6000
ENV PORT=$PORT_BUILD
EXPOSE $PORT_BUILD
COPY . .
RUN npm install
ENTRYPOINT npm start

Código JS
const express = require('express')
let app = express();

app.use(express.static("."));

app.get("/", (req,res)=>{ res.sendFile(__dirname + '/index.html') })

app.listen(process.env.PORT, ()=>{ console.log("Server is listening on port 3000") })

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Oi! as imagens e o Dockerfile ajudam bastante a entender o problema.
O seu container realmente está “rodando”, mas há um detalhe na configuração que impede o acesso via navegador. Vamos destrinchar:

  1. No seu Dockerfile, você define:

    ARG PORT_BUILD=6000
    ENV PORT=$PORT_BUILD
    EXPOSE $PORT_BUILD
    

    Isso significa que o container está preparado para escutar a porta 6000.

  2. No log do docker ps, o container que expõe 8080 mostra o mapeamento:

    0.0.0.0:6000->8080/tcp
    

    Ou seja, a porta 6000 do container está mapeada para a 8080 da máquina host.
    Isso indica que o container está servindo algo na porta 6000, não 8080.

  3. Seu código Node faz:

    app.listen(process.env.PORT, ()=>{ console.log("Server is listening on port 3000") })
    

    Aqui está o principal problema:

    • O Express está ouvindo process.env.PORT, que é 6000 (certo)
    • Mas o console.log mostra “port 3000”, o que pode confundir — ele não está ouvindo 3000.
    • Como o mapeamento é 8080 -> 6000, você deve acessar localhost:8080.
  4. Contudo, se ainda assim não abre no navegador, é provável que o app esteja escutando apenas em localhost dentro do container (e não em todas as interfaces).

Como corrigir

Abra seu código JS e altere o app.listen assim:

app.listen(process.env.PORT, '0.0.0.0', () => {
  console.log(`Server is listening on port ${process.env.PORT}`);
});

Isso faz o Express aceitar conexões externas — o que é necessário dentro de um container Docker.

  • Teste novamente
  1. Reconstrua a imagem:

    docker build -t app-node:1.6 .
    
  2. Rode o container mapeando corretamente:

    docker run -p 8080:6000 app-node:1.6
    
  3. Acesse no navegador:

    http://localhost:8080
    

Se ainda não funcionar, me envie a saída completa de:

docker logs <nome-do-container>

Assim posso confirmar se o servidor subiu corretamente dentro do container.