解决群晖Docker无法启动容器OCI runtime create failed: container with id exists报错
环境
硬件:黑群晖918+
DSM:DSM 6.2.1-23824 Update 1
Docker:18.09.0-0519
问题
以最高权限装载第一个Container之后,尝试启动第二个Container的时候显示报错:Start container jellyfin-jellyfin1 failed: {“message”:”OCI runtime create failed: container with id exists: b6803073dc958105e437ebe000efeab37d215c3e054af3fcdbcccc7fdd289a7e: unknown”}.
网上提供的方法:
测试过程
- 首次安装了CentOS官方镜像,名称CentWeb,版本Latest,启用Init,启用“自动重启”,运行正常
- 再次创建第二个Docker从CentOS官方镜像名称CentKMS,使用同样方法,启用init,启用“自动重启”功能,启动失败,显示错误信息OCI runtime create failed: container with id exist
- 删除名称CentKMS的容器,下载第三方luodaoyi/KMS-Server:latest,创建容器名KMSServer,启动依然提示错误信息OCI runtime create failed: container with id exist
- 尝试将容器CentWeb关闭,再次开启KMSServer,结果报错,尝试开启CentWeb,也报错,所有容器均无法启动。
- 重启NAS,容器CentWeb恢复运作,但是KMSServer依然无法运作。
故障排查
使用SSH登录群晖,并切换至root账户。
检查Docker进程,显示Container状态为Created,但是并没有启动。
1
2
3
4root@nas:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9774cfebe013 luodaoyi/kms-server:latest "/bin/sh -c 'vlmcsdm…" 6 days ago Created 0.0.0.0:1688->1688/tcp KMSServer
4a9b4ca2b8fe centos:latest "/usr/sbin/init" 2 months ago Up 13 hours 0.0.0.0:23->22/tcp CentWeb搜索Docker日志文件位置。
1
2
3
4root@nas:/var/log# find ../ -name *docker*
../packages/Docker/scripts/synodockerlogcollector.sh
../packages/Docker/conf/upstart/pkg-Docker-dockerd.conf
../log/Docker/docker.log删除所有Docker日志,重新启动Docker服务。
使用tail -f命令监测docker日志/log/Docker/docker.log,并准备复现问题。
1
2
3root@nas:/var/log/Docker# tail -f docker.log
2021-03-05T22:14:25+08:00 NAS docker[15295]: ERRO[47569] a5fd8a554626d5ff5388b76b02d119a8e5f5cc40fbeb95012c9dc194fe0f328b cleanup: failed to delete container from containerd: no such container
2021-03-05T22:14:25+08:00 NAS docker[15295]: ERRO[47569] Handler for POST /containers/luodaoyi-kms-server1/start returned error: cgroups: cannot find cgroup mount destination: unknown根据上面Logs的信息,我们可以清楚的看到当执行Container Start的操作时候,有个关键提示:“returned error: cgroups: cannot find cgroup mount destination”。这个报错很明显了,问题被指向了“无法挂载cgroup”。
尝试谷歌搜索,在Docker的Github上找到了一样的问题,并且有了临时解决方案。
https://github.com/docker/for-linux/issues/219
1
2root@nas: mkdir /sys/fs/cgroup/systemd
root@nas: mount -t cgroup -o none,name=systemd cgroup由于群晖系统比较特殊,默认是不能使用额外的安装包(虽然有很多方法可以装载ipkg,但是为了安全和稳定就那就先放一放)
重新尝试启动Container,启动成功!进一步测试重启群晖,然后再次检查Container可以自动上线,至此问题已经解决。
以上过程实质没有把问题解决,通过尝试重启解决不了问题,本人尝试多次重启,发现重启之后会出现一样的问题,而且出现只有少数服务启动成功。
解决方案(亲测有效)
问题产生的根本原因
经过测试,我的黑群晖服务器docker服务产生以上问题的根本原因是因为机器经常过热关机,这种机制是群晖保护系统的保护机制,当系统硬件温度到达机器能承受的固定点,机器就会异常关机,这时候docker也会异常关闭,所以导致以上问题。网上一些博客说是因为docker宿主主机关闭,docker没有关闭,docker容器的服务没有正常退出,但再次开机进入docker时就会产生冲突,就是原来强迫关闭的服务没有销毁,当再次开机打开docker时候会产生两个相同的id,所以出现OCI runtime create failed: container with id exists。
实行方案
方法一
避免因为宿主主机异常关机导致docker服务关闭后再开启产生该情况,对容器进行设置。
方法二
登陆SSH
输入以下代码挂载文件夹
1
2
3sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd执行查找命令(可以跳过此步,太慢了)
1
find / -name "b6803073dc958105e437ebe000efeab37d215c3e054af3fcdbcccc7fdd289a7e"
最后找到的文件夹:
/var/run/docker/runtime-runc/moby/
打开如下文件夹
1
cd /var/run/docker/runtime-runc/moby/
删除响应文件
1
sudo rm -rf /var/run/docker/runtime-runc/moby/b6803073dc958105e437ebe000efeab37d215c3e054af3fcdbcccc7fdd289a7e
重启容器
1
docker start b6803073dc958105e437ebe000efeab37d215c3e054af3fcdbcccc7fdd289a7e
- 本文作者: 小邓同学
- 本文链接: https://dyasher.github.io/2021/04/07/Docker学习——无法启动容器OCI-runtime-create-failed-container-with-id-exists/
- 版权声明: 该文章版权归作者DYaher所有,未经授权其他任何机构和个人不得以盈利为目的非法转载和使用。违反此声明者,本人将依法追究其法律责任。