升级docker后旧容器启动失败报“unknown runtime specified docker-runc”,本质是新版本弃用docker-runc、改用runc,需将/var/lib/docker/containers/中配置里的docker-runc批量替换为runc,再重启docker服务。

升级 Docker 后旧容器启动失败,常见报错如 “Unknown runtime specified docker-runc” 或 “unknown or invalid runtime name”,本质是新版本弃用旧运行时路径或配置不兼容。回退不是必须降级 Docker,多数情况可修复而非回滚——优先尝试配置修复,再考虑版本回退。
直接修复运行时引用(推荐首选)
新 Docker(18.09+)默认使用 runc 作为运行时二进制名,但旧容器元数据里仍硬编码为 docker-runc。只需批量替换容器配置中的错误名称:
- 定位容器配置目录(常见路径):
CentOS/通用系统:/var/lib/docker/containers/
宝塔面板:/www/server/docker/containers/ - 执行一键替换(需 root 权限):
grep -rl 'docker-runc' [容器目录] | xargs sed -i 's/docker-runc/runc/g' - 重启 Docker 服务:
systemctl stop docker && systemctl start docker
检查并重置 daemon.json 运行时配置
如果修复后仍报错,可能是 /etc/docker/daemon.json 中显式指定了已废弃的运行时名:
- 查看当前配置:
cat /etc/docker/daemon.json - 若存在类似
"default-runtime": "docker-runc"的字段,删掉该行或改为"default-runtime": "runc"(Docker 18.09+ 默认值) - 保存后执行:
systemctl daemon-reload && systemctl restart docker
必要时回退 Docker 版本(谨慎操作)
仅当修复无效且业务急需稳定运行时才考虑降级。注意:回退前务必备份 /var/lib/docker 目录(含所有镜像与容器数据):
- 查当前版本:
docker version --format '{{.Server.Version}}' - 查可用历史版本(以 CentOS 7 为例):
yum list docker-ce --showduplicates | sort -r - 安装指定旧版本(例如 17.06.2):
yum install docker-ce-17.06.2.ce-1.el7.centos - 锁定版本防止自动升级:
yum versionlock docker-ce
替代方案:重建容器而非回退
若容器本身无状态或可通过编排文件重建,比降级更安全:
- 导出原容器配置(含端口、挂载、环境变量):
docker inspect [容器名] > container-config.json - 用原镜像重新 run(配合
docker run参数或docker-compose.yml) - 已有镜像未变,只是运行时适配问题,重建几乎零风险











