持续记录中…
更新时间:2022-06-07
docker pull 以及docker run,看不到下载下来的镜像和启动的容器,但是去到/var/lib/docker目录下,又有对应的镜像和容器层。
故障原因
/var/lib/docker挂载的时间比dockerd启动时间更晚,dockerd使用docker pull和docker run命令使用的是未挂载/var/lib/docker的docker目录,而非现在挂载以后的/var/lib/docker
解决方法
dockerd启动要在挂载/var/lib/docker之后
在其他容器中使用curl命令连接仓库镜像,无法curl通,但是在主机上使用curl命令连接仓库镜像可以curl通。原因是docker-proxy僵尸了。
故障原因
docker-proxy僵尸是由于kill -9 docker-proxy,直接杀死docker-proxy,但是dockerd在启动docker-proxy阶段没有使用wait方法等待子进程退出,dockerd无法回收docker-proxy。dockerd在stop阶段做了wait方法等待,可以在stop容器以后回收僵尸的docker-proxy。
对应的函数为
func(p*proxyCommand)Start()error{...}func(p*proxyCommand)Stop()error{...gofunc(){ waitChan<- p.cmd.Wait()}()...}
解决方法
使用docker restart容器(会调用docker stop容器,dockerd会回收该容器僵尸掉的docker-proxy),重新拉起容器即可。
拉起容器名字冲突,环境上存在大量Created状态容器,且未被清理。
故障原因
环境上存在14000多个Created状态的容器,k8s没有及时清理,docker日志中报错“清理失败,不存在该容器”。手动删除容器可以成功。
原因是环境的SSD固态硬盘没有挂载成功,docker运行在机械硬盘上,io速度太慢,导致k8s侧拉起容器超时,反复不停拉起容器。
解决方法
及时清理Created状态容器。如需要高并发,则挂载SSD固态硬盘提高系统io性能。
push镜像失败,显示HTTP:500报错
故障原因
1、push镜像失败是由于镜像仓库配置的网络异常。报错received unexpected HTTP status: 500 Internal Server Error
2、docker日志中同样报错structure needs cleaning。表示文件系统故障。
自从报错structure needs cleaning文件系统故障以后,push镜像就一直不成功。
3、仓库容器registry为running状态。
4、查看registry容器日志,发现仓库容器报错ext4_find_dest_de:1815: inode #1181179: block 4727562: comm registry: bad entry in directory: rec_len % 4 != 0 - offset=0, inode=3671195736, rec_len=19238, name_len=228, size=4096。表示文件系统故障
故障原因为文件系统故障
解决方法
修复文件系统
在本地使用curl可以curl通,但是在其他节点无法curl通
故障原因
使用sysctl命令查看系统配置,需要有如下配置:
1、net.ipv4.conf.all.forwarding = 1
2、net.ipv4.ip_forward = 1
如果是ipv6,则需要配置:
1、net.ipv6.conf.all.forwarding = 1
2、net.ipv6.conf.default.forwarding = 1
解决方法
配置以上信息
nsenter -t 6066 -n ethtool -S eth0
查看容器内网络端口号。-t 6066表示容器pid6066
ip link show 124
ip addr | grep 124
打印端口为124的网卡。
brctl show
故障原因
1、使用命令docker run -it --entrypoint sh imageID启动容器,替换业务进程为sh
2、运行业务进程查看报错原因
3、报错为2022-06-02 14:36:09.366 CST watch tls file failed: stat /certs/server.crt: permission denied [main.go:108]
4、查看/certs/文件夹权限,使用ls /certs命令报错无权限
5、说明/certs文件夹权限不支持该用户访问。该文件夹为-v 映射进容器的文件夹。
6、在主机上查看该文件夹权限为 -rwxr–r–.。需要使用setfacl设置权限改为rwxr–r–+。
解决方法
添加/certs文件夹权限。
故障原因
1、docker日志中,02:21:15时刻查询xxx镜像发现不存在,收到load信号开始加载zgis镜像。
2、使用lsblk命令找到docker使用的磁盘序号,sar -f /var/log/sa/saxx -d | grep id查看当时环境磁盘负载。环境该时刻io负载冲高,达到100%
3、在02:37:03成功load xxx镜像,已超过上层设定的15分钟超时时限导致上层业务报错。
4、该问题是由于load镜像时刻环境磁盘负载过高导致。load镜像本身没有问题。
解决方法
降低并发度
故障原因
1、dockerd日志中,只有docker create,没有docker start
2、dockerd日志中没有错误信息,说明dockerd流程处于正常状态。如果本身由于docker run失败的话,dockerd日志中是有明确记录的。
3、怀疑是在执行docker run命令过程中,这条命令收到了异常信号,导致命令没有执行完退出了。
4、通过在docker run过程中,在docker create执行结束以后,docker start执行之前,对执行的这一条docker run命令发起kill -9信号构造出了当前的现象。
解决方法
docker run过程收集报错信息,python脚本中,os.system(“docker run xxx”)错误码如果为9,则是该命令收到了kill -9信号。
故障原因
1、使用其他非/paasdata/docker目录作为docker根目录可以正常启动docker
2、日志中报错位置为创建network相关
3、/var/lib/docker/network/files/local-kv.db数据库文件损坏导致,删除该文件,docker启动时自动重构该文件故障解决。
解决方法
删除/var/lib/docker/network/files/local-kv.db数据库损坏文件,重启docker自动重建该文件。