当我将其设置为在docker容器中运行时,为什么我的应用程序监听端口80而不是端口3000?

时间:2018-08-25 08:52:55

标签: node.js docker

我正在尝试什么?

我正在尝试在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上侦听。我可以通过邮递员,curl,浏览器等从端口80的容器外部访问它。

我在哪里做错了?如何使其能够监听端口3000?如果我没有明确exposed,它甚至还能在端口上监听吗?

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

请帮助我对docker陌生。

1 个答案:

答案 0 :(得分:2)

仅仅在您的Dockerfile中曝光不会为您做到这一点。在执行docker run或使用docker-example.yaml执行时,您将需要对其进行映射。

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

希望有帮助!

干杯!