一 docker容器启动报错

报错内容如下

Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/e6472f6c7675054284c3a62f6388b52d3d34bd99e492a351dd5a28b724634f/merged: invalid argument

Error: failed to start containers: spug

原因分析

网上搜索一下解决方法,千篇一律,都是清除docker 镜像,更换文件系统。由于昨天还能启动容器,想必不是文件系统的问题。其实又是selinux造成的,昨天把selinux永久关闭导致的。Fedora的selinux是关闭的,而docker上的selinux却是开启的,因此docker运行时会产生如上错误。

另外docker 18.09已经废弃使用overlay1了,overlay2存储才是今后所支持的,因此不建议按照网上某文章的教程那样将docker的存储驱动改回overlay1。改回overlay1的方式只是治标不治本,正解是修改selinux配置。

解决方法1

修改Fedora下的/etc/selinux/config 将SELINUX=disabled 改成 SELINUX=permissive(宽容模式)

保存重启

修改完保存退出(按esc ,输入:wq回车), 重启linux(reboot)即可启动容器。

解决方法2

由于开启宽容模式后,setroubleshootd进程占用过多CPU,导致硬解卡顿,建议使用如下方法:

【建议】修改docker关闭selinux

vi /etc/sysconfig/docker

# 找到
OPTIONS="--selinux-enabled --log-driver=journald --signature-verification=false"
# 删除 --selinux-enabled
OPTIONS="--log-driver=journald --signature-verification=false"
# 保存
:wq

二 docker-compose无法正常使用

现象:安装docker-compose后确无法正常使用,在执行任何命令后都会报如下错误

# Executing docker install script, commit: 66474034547a96caa0a25be56051ff8b726a1b28

Warning: the "docker" command appears to already exist on this system.


If you already have Docker installed, this script can cause trouble, which is

why we're displaying this warning and provide the opportunity to cancel the

installation.


If you installed the current Docker package using this script and are using it

again to update Docker, you can safely ignore this message.


You may press Ctrl+C now to abort this script.

+ sleep 20

原因:经过多番查找并根据提示信息,发现应该是docker和docker-compose的版本不对应导致。

解决方法:

了解docker和docker-compose对应关系

docker常见错误收集_docker

找到对应版本下载地址

wget https://github.com/docker/compose/releases?expanded=true&page=3&q=2.2.0
cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose
docker-compose --version

总结:重要的是下载的docker-compose文件正确,且版本和docker对应


三 firewalld和docker冲突解决方法

冲突原因: 如果同时启用了firewalld和docker服务,他们都会对iptables里面的转发链写入规则,firewalld每次启动或者重启都会强制覆盖docker的转发链,同时,docker也会通过更高优先级的策略使firewalld里面配置的条目失效。

具体冲突的原因见Docker官方文档:https://docs.docker.com/network/iptables/

解决方案:

方案1: 当启动firewalld出现冲突的时候,首先重启firewalld,然后重启docker,注意顺序不可以反过来。

方案2: 仅限于Docker版本大于等于 20.10.0

Docker在最新的版本里自动创建了一个名为docker的 firewalld zone,并把它的所有网络接口(包括docker0)加入到了这个区域里面,执行下面的命令将你的docker0接口移到docker区域。

firewall-cmd --zone=trusted --remove-interface=docker0 --permanent
firewall-cmd --reload