【发布时间】: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 ps和docker logs <container id>的内容