我的应用在 Docker 容器内运行,我设置它监听的端口是 3000,为什么它会监听 80 端口?

4

我想做什么?

我想在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作为一个环境变量传递,并将其设置为80,因为我自己没有传递任何环境变量。

请帮帮我,我对docker非常陌生。


您正在使用主机模式网络,其中暴露端口的概念是无意义的,因为该网络与主机共享而不是命名空间。 - Sathyajith Bhat
@Sathya,我该如何在3000端口上实现这个?你能解释一下吗?我刚开始学习Docker。 - vibhor1997a
1
docker run -p 3000:3000 <imgName> - opHASnoNAME
@opHASnoNAME,那样做行不通,因为就像我说的,使用主机模式网络时,发布的端口会被忽略。 - Sathyajith Bhat
发布 docker psdocker logs <容器ID> 的内容 - Sathyajith Bhat
@Sathya 感谢您的所有帮助!由于 TypeScript 的编译似乎没有正确进行,所以它正在侦听端口 80 而不是 3000。当我在主机上编译并运行 docker build . 命令时,它可以使用命令 docker -p 3000:3000 <imageName> 正常工作。我还必须在 vm virtual box 的 NAT 端口转发部分中添加一条规则。 - vibhor1997a
1个回答

4
仅在您的 Dockerfile 中公开不足以实现此目的。当您执行 docker run 或使用 docker-example.yaml 时,您需要进行映射。
为了实现这一点,您需要使用 $ docker run -p 3000:3000。接下来,您将不需要使用 --net=host,这可能是服务可在端口80上运行的原因。
希望对您有所帮助!
干杯!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接