docker故障大全

2022年9月30日10:14:46

持续记录中…
更新时间:2022-06-07

故障记录

1、docker pull和docker run无镜像和容器

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之后

2、docker-proxy僵尸

在其他容器中使用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),重新拉起容器即可。

3、k8s拉起容器名字冲突,无法成功拉起容器

拉起容器名字冲突,环境上存在大量Created状态容器,且未被清理。

故障原因

环境上存在14000多个Created状态的容器,k8s没有及时清理,docker日志中报错“清理失败,不存在该容器”。手动删除容器可以成功。

原因是环境的SSD固态硬盘没有挂载成功,docker运行在机械硬盘上,io速度太慢,导致k8s侧拉起容器超时,反复不停拉起容器。

解决方法

及时清理Created状态容器。如需要高并发,则挂载SSD固态硬盘提高系统io性能。

4、docker push镜像失败

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。表示文件系统故障

故障原因为文件系统故障

解决方法

修复文件系统

5、bridge模式启动容器,跨节点curl端口不通

在本地使用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

解决方法

配置以上信息

6、bridge网络时断时通

nsenter -t 6066 -n ethtool -S eth0

查看容器内网络端口号。-t 6066表示容器pid6066

ip link show 124

ip addr | grep 124

打印端口为124的网卡。

brctl show

7、容器内1号进程退出,1号进程为业务进程

故障原因

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文件夹权限。

8、业务侧查询镜像发现没有镜像

故障原因

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镜像本身没有问题。

解决方法

降低并发度

9、执行docker run以后,容器没有被start,状态为created

故障原因

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信号。

10、docker状态异常,且无法启动

故障原因

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自动重建该文件。

  • 作者:ImSEten
  • 原文链接:https://blog.csdn.net/weixin_42152531/article/details/124793524
    更新时间:2022年9月30日10:14:46 ,共 3238 字。