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

如何在Docker-in-Docker容器中同时运行Node.js服务与Docker守护进程

解决方案:同时启动Docker守护进程与Node.js服务

问题核心在于docker:dind镜像的默认启动命令是启动Docker守护进程(dockerd),但你自定义的CMD ["npm","start"]覆盖了这个默认行为,导致只有Node.js服务启动,Docker守护进程未运行。要同时启动两者,需要用一个启动脚本协调两个进程的启动顺序。

步骤1:创建启动脚本

在项目根目录新建start.sh文件,内容如下:

#!/bin/sh

# 后台启动Docker守护进程,同时监听TCP和Unix套接字
dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &

# 等待Docker守护进程完全就绪
until docker info >/dev/null 2>&1; do
    echo "等待Docker守护进程启动..."
    sleep 1
done

# 启动Node.js服务
npm start

步骤2:修改Dockerfile

更新你的Dockerfile,添加脚本复制、权限设置,并替换启动命令:

FROM docker:23.0.6-dind-alpine3.18

RUN apk update && \
    apk add --no-cache nodejs npm iptables bash && \
    apk add --no-cache --upgrade bash

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install --force --verbose

COPY . .
COPY start.sh .
RUN chmod +x start.sh

RUN npm run completeBuild

EXPOSE 4000 2375 2376

CMD ["/usr/src/app/start.sh"]

步骤3:重新构建并运行

执行原有的构建和运行命令即可:

docker build -t trydocker .
docker run --privileged -it -p 4000:4000 -p 2375:2375 -p 2376:2376 trydocker

关键说明

  • 脚本先后台启动dockerd,通过循环执行docker info判断守护进程是否就绪,避免Node.js服务启动后调用Docker命令时出现连接失败。
  • dockerd同时监听TCP和Unix套接字,既支持容器内部通过unix:///var/run/docker.sock访问,也支持外部通过localhost:2375连接(如果需要)。
  • 保持--privileged参数,这是dind运行的必要条件,用于授予容器足够权限管理宿主机的Docker资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:35:43