一,问题描述二,问题原因
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 argumentError: failed to start containers: d70791db5636
二,问题原因 1,排查 使用 getenforce 命令可以发现 selinux(是 Linux 的一个安全子系统,有权限管理的作用)是disabled的状态
并且在 /var/lib/docker/containers/你的容器id/ 目录下,查看 config.v2.json 文件
可以看到MountLabel和ProcessLabel都携带了selinux的参数
在 selinux 为 开启 的时候,创建了容器,这个容器的MountLabel和ProcessLabel配置有了selinux的参数。之后因为某些原因将 selinux 修改为 disabled(重启后生效)。然后物理机(虚拟机)重启之后,selinux 为disabled状态,这个时候启动容器,导致容器创建时和启动时selinux上下文不一致,所以出错
如下图,修改 config.v2.json 文件,把MountLabel和ProcessLabel设置为空
然后重启docker(重启后配置才生效)
systemctl restart docker
现在启动容器就可以成功了
方案利弊 不用重启物理机或虚拟机,但是如果出现问题的容器过多,手动修改很耗时
将selinux设置为permissive
selinux三种模式简介:
Enforcing:强制模式。代表SELinux在运行中,且已经开始限制domain/type之间的验证关系Permissive:宽容模式。代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证不正确,进程仍可以对文件进行操作。不过如果验证不正确会发出警告Disabled:关闭模式。SELinux并没有实际运行
//编辑配置文件vim /etc/sysconfig/selinux
//重启机子reboot//重启后查看selinux状态就不是disabled了 这时候启动容器就可以成功了getenforce
方案利弊这个方案可以一次性解决出现这个问题的所有容器,就是需要重启,有特殊原因不能重启还是采用方案一吧
知识点补充在selinux开启时切换状态,可以使用命令:
// 切换到permissivesetenforce 0// 切换到enforcing setenforce 1
注意在开启状态不能直接切换到关闭状态,反过来也一样,切换需要修改配置文件后重启