切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
docker的各种死法
作者:ych
#### log堵死 ##### docker 所有容器卡死且无法重启的bug异常 1、起因 (docker 所有容器突然之间卡死, 没有任何日志输出) 怀疑一: 以为是昨天上线代码导致,所以审查了一遍代码,发现并无异常之处 -- 排除 怀疑二: 因为我们程序在消费mq的数据且每次消费都有日志,因此怀疑是不是mq卡死在一个点了。 经过检查之后,发现确实卡死在一个 mq的offset上, 但经过仔细排查,发现所有的 topic 都卡死了。因此怀疑可能并不是由 mq 卡死导致,就是程序容器卡死 2、尝试 尝试一: 尝试 docker stop container 命令, 发现无济于事。 尝试失败! 尝试二: 尝试 docker kill container 命令, 同样无济于事。 尝试失败! 此时我们发现,所有容器都无法stop 和 kill 掉。 这时我们怀疑是 docker 出现了问题。 3、排查 排查: 查看容器是不是共用的 插件 , 发现我们所有的容器都会将容器日志打印到 es 中。恰好有其他同事在近一两个小时内修改过 es 的配置, (之前是不需要用户名密码的,现在需要了) 4、总结 原因就是: 我们所有的容器将日志都通过 docker plugin 传输到 es中去了,因为es增加了权限验证 。所以导致docker的日志发送不过去了。 然后docker 就把自己给卡死了。一并的将所有容器都给卡死了。 解决办法: 将连接的es 配置好用户名和密码 ! 重启 docker进程就好了 #### linux内核bug ##### 服务器docker进程卡死了,打任何命令都无反应,最终是linux内核bug导致的 今天遇到了一个线上问题,公司在阿里云上面香港业务的服务器突然从凌晨开始就down了, 重启服务器和程序也没用,看日志是docker 重启后一直加载中。 Docker进程卡死原因: centos7内核跟docker版本之间的一个bug,过于频繁create/destory container、 pull/push image的时候,当thin pool满时,DeviceMapper后端默认文件系统xfs会不断retry 失败的IO,导致进程挂起。重启docker,那些挂起的进程也会不断地跑,所以需要在启动参数上面 增加dm.xfs_nospace_max_retries=0。 但我直接把这个参数加到 /etc/docker/daemon.json上面,发现启动失败了。 vim /etc/docker/daemon.json ``` { "storage-driver":"devicemapper", "storage-opts":[ "dm.xfs_nospace_max_retries=0" ] } ``` #### 网络异常导致 docker故障排查 ``` systemctl status docker ``` 正常机器 systemctl status docker 结果如下: ``` ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2019-11-01 12:00:18 HKT; 4 days ago Docs: http://docs.docker.com Main PID: 28808 (dockerd-current) CGroup: /system.slice/docker.service ├─28808 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userl... └─28816 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/l... ``` 异常机器 systemctl status docker 结果如下: ``` ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: activating (start) since Tue 2019-11-05 20:38:18 CST; 6s ago Docs: http://docs.docker.com Main PID: 449215 (dockerd-current) CGroup: /system.slice/docker.service ├─449215 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --user... ├─449268 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/... └─451211 /usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER ``` 很显然异常机器多了一条: ``` /usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER ``` ps查看,就是iptables卡死(处于D状态): ``` ps aux | grep iptables root 205480 0.0 0.0 18304 752 ? D 20:54 0:00 /usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER ``` 由上基本得出是iptables卡住导致docker卡住,这是docker启动过程中要建立iptables策略为后续docker网络做准备,这个过程失败导致卡住。 解决方案 iptables不能创建,基本上可以猜测是安全策略导致的。咨询相关人员解决即可,比如我这里是将/etc/modprobe.d/目录下iptables和nat相关黑名单放开就可以了。 想吐槽一句为啥iptabes卡住在docker启动日志和调试日志中看不到相关的日志,害得花大量时间排查。 软件设计过程中要考虑可维护性,除了问题要方便排查才好。 #### 特定容器的死锁,因此与容器相关的命令将无法完成 ##### 守护程序 dockerd 处于异常状态:停止后无法启动 `ps -eax | grep docker`来观察许多僵尸Docker进程。 重新启动服务器并重新启动 Docker 后,僵尸进程消失,Docker 命令再次工作。 重新启动服务器对我不起作用。我遇到了这个问题,因为刚刚安装了一个带有某种错误的新容器。之后,大多数 Docker 命令都没有响应。我通过执行以下命令修复了它: ``` docker system prune -a ``` 更多了解 >https://docs.docker.com/engine/reference/commandline/system_prune/ #### Docker长期运行导致Linux内存buff/caches占用过高 ``` free -h ``` Docker长期运行导致Linux内存buff/caches占用过高,这个问题很常见,但是我们是无法控制Docker自己对pagecache的处理机制的。 [buff/caches介绍](https://www.cnblogs.com/ultranms/p/9254160.html "buff/caches介绍") 我们可以手工执行以下命令进行对buff/caches的清理: ``` # 表示清除pagecache (执行后问题得以解决) echo 1 > /proc/sys/vm/drop_caches # 表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存) # slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache echo 2 > /proc/sys/vm/drop_caches # 表示清除pagecache和slab分配器中的缓存对象 (这个可以的) echo 3 > /proc/sys/vm/drop_caches ``` 当然我们也可以写一个脚本然后定时执行即可。 #### docker内存干翻 查看磁盘使用情况,df -h 查看端口占用情况,确保是否是docker崩溃 使用netstat -ntpl 内存是否充足,使用free -m或者top查看,(我估计这次事故就是此原因造成的,但我无法论证,因为我修改内核参数min_free_kbytes时,服务器居然重启了) ``` 内存不足。如果为了节约硬件成本,不想提升内存,那么我们就得优化Linux内存管理 ``` [谨慎调整内核参数:vm.min_free_kbytes](https://www.cnblogs.com/muahao/p/8082997.html "谨慎调整内核参数:vm.min_free_kbytes") #### 升级版本后的启动异常 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 查看状态 systemctl status docker.service ``` systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: failed (Result: start-limit) since Sun 2023-05-21 08:29:29 CST; 1min 7s ago Docs: https://docs.docker.com Process: 1684 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE) Main PID: 1684 (code=exited, status=1/FAILURE) May 21 08:29:27 k8smaster1 systemd[1]: docker.service failed. May 21 08:29:29 k8smaster1 systemd[1]: docker.service holdoff time over, scheduling restart. May 21 08:29:29 k8smaster1 systemd[1]: Stopped Docker Application Container Engine. May 21 08:29:29 k8smaster1 systemd[1]: start request repeated too quickly for docker.service May 21 08:29:29 k8smaster1 systemd[1]: Failed to start Docker Application Container Engine. May 21 08:29:29 k8smaster1 systemd[1]: Unit docker.service entered failed state. May 21 08:29:29 k8smaster1 systemd[1]: docker.service failed. May 21 08:29:29 k8smaster1 systemd[1]: start request repeated too quickly for docker.service May 21 08:29:29 k8smaster1 systemd[1]: Failed to start Docker Application Container Engine. May 21 08:29:29 k8smaster1 systemd[1]: docker.service failed. ``` 重启再试下 systemctl restart docker ``` sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" ``` journalctl -xe ``` journalctl -xe -- Unit docker.service has finished shutting down. May 21 08:31:38 k8smaster1 systemd[1]: start request repeated too quickly for docker.service May 21 08:31:38 k8smaster1 systemd[1]: Failed to start Docker Application Container Engine. -- Subject: Unit docker.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit docker.service has failed. -- -- The result is failed. May 21 08:31:38 k8smaster1 systemd[1]: Unit docker.service entered failed state. May 21 08:31:38 k8smaster1 systemd[1]: docker.service failed. May 21 08:31:38 k8smaster1 systemd[1]: start request repeated too quickly for docker.service May 21 08:31:38 k8smaster1 systemd[1]: Failed to start Docker Application Container Engine. -- Subject: Unit docker.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit docker.service has failed. -- -- The result is failed. May 21 08:31:38 k8smaster1 systemd[1]: Unit docker.socket entered failed state. May 21 08:31:38 k8smaster1 systemd[1]: docker.service failed. May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622478 1783 server.go:693] "--cgroups-per-qos enabled, but --cgroup-root was May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622683 1783 container_manager_linux.go:281] "Container manager verified user May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622773 1783 container_manager_linux.go:286] "Creating Container Manager obje May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622806 1783 topology_manager.go:133] "Creating topology manager with policy May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622817 1783 container_manager_linux.go:321] "Creating device plugin manager" May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622860 1783 state_mem.go:36] "Initialized new in-memory state store" May 21 08:31:42 k8smaster1 systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622903 1783 kubelet.go:313] "Using dockershim is deprecated, please consider May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622925 1783 client.go:80] "Connecting to docker on the dockerEndpoint" endpo May 21 08:31:42 k8smaster1 kubelet[1783]: I0521 08:31:42.622941 1783 client.go:99] "Start docker client with request timeout" timeout May 21 08:31:42 k8smaster1 kubelet[1783]: E0521 08:31:42.623137 1783 server.go:302] "Failed to run kubelet" err="failed to run Kubele May 21 08:31:42 k8smaster1 systemd[1]: Unit kubelet.service entered failed state. May 21 08:31:42 k8smaster1 systemd[1]: kubelet.service failed. lines 2166-2201/2201 (END) -- Unit docker.service has finished shutting down. ``` dockerd ``` unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives don't match any configuration option:graph ``` Dockerd 是 Docker 容器的守护程序服务,因为它不在后台运行,我们无法执行与该服务相关的任何操作,需要重新启动。 这里可以发现异常来自`graph`。 ##### 方案1 新版本中`graph`在以后的版本中被弃用--在这种情况下,使用 `data-root`代替。 vim /etc/docker/daemon.json ``` "graph": "/data/docker" ``` 改为以下内容 ``` "data-root": "/data/docker" ``` 重新启动 ``` systemctl daemon-reload systemctl restart docker ``` ##### 方案2 使用旧版本 ``` yum downgrade docker-ce-19.03.13 -y ``` 启动 ``` systemctl start docker systemctl enable docker ``` #### 其他命令 ``` system status docker.service sudo dockerd --debug df -h free -h docker stats docker inspect ```
相关推荐
优化 ASP.NET Core Docker 镜像的大小
docker容器
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1