【问题标题】:Why does my app listen on port 80 instead of port 3000 as I set it running inside docker container?为什么我的应用程序在 docker 容器中运行时会监听端口 80 而不是端口 3000?
【发布时间】:2018-08-25 19:04:23
【问题描述】:

我在尝试什么?

我正在尝试在 docker 容器内运行我的 nodejs 应用程序,并希望在容器外使用它(通过端口 3000 上的浏览​​器)。

DockerFile

FROM node:8
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
RUN npm run build
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

app.ts(相关部分)

const port = process.env.port || 3000;   
let app = express();
app.listen(port, () => {
    console.log(`Listening on port ${port}!`);
});

我用来运行的命令

$ docker run --net=host <imgName>

操作系统 --> Windows 7

在 Oracle Virtual Box 中,我已将网络设置更改为桥接网络。

命令运行成功,服务器开始监听 80 端口。我可以通过 postman、curl、浏览器等从容器外部的 80 端口访问它。

我哪里做错了?如何让它监听 3000 端口?如果我没有明确地exposed 它怎么能监听端口?

我认为 docker 将 port 作为 environment variable 传递并将其设置为 80,因为我自己没有传递任何环境变量。

请帮助我是docker 的新手。

【问题讨论】:

  • 您使用的是主机模式网络,其中暴露端口的概念毫无意义,因为网络与主机共享而不是命名空间
  • @Sathya 那么如何在端口 3000 上执行此操作?你能解释一下吗?我刚开始学习docker。
  • docker run -p 3000:3000
  • @opHASnoNAME 这不起作用,因为就像我说的,在主机模式网络中,已发布的端口被忽略
  • 发布docker psdocker logs <container id>的内容

标签: node.js docker


【解决方案1】:

仅仅在您的Dockerfile 中公开对您来说是无用的。当您执行docker run 或使用docker-example.yaml 执行时,您将需要映射它。

要实现这一点,您需要使用$ docker run -p 3000:3000。之后您将不需要使用--net=host,这应该是该服务在端口 80 上可用的原因。

希望对你有帮助!

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2011-12-17
    • 2013-04-07
    • 2016-05-04
    • 2019-05-26
    • 2020-06-07
    相关资源
    最近更新 更多