Docker构建生成两个镜像且Web服务器无法启动求助
Docker构建后出现双镜像+Web服务无法连接的问题及解决
问题背景
尝试搭建简易Web服务器学习Docker Compose,构建镜像后本地出现两个镜像,且执行curl http://localhost:3000返回连接拒绝错误。
相关代码与操作
app.js代码
'use strict'; const cors = require('cors'); const { request } = require('express'); const express = require('express'); const {flaschenpost} = request('flaschenpost'); const http = require('http'); const logger = flaschenpost.getLogger(); const api = express(); api.use(cors()); api.get('/', (req,res) => { res.json( { now: Date.now() }); }); const server = http.createServer(api); const port = 3_000; server.listen(post, ()=> { logger.info('Server started.', {port}); });
Dockerfile内容
FROM node:16.13.0-alpine USER node WORKDIR /home/node COPY --chown=node:node ./package.json ./package.json COPY --chown=node:node ./package-lock.json ./package-lock.json RUN npm install --production COPY --chown=node:node . . CMD [ "node", "app.js"]
执行命令
- 构建镜像:
sudo docker build -t api - 运行容器:
sudo docker run -d --init -p 3000:3000 --name api api
镜像列表(docker images输出)
| 仓库名 | 标签 | 镜像ID | 创建时间 | 大小 |
|---|---|---|---|---|
| api | latest | f164f3da6ad2 | 4分钟前 | 127MB |
| node | 16.13.0-alpine | 44e24535dfbf | 12个月前 | 110MB |
错误信息
执行curl http://localhost:3000返回:
curl: (7) Failed to connect to localhost port 3000 after 0 ms: Connection refused
问题解决
1. 为什么会出现两个镜像?
这是正常现象:你构建的api:latest镜像基于node:16.13.0-alpine基础镜像,Docker会自动下载基础镜像到本地缓存,所以你看到的两个镜像,一个是自定义的api镜像,另一个是它依赖的官方Node.js基础镜像,无需处理。
2. Web服务无法连接的核心原因及修复
你的app.js存在两个致命错误,导致Node.js服务无法启动:
- 模块引入错误:
const {flaschenpost} = request('flaschenpost');中的request是express导出的请求对象,不能用来加载模块,需改为require:const { flaschenpost } = require('flaschenpost'); - 端口变量拼写错误:
server.listen(post, ...)中的post是笔误,应改为定义好的port变量:server.listen(port, ()=> { logger.info('Server started.', {port}); });
3. 其他潜在问题排查
- 构建命令遗漏上下文路径:原命令
sudo docker build -t api缺少当前目录.,完整命令应为sudo docker build -t api .,否则Docker无法找到Dockerfile和项目文件。 - 检查
package.json:确保已添加express、cors、flaschenpost三个依赖,否则npm install无法安装必要模块。
验证修复步骤
- 修正app.js中的两个错误
- 重新构建镜像:
sudo docker build -t api . - 清理旧容器:
sudo docker stop api && sudo docker rm api - 重新启动容器:
sudo docker run -d --init -p 3000:3000 --name api api - 验证服务:执行
curl http://localhost:3000,应返回类似{"now":1718xxxxxxx}的JSON结果。
内容的提问来源于stack exchange,提问作者user9989694
相关产品推荐
相关产品推荐

