You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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创建时间大小
apilatestf164f3da6ad24分钟前127MB
node16.13.0-alpine44e24535dfbf12个月前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无法安装必要模块。

验证修复步骤

  1. 修正app.js中的两个错误
  2. 重新构建镜像:sudo docker build -t api .
  3. 清理旧容器:sudo docker stop api && sudo docker rm api
  4. 重新启动容器:sudo docker run -d --init -p 3000:3000 --name api api
  5. 验证服务:执行curl http://localhost:3000,应返回类似{"now":1718xxxxxxx}的JSON结果。

内容的提问来源于stack exchange,提问作者user9989694

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:01:45