Ubuntu 22.04 Docker 安装源对比:官方源 vs 系统源,规避 OCI 运行时错误的 3 个关键配置
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 上有三种主要安装方式:
- Ubuntu 系统源 (
docker.io包) - Ubuntu Snap 包 (
snap install docker) - 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
关键区别:
- 官方源 :默认配置为
systemdcgroup 驱动 - 系统源 :可能使用
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. 迁移检查清单
为确保从系统源迁移到官方源的过程顺利,请按以下清单操作:
- [ ] 备份重要容器和数据
- [ ] 记录当前容器和镜像列表 (
docker ps -a,docker images) - [ ] 卸载现有 Docker 安装
- [ ] 清理残留文件和配置
- [ ] 添加 Docker 官方源
- [ ] 安装 Docker 官方版本
- [ ] 配置
/etc/docker/daemon.json - [ ] 重启 Docker 服务
- [ ] 验证基本功能 (
docker run hello-world) - [ ] 恢复原有容器和镜像
- [ ] 运行环境检查脚本
- [ ] 根据检查结果调整配置
在最近一次为某中型企业部署容器平台时,我们按照这个清单操作,将 20 多台服务器的 Docker 环境从 Ubuntu 系统源迁移到官方源,整个过程零故障,原先频繁出现的 OCI 运行时错误完全消失。
更多推荐



所有评论(0)