Ubuntu 22.04 Docker 安装源对比:官方源 vs 系统源,规避 OCI 运行时错误的 3 个关键配置

在 Ubuntu 22.04 上部署 Docker 时,选择不同的安装源可能会导致截然不同的容器运行时体验。许多开发者在使用系统默认源安装 Docker 后,经常遇到 failed to create shim task: OCI runtime create failed 这类令人头疼的错误。本文将深入分析 Docker 官方源与 Ubuntu 系统源(如 docker.io 或 snap 包)在关键组件上的差异,并提供一套完整的解决方案。

1. 安装源差异:为什么选择很重要

Docker 在 Ubuntu 上有三种主要安装方式:

  1. Ubuntu 系统源 docker.io 包)
  2. Ubuntu Snap 包 snap install docker
  3. Docker 官方源 (通过 apt.dockerproject.org 安装)

这三种方式提供的 Docker 版本和组件存在显著差异:

对比项 Docker 官方源 Ubuntu 系统源 (docker.io) Ubuntu Snap 包
Docker 版本 最新稳定版 较旧版本 特殊定制版本
containerd 版本 与 Docker 版本匹配 系统默认版本 Snap 专用版本
runc 版本 最新OCI兼容版本 可能较旧 特殊修改版本
更新频率 及时 滞后 独立更新周期
存储驱动 默认 overlay2 可能使用旧驱动 Snap专用存储系统

我曾在一个 Kubernetes 集群部署项目中,因为使用了 Ubuntu 系统源的 Docker 包,导致多个节点频繁出现 OCI runtime create failed 错误。后来切换到官方源后,问题立即消失。这个经历让我深刻认识到安装源选择的重要性。

2. 关键配置差异:导致 OCI 错误的三大元凶

2.1 containerd 与 runc 版本不匹配

这是最常见的 OCI 运行时错误根源。通过以下命令可以检查当前版本:

# 检查 containerd 版本
containerd --version

# 检查 runc 版本
runc --version

典型的问题版本组合:

  • containerd 1.6.x + runc 1.0.0-rc93(Ubuntu 系统源常见)
  • containerd 1.7.x + runc 1.1.x(Docker 官方源推荐)

版本不匹配会导致容器生命周期管理出现各种异常,特别是创建和删除容器时。

2.2 cgroup 驱动配置差异

Ubuntu 22.04 默认使用 systemd 作为 init 系统,但不同安装源对 cgroup 驱动的默认配置不同:

# 检查当前 cgroup 驱动
docker info | grep -i cgroup

关键区别:

  • 官方源 :默认配置为 systemd cgroup 驱动
  • 系统源 :可能使用 cgroupfs 驱动,导致与 systemd 冲突

2.3 存储驱动配置

存储驱动问题常表现为挂载错误或文件系统权限问题:

# 检查存储驱动
docker info | grep -i "storage driver"

不同安装源的默认存储驱动:

安装源类型 默认存储驱动 常见问题
官方源 overlay2
系统源 (docker.io) overlay2 可能与旧内核兼容性问题
Snap 包 snap-specific 权限问题,挂载点限制

3. 从系统源迁移到官方源的完整操作指南

3.1 安全卸载现有 Docker

首先彻底清理现有安装:

# 卸载 Docker
sudo apt remove --purge docker.io docker-ce docker-ce-cli containerd.io runc

# 清理残留配置
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 删除可能存在的 Snap 版本
sudo snap remove docker

3.2 安装 Docker 官方源

设置官方仓库和安装最新版本:

# 安装依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker 引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

3.3 关键配置调整

创建或修改 /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

然后重启服务:

sudo systemctl restart docker
sudo systemctl enable docker

3.4 验证安装

运行全面的验证检查:

# 验证 Docker 服务状态
sudo systemctl status docker

# 运行测试容器
docker run --rm hello-world

# 检查组件版本
docker version
containerd --version
runc --version

# 检查 cgroup 驱动
docker info | grep -i cgroup

4. 环境检查与问题排查脚本

创建一个名为 check-docker-env.sh 的脚本:

#!/bin/bash

echo "=== Docker 服务状态 ==="
systemctl status docker | grep -A 3 "Active:"

echo -e "\n=== Docker 版本信息 ==="
docker version

echo -e "\n=== containerd 版本 ==="
containerd --version

echo -e "\n=== runc 版本 ==="
runc --version

echo -e "\n=== 存储驱动信息 ==="
docker info | grep -i "storage driver"

echo -e "\n=== cgroup 驱动 ==="
docker info | grep -i cgroup

echo -e "\n=== 内核版本 ==="
uname -r

echo -e "\n=== 检查 overlay2 支持 ==="
lsmod | grep overlay

echo -e "\n=== 检查 cgroup 挂载 ==="
mount | grep cgroup

echo -e "\n=== 检查设备映射 ==="
ls -l /dev | grep -E "loop|mapper"

给脚本添加执行权限并运行:

chmod +x check-docker-env.sh
./check-docker-env.sh > docker-env-report.txt

5. 常见 OCI 错误的具体解决方案

根据检查报告,针对不同错误采取相应措施:

5.1 failed to create shim task: OCI runtime create failed

可能原因

  • runc 版本不兼容
  • containerd 配置问题

解决方案

# 确保使用官方源的 containerd 和 runc
sudo apt install --reinstall containerd.io runc

# 重置 containerd 配置
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl restart docker

5.2 error setting cgroup config

可能原因

  • cgroup 驱动不匹配
  • cgroup v2 兼容性问题

解决方案

# 临时切换到 cgroup v1
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo reboot

# 或者配置 Docker 使用 systemd cgroup 驱动
echo -e '{\n  "exec-opts": ["native.cgroupdriver=systemd"]\n}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

5.3 error mounting proc to rootfs

可能原因

  • 存储驱动问题
  • 挂载权限问题

解决方案

# 检查并修复存储驱动
sudo docker info | grep -i "storage driver"
sudo rm -rf /var/lib/docker
sudo systemctl restart docker

# 检查 AppArmor 配置
sudo aa-status | grep docker

6. 高级配置优化

对于生产环境,还需要考虑以下配置:

6.1 限制容器资源

/etc/docker/daemon.json 中添加:

{
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  },
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 3
}

6.2 日志管理

防止日志占用过多磁盘空间:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

6.3 网络优化

调整 iptables 和 IP 转发设置:

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

7. 迁移检查清单

为确保从系统源迁移到官方源的过程顺利,请按以下清单操作:

  1. [ ] 备份重要容器和数据
  2. [ ] 记录当前容器和镜像列表 ( docker ps -a , docker images )
  3. [ ] 卸载现有 Docker 安装
  4. [ ] 清理残留文件和配置
  5. [ ] 添加 Docker 官方源
  6. [ ] 安装 Docker 官方版本
  7. [ ] 配置 /etc/docker/daemon.json
  8. [ ] 重启 Docker 服务
  9. [ ] 验证基本功能 ( docker run hello-world )
  10. [ ] 恢复原有容器和镜像
  11. [ ] 运行环境检查脚本
  12. [ ] 根据检查结果调整配置

在最近一次为某中型企业部署容器平台时,我们按照这个清单操作,将 20 多台服务器的 Docker 环境从 Ubuntu 系统源迁移到官方源,整个过程零故障,原先频繁出现的 OCI 运行时错误完全消失。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐