如何在本地访问Docker容器应用程序?

时间:2019-06-06 19:53:20

标签: node.js docker docker-compose

我有一个简单的Node.js / Express应用程序:

const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

当我像这样启动它时,它可以正常工作:node src / app.js

现在,我正在尝试在Docker容器中运行它。 Dockerfile是:

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" ]

开始正常:docker run <my image>:

Listening on port 3000

但是现在我无法在浏览器中访问它: http://localhost:3000

This site can’t be reached localhost refused to connect.

如果我尝试在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.js

不确定我是否正确处理两个docker文件中的端口

3 个答案:

答案 0 :(得分:0)

您需要发布端口

docker run -p 3000:3000 <my image>

-p-代表发布

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

使用docker时,必须将应用程序的主机定义为0.0.0.0,而不是localhost

对于您的快速应用程序,您可以在app.listen调用中定义主机。

检查documentation app.listen([端口[,主机[,待办事项]]] [,回调])

您的快递代码应更新为:

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}!`))

发布docker端口也很重要:

  • 正在运行的docker:docker run -p 3000:3000 <my image>
  • 运行docker-compose:
services:
  myapp:
    build: 
      context: .
      dockerfile: Dockerfile
    networks:
      - private
    ports:
      - 3000:3000
    command:
      node src/app.js