docker故障大全


持续记录中…
更新时间: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 {
...
	go func() {
			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 /cbt/server.crt: permission denied [main.go:108]

4、查看/cbt/文件夹权限,使用ls /cbt命令报错无权限

5、说明/cbt文件夹权限不支持该用户访问。该文件夹为-v 映射进容器的文件夹。

6、在主机上查看该文件夹权限为 -rwxr–r–.。需要使用setfacl设置权限改为rwxr–r–+。

解决方法

添加/cbt文件夹权限。

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、使用其他非/var/lib/docker目录作为docker根目录可以正常启动docker

2、日志中报错位置为创建network相关
Oct 20 19:31:21 paas-controlle-host-2 dockerd[39170]: time=“2022-10-20T19:31:21.909914131+08:00” level=warning msg=“AtomicDelete: ErrKeyModified, key=docker/network/v1.0/bridge-endpoint/f52ce18c65a658ec0d812cd20c11865dbdbd82ae8c6eb4b6882f0b6453801a49/,b.dbIndex=0,prevIdx=39,nowIdx=75,caller:(file=/root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/vendor/github.com/docker/libkv/store/boltdb/boltdb.go,line=347,ok=true)”

3、/var/lib/docker/network/files/local-kv.db数据库文件损坏导致,删除该文件,docker启动时自动重构该文件故障解决。

解决方法

删除/var/lib/docker/network/files/local-kv.db数据库损坏文件,重启docker自动重建该文件。

11、使用ipv6环回地址无法访问容器

故障原因

1、正常情况下,ipv4也没有打开环回地址转发功能。
2、可以通过配置echo “1”>/proc/sys/net/ipv4/conf/docker0/route_localnet打开ipv4的转发功能(该例中为docker0网桥)。
3、ipv6无该配置,即不存在/proc/sys/net/ipv6/conf/docker0/route_localnet文件,因此无法打开该项功能。

解决方法

不要使用ipv6的环回地址访问容器。

12、提权进程在无法生成coredump文件

故障原因

1、ulimit -a查询ulimit值,如果设置了,则可能不会生成coredump,需执行ulimit -c unlimited设置为不限制。
2、sysctl -a | grep fs.suid_dumpable发现这个值为0。将其设置为1
3、sysctl -w fs.suid_dumpable=1即可生成coredump文件

解决方法

ulimit -c unlimited
sysctl -w fs.suid_dumpable=1

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值