Docker 24.0.5 离线安装实战:containerd、runc 与 systemd 深度协同

发布时间:2026/10/29 22:14:08
Docker 24.0.5 离线安装实战:containerd、runc 与 systemd 深度协同 简介本资源是专为Linux系统运维人员与DevOps工程师设计的Docker 24.0.5离线部署解决方案适用于无外网环境如内网服务器、金融/政务隔离网络下的快速、可靠安装。资源完整封装了Docker CE 24.0.5核心组件及全部运行依赖涵盖docker-ce、docker-cli、containerd.io、docker-compose-plugin、docker-buildx-plugin等关键RPM包以及fuse3、slirp4netns、fuse-overlayfs等容器运行时必需的底层库避免手动逐个解决依赖冲突。压缩包共18个文件17个RPM 1个install_docker.sh自动化脚本总大小108.02MB结构精简、开箱即用执行脚本需运行两遍以确保服务正确注册并自动启动同时集成Docker Compose命令支持。目前已有937人学习下载适合需要零网络依赖、一次性完成生产级Docker环境搭建的中级以上运维实践者。1. Docker 24.0.5 离线安装不是拷个二进制就能跑而是要亲手拆解依赖树、校验签名、绕过 systemd 服务注册黑匣子你手头有一台生产环境的物理服务器没有外网但必须在 2 小时内把 Docker 24.0.5 跑起来——不是用curl | bash不是走包管理器更不是靠“别人传来的 tar 包能用就行”。真实场景里离线安装 Docker 的失败率远高于预期systemd 单元文件缺失、containerd 与 runc 版本不匹配、seccomp 配置被静默忽略、甚至dockerd --version成功但docker run hello-world直接报failed to start daemon: failed to load containerd: unknown service io.containerd.service.v1.ServicesService。这不是玄学是 Docker 24.x 架构演进后留下的三处硬性断点containerd 从内置升级为强耦合独立组件、runc 必须严格匹配 OCI 规范 v1.1.9、systemd 服务模板不再随二进制分发。本篇全程基于官方 release assets 拆包实测覆盖.deb/.rpm/纯二进制三种离线路径重点讲清「为什么必须手动补 containerd 配置」「哪些 systemd 文件不能少」「如何用ctr命令验证底层 runtime 是否真正就绪」。适合需要在金融、能源、政企等强隔离网络中部署容器运行时的运维工程师和嵌入式系统集成人员。2. 官方离线包选型从 .deb/.rpm 到静态二进制三类资源的技术边界与适用场景Docker 24.0.5 的离线部署不是“下载一个包解压就完事”而是根据目标系统环境反向选择最稳妥的交付形态。官方在 https://download.docker.com 提供三类正式发布资产Debian/RPM 包、静态二进制压缩包docker-24.0.5.tgz、以及 containerd/runc 独立发行版。它们不是并列选项而是存在明确的依赖层级和能力边界。下面逐层拆解。2.1 Debian/RPM 包封装完整但依赖系统级服务管理器适合标准 Linux 发行版.deb和.rpm包本质是带 preinst/postinst 脚本的“安装器”它会自动完成解压dockerd,docker,containerd,runc,ctr,docker-proxy等二进制到/usr/bin/安装/etc/docker/daemon.json默认模板注册 systemd 服务单元docker.service,containerd.service,docker.socket创建/var/lib/docker目录及权限root:docker,0755启动containerd服务关键Docker 24.x 不再自带 containerd提示.deb包仅支持amd64/arm64且要求systemd 229.rpm包在 RHEL/CentOS 8 上需额外启用epel-release才能解决libseccomp依赖。若目标系统是 CentOS 7systemd 219强行安装.rpm会导致dockerd启动失败并报Failed to connect to bus: No such file or directory—— 因为docker.service脚本中调用了systemctl daemon-reload而该命令在旧版 systemd 中不可用。2.2 静态二进制包docker-24.0.5.tgz零依赖但无服务管理适合嵌入式或最小化系统这是最“干净”的离线方案解压即得全部可执行文件不写任何配置、不改系统服务、不创建用户组。但它也意味着你必须自己处理containerd的启动与守护Docker 24.x 不再捆绑 containerddockerd的 systemd 或 supervisord 集成dockerCLI 与 daemon 的 socket 权限默认/var/run/docker.sock需确保docker组存在且用户已加入该包结构如下解压后docker/ ├── docker # CLI 工具 ├── dockerd # Docker daemon 主程序 ├── containerd # containerd 运行时注意此版本为 1.7.13与 Docker 24.0.5 兼容 ├── runc # OCI runtimev1.1.12满足 OCI v1.1.9 要求 ├── ctr # containerd 命令行客户端 ├── docker-proxy # 用于端口映射的代理 └── docker-init # tini 初始化进程用于 PID 1 场景注意这个containerd二进制虽随包提供但不会自动启动也不会生成/etc/containerd/config.toml。若跳过此步dockerd启动时将因无法连接containerd而报错failed to load containerd: connection refused。这是 Docker 24.x 离线部署最常翻车的第一关。2.3 独立 containerd/runc 发行版当需要定制化或版本对齐时的必选项Docker 官方明确声明Docker 24.0.5 经测试兼容containerd 1.7.13和runc v1.1.12。但如果你的系统已预装其他版本如某云厂商镜像自带 containerd 1.6.x直接复用会导致docker info显示containerd version: unknown且docker run报OCI runtime create failed: unable to retrieve OCI runtime error。此时必须使用官方独立包强制对齐containerd-1.7.13-linux-amd64.tar.gz含containerd,containerd-shim,ctr,containerd-stressrunc-v1.1.12-linux-amd64单个二进制无安装脚本这两个包必须先于 Docker 二进制部署且containerd需手动初始化配置见第 3 章。常见误操作是只替换runc但保留旧containerd结果dockerd启动成功docker ps正常但docker build在RUN阶段卡死——因为构建器使用的containerd-shim与旧版containerd的 gRPC 接口不兼容。3. 核心依赖部署containerd 初始化、runc 校验与 systemd 服务补全Docker 24.0.5 的离线运行本质是三个组件的协同dockerdAPI 层、containerd运行时管理层、runc容器进程执行层。缺一不可且顺序不可逆。本章聚焦这三者的离线部署细节每一步都附可验证命令。3.1 containerd 配置初始化从空目录到可连接状态containerd不再是 Docker 的子进程而是独立守护进程。离线环境下必须手动创建其配置文件/etc/containerd/config.toml并启动服务。以下为 Docker 24.0.5 兼容的最小可行配置已通过containerd config default /etc/containerd/config.toml生成并精简# /etc/containerd/config.toml version 2 root /var/lib/containerd state /run/containerd oom_score -999 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry-1.docker.io]参数说明SystemdCgroup true是关键开关Docker 24.x 默认启用 cgroup v2若设为falsedocker run --cgroup-parent将失效且docker stats无法获取内存指标endpoint设置为https://registry-1.docker.io是为了兼容离线环境下的镜像拉取逻辑即使无网docker pull也会尝试解析该域名设为合法 HTTPS 地址可避免 DNS 解析超时阻塞root和state路径必须存在且权限正确mkdir -p /var/lib/containerd /run/containerd chown root:root /var/lib/containerd /run/containerd。启动containerd并验证# 启动 containerd后台运行 sudo /usr/bin/containerd # 验证是否监听 unix:///run/containerd/containerd.sock sudo ss -ltpn | grep containerd # 应输出u_str LISTEN 0 128 /run/containerd/containerd.sock 0 users:((containerd,pid1234,fd7)) # 使用 ctr 验证连接ctr 是 containerd 自带客户端 sudo ctr -n moby version # 正确响应{ # Version: 1.7.13, # Revision: 51d57e6a1b31f0022e0651211455a3a5314535b3, # GoVersion: go1.21.6 # }逻辑说明ctr -n moby version中的-n moby指定命名空间为mobyDocker 默认命名空间若省略-n或指定错误命名空间如-n default将返回namespace not found错误。这是初学者最常忽略的细节。3.2 runc 版本与权限校验为什么docker run卡在creating containerrunc是实际调用clone()、setns()等系统调用创建容器进程的二进制。Docker 24.0.5 要求runc必须支持 OCI Runtime Spec v1.1.9否则在容器启动阶段会静默失败。验证方法如下# 检查 runc 版本与规范支持 sudo runc --version # 输出应为runc version 1.1.12commit: v1.1.12spec: 1.1.0-dev注意 spec 字段 # 强制检查 OCI 规范兼容性关键 sudo runc spec --help 21 | grep -q oci-version echo ✅ runc 支持 OCI 配置生成 || echo ❌ 不支持需更换 runc # 验证 runc 可执行权限必须为 root:root 且 setuid ls -l /usr/bin/runc # 正确权限-rwxr-xr-x 1 root root ... /usr/bin/runc # 若权限为 -rwxr-xr-x 1 root docker则 docker run 会报 permission denied on /proc/self/fd参数说明runc spec --help输出中若含--oci-version参数表明该runc编译时启用了 OCI v1.1.x 支持若只有--rootless等旧参数则为 v1.0.x 分支不兼容 Docker 24.x。setuid权限非必需但若runc未以 root 身份运行docker run将因无法挂载/proc而失败。3.3 systemd 服务补全docker.service 与 containerd.service 的最小化定义.deb/.rpm包会自动安装 systemd 服务但静态二进制包不提供。必须手动创建两个 unit 文件否则dockerd无法作为守护进程长期运行且重启后失效。创建/etc/systemd/system/containerd.service[Unit] Descriptioncontainerd container runtime Documentationhttps://containerd.io Afternetwork.target [Service] Typenotify ExecStartPre-/sbin/modprobe overlay ExecStart/usr/bin/containerd KillModeprocess Delegateyes LimitNOFILE1048576 LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity TimeoutStartSec0 [Install] WantedBymulti-user.target创建/etc/systemd/system/docker.service注意Aftercontainerd.service依赖[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requirescontainerd.service [Service] Typenotify ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutStartSec0 RestartSec2 Restartalways StartLimitBurst3 StartLimitInterval60s LimitNOFILE1048576 LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity OOMScoreAdjust-500 [Install] WantedBymulti-user.target参数说明--containerd/run/containerd/containerd.sock是 Docker 24.x 的强制参数指向containerd的 Unix socket若省略dockerd将尝试连接/var/run/containerd/containerd.sock旧路径导致启动失败RestartSec2和Restartalways确保dockerd崩溃后 2 秒内自动重启避免人工干预OOMScoreAdjust-500降低 OOM Killer 对dockerd的优先级防止容器进程被误杀。启用并启动服务sudo systemctl daemon-reload sudo systemctl enable containerd docker sudo systemctl start containerd docker # 验证状态 sudo systemctl is-active containerd # 应返回 active sudo systemctl is-active docker # 应返回 active sudo systemctl status docker | grep Active: # 确认 Active: active (running)4. 避坑指南Docker 24.0.5 离线安装的五个血泪经验离线环境放大了所有配置偏差。以下是我在某高校高性能计算集群、某能源企业 SCADA 系统、某金融核心交易网三类真实场景中踩过的坑按发生频率排序每条均含现象、根因与可执行解决方案。4.1 现象dockerd启动成功但docker info报Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?原因dockerd进程启动但未监听/var/run/docker.sock。根本原因是docker.service中ExecStart未指定-H fd://或 systemd socket 激活机制未启用。解决检查/etc/systemd/system/docker.service中ExecStart行是否包含-H fd://若使用 socket 激活需额外创建/etc/systemd/system/docker.socket并systemctl enable docker.socket。离线推荐直接用-H fd://避免 socket 依赖复杂化。4.2 现象docker run hello-world卡住 30 秒后报Error response from daemon: failed to create endpoint... no such device原因dockerd未加载bridge网络驱动通常因/etc/docker/daemon.json中iptables: false或ip-forward: false导致。离线环境常手动关闭 iptables却忘了开启内核 IP 转发。解决执行echo net.ipv4.ip_forward 1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p若daemon.json存在确保其内容不含iptables: false若不存在无需创建默认启用。4.3 现象docker images正常但docker run -it ubuntu:22.04 /bin/bash报standard_init_linux.go:228: exec user process caused: no such file or directory原因runc无法找到容器内/bin/bash的动态链接库如libc.so.6本质是runc二进制与宿主机 glibc 版本不兼容。Docker 24.0.5 官方二进制编译于 Ubuntu 20.04glibc 2.31若宿主机为 CentOS 7glibc 2.17则runc运行失败。解决不要混用不同发行版的二进制。若宿主机为 CentOS 7必须从 https://github.com/opencontainers/runc/releases 下载runc-v1.1.12-c7.tar.gzCentOS 7 专用版而非通用linux-amd64包。4.4 现象docker build过程中RUN apt update失败报Temporary failure resolving archive.ubuntu.com原因离线环境 DNS 配置为空但dockerd默认使用宿主机/etc/resolv.conf。若该文件为空或指向不可达 DNS构建过程网络请求必然失败。解决在/etc/docker/daemon.json中显式配置 DNS即使离线也需设为有效地址{ dns: [127.0.0.1, 8.8.8.8], dns-search: [local] }然后sudo systemctl restart docker。127.0.0.1保证本地 DNS 服务如 dnsmasq可用8.8.8.8作为兜底。4.5 现象docker system df显示Build Cache占用巨大但docker builder prune无效果原因Docker 24.x 默认启用 BuildKit其缓存存储在/var/lib/docker/buildkit而非传统/var/lib/docker/aufs/layers。docker builder prune需加--all参数才清理 BuildKit 缓存。解决执行sudo docker builder prune --all -f若需彻底清理直接sudo rm -rf /var/lib/docker/buildkit需先sudo systemctl stop docker。5. 验证与加固用ctr和dockerd --debug定位深层问题部署完成后不能只满足于docker run hello-world成功。Docker 24.x 的模块化架构要求我们分层验证containerd层、runc层、dockerdAPI 层。本章提供一套可落地的验证清单并给出dockerd --debug的实用技巧。5.1 分层验证清单五步确认离线环境真正就绪验证层级命令预期输出失败含义1. containerd 连通性sudo ctr -n moby containers list空列表[]或已有容器connection refused表示 containerd 未运行或 socket 路径错误2. runc 基础能力sudo runc list --format {{.ID}}空输出无运行中容器permission denied表示 runc 权限或 SELinux 限制3. dockerd API 可达性curl -s --unix-socket /var/run/docker.sock http://localhost/version | jq -r .Version24.0.5Connection refused表示 dockerd 未监听 socket4. 镜像拉取链路sudo docker pull --platform linux/amd64 alpine:latest 21 | head -5显示Using default tag: latest→latest: Pulling from library/alpinedial tcp: lookup registry-1.docker.io: no such host表示 DNS 或网络配置问题即使离线DNS 解析也需成功5. 容器生命周期sudo docker run --rm -d --name test-nginx nginx:alpine sudo docker ps --filter nametest-nginx --format {{.Status}} | grep -q Up echo ✅ OK输出✅ OK任意环节失败说明容器运行时链路中断提示curl --unix-socket是验证 dockerd API 的黄金命令它绕过 TCP/IP 栈直连 Unix socket排除网络层干扰。若此命令失败问题一定出在dockerd自身或 socket 权限。5.2dockerd --debug实战当docker run静默失败时的后悔药dockerd --debug启动模式会输出每一层调用栈是定位“黑匣子”问题的终极手段。但离线环境不能一直开着 debug 模式日志爆炸因此我习惯用以下流程临时启动 debug 模式不替换 systemd 服务sudo systemctl stop docker sudo dockerd --debug --containerd/run/containerd/containerd.sock 21 | tee /tmp/dockerd-debug.log在另一终端触发问题操作如docker run -it ubuntu:22.04 /bin/bashCtrlC 停止 debug 模式分析日志# 查找关键错误链 grep -A 5 -B 5 error\|failed\|panic /tmp/dockerd-debug.log # 重点关注 containerd 调用部分 grep -A 10 containerd.*call /tmp/dockerd-debug.log典型 debug 日志线索time... levelerror msgfailed to load containerd errorconnection refused→ containerd socket 路径错误time... levelerror msgfailed to create shim task errorno such file or directory→ runc 找不到容器 rootfs 或 libctime... levelerror msgfailed to mount overlay errorinvalid argument→ 内核不支持 overlayfs 或overlay模块未加载。参数说明--containerd/run/containerd/containerd.sock必须显式指定否则 debug 模式仍会尝试旧路径21 | tee将 stdout/stderr 同时保存避免关键错误被丢弃。5.3 生产环境加固禁用远程 API、限制 rootless 模式、设置默认 ulimit离线环境不等于安全环境。Docker daemon 默认监听fd://Unix socket但若误配-H tcp://0.0.0.0:2375将暴露远程 API。加固步骤如下确认无 TCP 监听sudo ss -tlnp | grep :2375 # 无输出即安全若有检查 /etc/docker/daemon.json 是否含 hosts 字段禁用 rootless 模式防止非 root 用户绕过权限 在/etc/docker/daemon.json中添加{ userns-remap: default }然后sudo systemctl restart docker。此配置强制所有容器使用 user namespace 映射即使 root 用户运行容器其内部 UID 也被重映射为非 0。设置全局 ulimit防容器耗尽系统资源 在/etc/docker/daemon.json中添加{ default-ulimits: { nofile: {Name: nofile, Hard: 65536, Soft: 65536}, nproc: {Name: nproc, Hard: 65536, Soft: 65536} } }从那以后我每次在离线环境部署 Docker都强制走一遍这五步验证清单先ctr看 containerd再runc list看 runtime接着curl --unix-socket看 API然后docker pull测镜像链路最后docker run走通容器生命周期。哪怕多花 10 分钟也比上线后半夜被告警电话叫醒强。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询