影评周公子 2026-04-13 19:15 采纳率: 98.9%
浏览 0
已采纳

docker-18.06.3-ce.tgz离线安装后无法启动dockerd,如何排查?

**问题描述(186词):** 使用 `docker-18.06.3-ce.tgz` 离线解压安装后,执行 `dockerd` 报错退出(如 `failed to start daemon: pid file found, ensure docker is not running` 或直接段错误/无日志),常见原因有四类:① **依赖缺失**——未安装 `containerd.io`(该版本强依赖 containerd 1.2.x)、`runc`、`iptables` 或 `libseccomp`;② **二进制权限/路径异常**——`dockerd` 未设可执行权限,或 `/usr/bin` 未在 `$PATH` 中,导致 systemd 服务启动时找不到二进制;③ **配置冲突**——残留旧版 `/var/run/docker.sock`、`/var/lib/docker` 或 `/etc/docker/daemon.json` 中启用了不兼容参数(如 `live-restore: true` 与旧内核冲突);④ **内核不兼容**——CentOS 7.2 以下或内核 < 3.10.0-693,缺少 overlay2 支持或 cgroup v2 不兼容。排查应按序检查:`ldd /usr/bin/dockerd` 缺失库、`journalctl -u docker -n 50 --no-pager` 查原始日志、`dockerd --debug --log-level=debug` 手动前台运行捕获实时错误,并验证 `containerd` 是否已独立安装并运行。
  • 写回答

1条回答 默认 最新

  • 大乘虚怀苦 2026-04-13 19:16
    关注
    ```html

    一、现象定位:从报错表象切入本质

    离线部署 docker-18.06.3-ce.tgz 后执行 dockerd 即退出,典型错误包括:failed to start daemon: pid file found, ensure docker is not running(伪死锁假象)、段错误(SIGSEGV)、静默崩溃(无日志输出)。该版本为 Docker CE 18.06 系列的最终 LTS 版本,强绑定 containerd 1.2.13(非 1.3+ 或 1.4+),且对内核子系统(cgroup v1/overlay2)、用户态依赖(libseccomp≥2.3.0)、网络工具链(iptables≥1.4.21)存在精确版本契约。直接解压未校验依赖即启动,90%以上失败源于“依赖幻觉”——误以为 tar 包含全部运行时。

    二、依赖验证:四阶依赖链完整性审计

    依赖项最低要求验证命令关键风险点
    containerd.io1.2.13-1.el7containerd --version && systemctl is-active containerd若用 1.4.x 替代,dockerd 启动时因 GRPC 接口变更直接 panic
    runc1.0.0-rc6runc --version(须与 docker-18.06.3 源码编译时 runc commit 匹配)CentOS 7.2 默认 runc 1.0.0-rc5,缺少 --no-pivot 支持,导致 overlay2 挂载失败
    libseccomp≥2.3.0rpm -q libseccompldd /usr/bin/dockerd | grep seccompEL7.2 默认 2.2.1,dockerd 加载 seccomp profile 时 SIGABRT

    三、二进制与环境就绪性诊断

    执行以下原子化检查(按序不可跳过):

    1. chmod +x /usr/bin/dockerd /usr/bin/docker —— 解压后权限常为 644,systemd 以 root 调用但拒绝执行非 x 权限二进制;
    2. echo $PATH | grep '/usr/bin' —— 若缺失,systemd service 文件中需显式指定 ExecStart=/usr/bin/dockerd,否则 fallback 到 PATH 查找失败;
    3. ldd /usr/bin/dockerd | grep "not found" —— 常见缺失:libsystemd.so.0(需安装 systemd-libs)、libseccomp.so.2(需升级 libseccomp);

    四、配置冲突与状态残留治理

    残留状态是“pid file found”类错误的主因。执行标准化清理:

    # 停止所有相关进程(含僵尸 containerd)
    sudo pkill -f 'containerd\|dockerd'
    # 彻底清除运行时状态
    sudo rm -f /var/run/docker.sock /var/run/docker.pid /var/run/containerd/
    sudo rm -rf /var/lib/docker /var/lib/containerd
    # 审计 daemon.json 兼容性(18.06.3 不支持 live-restore=true、cgroup-parent=systemd)
    sudo sed -i '/live-restore\|cgroup-parent/d' /etc/docker/daemon.json
    sudo systemctl daemon-reload
    

    五、内核兼容性深度验证

    Docker 18.06.3 的内核契约极为严格:

    • cgroup:必须启用 cgroup_enable=memory swapaccount=1 内核参数(cat /proc/cmdline);
    • overlay2:需 CONFIG_OVERLAY_FS=yzcat /proc/config.gz | grep OVERLAY 或查 /lib/modules/$(uname -r)/build/.config);
    • 内核版本红线:uname -r 必须 ≥ 3.10.0-693.el7(CentOS 7.4+),低于此版本默认禁用 overlay2,且 cgroup v2 未被识别为不兼容而静默降级失败。

    六、调试路径:三层日志穿透法

    按优先级执行以下调试序列(任一环节发现问题即终止后续):

    1. 系统服务层journalctl -u docker -n 100 --no-pager --since "1 hour ago" —— 捕获 systemd 启动上下文(如 Failed at step EXEC spawning 直接指向权限或 PATH 问题);
    2. 守护进程层sudo dockerd --debug --log-level=debug --data-root /tmp/docker-test --pidfile /tmp/dockerd.pid —— 前台运行,实时输出初始化各阶段(plugin load, graphdriver init, containerd connect);
    3. 底层通信层sudo strace -f -e trace=connect,openat,socket -s 256 dockerd --no-daemon —— 观察是否卡在连接 /run/containerd/containerd.sock 或 open /lib64/libseccomp.so.2

    七、容器运行时协同验证流程图

    graph TD A[启动 dockerd] --> B{检查 containerd 是否运行?} B -->|否| C[启动 containerd --config /etc/containerd/config.toml] B -->|是| D[尝试 dial unix:///run/containerd/containerd.sock] C --> D D --> E{连接成功?} E -->|否| F[报错:failed to dial containerd... check containerd status] E -->|是| G[加载 graphdriver overlay2] G --> H{overlay2 初始化成功?} H -->|否| I[检查内核 CONFIG_OVERLAY_FS & /proc/sys/user/max_user_namespaces] H -->|是| J[启动完成]
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 4月14日
  • 创建了问题 4月13日