使用Docker Compose构建后localhost无法加载的排查求助
容器运行但端口无响应的排查建议
项目背景
项目结构
client src scripts app.js dockerfile package.json server app.js dockerfile package.json
client Dockerfile
FROM node WORKDIR /client RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm COPY package.json . RUN pnpm install COPY . . EXPOSE 3000 CMD ["pnpm", "start"]
server Dockerfile
FROM node WORKDIR /app RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm COPY ./package.json . RUN pnpm install COPY . . EXPOSE 80 CMD ["pnpm", "start"]
docker-compose.yaml
version: "3.8" services: server: build: ./server restart: always ports: - "80:80" volumes: - logs:/app/logs - ./server:/app - /app/node_modules client: build: ./client restart: always ports: - "3000:3000" volumes: - ./client/src:/app/src stdin_open: true tty: true volumes: data: logs:
执行docker compose build构建成功,docker compose up后容器显示运行,但访问localhost:3000或localhost:8080无响应,以下是排查建议:
检查容器状态与日志
- 执行
docker compose ps确认两个容器是否处于Up状态,有没有出现重启循环(状态显示Restarting) - 查看容器启动日志:
docker compose logs server和docker compose logs client,重点看pnpm start命令是否正常执行,有没有依赖安装失败、服务启动报错等信息
- 执行
修正服务监听地址
- Node.js服务默认常监听
127.0.0.1,但容器内的localhost与主机网络隔离,必须让服务监听0.0.0.0才能对外提供访问 - 检查client的开发服务器配置(如webpack-dev-server、vite),确保设置
host: '0.0.0.0';server端(express/koa等)要修改为app.listen(端口, '0.0.0.0')
- Node.js服务默认常监听
修复挂载卷路径不匹配问题
- client的Dockerfile设置的工作目录是
/client,但docker-compose中volume挂载的是./client/src:/app/src,路径不匹配会导致容器内找不到正确的代码文件 - 修正client的volume配置为:
./client/src:/client/src,与Dockerfile的WORKDIR保持一致
- client的Dockerfile设置的工作目录是
核对端口映射与实际监听端口
- server的端口映射是
80:80,所以主机应访问localhost:80而非localhost:8080,后者是错误的访问地址 - 进入容器确认端口监听情况:执行
docker compose exec server netstat -tulpn(若容器无netstat,可先安装apt install net-tools),查看是否有进程监听80端口;client同理执行docker compose exec client netstat -tulpn检查3000端口
- server的端口映射是
排查主机端口占用与防火墙
- 检查主机端口是否被其他进程占用:Linux/macOS用
lsof -i :80或lsof -i :3000,Windows用netstat -ano | findstr ":80",若被占用可修改compose的端口映射(如server改成8080:80) - 临时关闭主机防火墙测试(Linux执行
ufw disable,Windows在防火墙设置中临时关闭),确认是否是防火墙拦截了端口
- 检查主机端口是否被其他进程占用:Linux/macOS用
内容的提问来源于stack exchange,提问作者Taste of Leaving
相关产品推荐
相关产品推荐

