Docker部署Express应用后本地无法访问,请求排查解决
问题描述
我有一个Express应用,代码如下:
const express = require("express"); const PORT = process.env.PORT || 3001; app = express(); app.all("*", (req, res) => res.status(200).json({ status: 200, message: "Hello world from Docker.", }) ); app.listen(PORT, "127.0.0.1", () => console.log("The server is running on port: %s", PORT) );
基于该应用构建镜像的Dockerfile内容如下:
FROM node:18-alpine WORKDIR /app COPY package*.json . RUN npm install COPY . . EXPOSE 3001 CMD ["npm", "start"]
.dockerignore文件内容:
node_modules
镜像构建命令:
docker build -t my-app:1.0 .
启动容器命令:
docker run -p 3001:3001 my-app:1.0
在Windows 10系统下访问http://localhost:3001时浏览器无内容显示,请问哪里出错了?
解决方法
问题出在Express服务的监听地址配置上:
- 你将
app.listen的绑定地址设为了127.0.0.1,这会让服务仅监听容器内部的环回接口,容器外部(包括Windows主机)无法访问该服务。 - Docker容器拥有独立的网络栈,主机的
localhost无法直接映射到容器内部的127.0.0.1。
只需修改Express代码中的监听地址即可解决:
- 将
app.listen的第二个参数改为0.0.0.0,这样服务会监听容器所有可用的网络接口:
app.listen(PORT, "0.0.0.0", () => console.log("The server is running on port: %s", PORT) );
- 重新构建镜像并启动容器:
docker build -t my-app:1.0 . docker run -p 3001:3001 my-app:1.0
此时访问http://localhost:3001就能正常获取响应内容。
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

