本文主要是介绍Error response from daemon: devmapper: Error mounting ‘/dev/mapper/docker 容器无法启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一,问题描述
- 二,问题原因
- 1,排查
- 2,原因
- 三,解决方案
- 1,方案一
- 方案利弊
- 2,方案二
- 方案利弊
- 知识点补充
一,问题描述
物理机(或虚拟机)重启后,之前创建的容器启动报错,无法启动。
报错如下
Error response from daemon: devmapper: Error mounting '/dev/mapper/docker-253:0-674-
95585c503aef3448b0531bc24ab0c4bbc6ad4af2df0a2fe3c18ada4f1348f26c' on
'/var/lib/docker/devicemapper/mnt/95585c503aef3448b0531bc24ab0c4bbc6ad4af2df0a2fe3c18ada4f1348f26c':
invalid argument
Error: failed to start containers: d70791db5636
二,问题原因
1,排查
使用 getenforce 命令可以发现 selinux(是 Linux 的一个安全子系统,有权限管理的作用)是disabled的状态
并且在 /var/lib/docker/containers/你的容器id/ 目录下,查看 config.v2.json 文件
可以看到MountLabel和ProcessLabel都携带了selinux的参数
2,原因
在 selinux 为 开启 的时候,创建了容器,这个容器的MountLabel和ProcessLabel配置有了selinux的参数。之后因为某些原因将 selinux 修改为 disabled(重启后生效)。然后物理机(虚拟机)重启之后,selinux 为disabled状态,这个时候启动容器,导致容器创建时和启动时selinux上下文不一致,所以出错
三,解决方案
1,方案一
如下图,修改 config.v2.json 文件,把MountLabel和ProcessLabel设置为空
然后重启docker(重启后配置才生效)
systemctl restart docker
现在启动容器就可以成功了
方案利弊
不用重启物理机或虚拟机,但是如果出现问题的容器过多,手动修改很耗时
2,方案二
将selinux设置为permissive
selinux三种模式简介:
- Enforcing:强制模式。代表SELinux在运行中,且已经开始限制domain/type之间的验证关系
- Permissive:宽容模式。代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证不正确,进程仍可以对文件进行操作。不过如果验证不正确会发出警告
- Disabled:关闭模式。SELinux并没有实际运行
//编辑配置文件
vim /etc/sysconfig/selinux
//重启机子
reboot
//重启后查看selinux状态就不是disabled了 这时候启动容器就可以成功了
getenforce
方案利弊
这个方案可以一次性解决出现这个问题的所有容器,就是需要重启,有特殊原因不能重启还是采用方案一吧
知识点补充
在selinux开启时切换状态,可以使用命令:
// 切换到permissive
setenforce 0
// 切换到enforcing
setenforce 1
注意在开启状态不能直接切换到关闭状态,反过来也一样,切换需要修改配置文件后重启
这篇关于Error response from daemon: devmapper: Error mounting ‘/dev/mapper/docker 容器无法启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!