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

在Alpine容器中安装启动Docker守护进程遇异常求助

问题分析与解决方案

问题本质

你这是在Docker容器里尝试运行Docker daemon(也就是Docker-in-Docker,简称DinD),但操作逻辑不符合容器的运行规则:

  1. OpenRC是Linux系统的初始化服务,而Docker容器默认的PID 1进程不是OpenRC,导致service命令无法正常识别服务管理环境,出现初始化相关报错。
  2. Docker daemon需要访问宿主机的内核资源,普通容器的隔离权限不足以支撑它启动,所以会出现“无法连接daemon”但又提示“正在启动”的矛盾状态。

解决方法

方法1:使用官方Docker-in-Docker镜像(最省心)

官方已经封装好了配置完整的DinD镜像,直接用以下命令启动容器即可:

# 启动后台运行的DinD容器
docker run -d --privileged --name my-dind docker:dind

# 进入容器操作
docker exec -it my-dind sh

进入容器后直接执行docker images、docker run等命令就能正常使用,无需额外配置。

方法2:自定义Alpine DinD镜像(适合个性化需求)

如果一定要基于Alpine自己构建,按以下步骤操作:

  1. 修改你的Dockerfile:
FROM alpine:latest

# 安装Docker和OpenRC依赖
RUN apk add --no-cache docker openrc

# 创建OpenRC必需的运行目录并初始化标记文件
RUN mkdir -p /run/openrc && touch /run/openrc/softlevel

# 设置Docker服务开机自启(可选)
RUN rc-update add docker default
  1. 构建镜像:
docker build -t alpine-dind .
  1. 启动容器时必须添加--privileged权限,并指定OpenRC作为容器的初始化进程:
docker run -it --privileged alpine-dind /sbin/init

进入容器后,执行service docker start就能正常启动Docker daemon,之后就可以使用docker images等命令了。


为什么之前的操作会报错?

  • 执行touch /run/openrc/softlevel报错,是因为/run/openrc目录不存在,需要先创建这个目录才能生成标记文件。
  • 提示“docker is already starting”但无法连接daemon,是因为容器没有--privileged权限,Docker daemon无法获取足够的系统资源完成启动,同时OpenRC因为不是PID 1进程,状态检测逻辑混乱。
  • 容器默认的PID 1不是OpenRC,导致service命令的运行环境不完整,无法正确管理Docker服务。

新手注意事项

  • 非必要情况下优先用官方DinD镜像,避免自己配置的各种坑。
  • --privileged权限会降低容器的隔离性,生产环境使用要谨慎评估风险。
  • 容器内的Docker环境和宿主机是完全独立的,容器里创建的镜像、容器不会同步到宿主机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:18