Docker 进程僵死杀不死完整处理流程

现象:systemctl stop docker卡住,kill‑9杀完又自动起来,是 docker.socket 套接字自动拉起 dockerd 进程,所以杀完又复活。 你目标:彻底干掉 docker26,卸载,装 docker‑19.03 给 k8s1.18 使用。

步骤 1:同时关闭 docker.service 和 docker.socket(关键点!只停 docker 没用)

bash

#停止服务+套接字单元,socket会自动重启dockerd,必须一起关
systemctl stop docker.service docker.socket
systemctl disable docker.service docker.socket

#重置systemd失败计数
systemctl reset-failed docker
systemctl daemon-reload

步骤 2:强制杀死所有 docker 相关进程

bash

#查找dockerd、containerd全部进程
ps -ef | grep -E "dockerd|containerd"

#批量强制杀掉所有docker家族进程
pkill -9 dockerd
pkill -9 containerd
pkill -9 containerd-shim

⚠️ 如果进程状态是 D(不可中断睡眠,磁盘 IO 阻塞),kill‑9也杀不掉,这种情况只能服务器重启才能释放进程。

校验:执行完,再次ps -ef | grep dockerd,不出现 dockerd 进程才算成功。

步骤 3:删除 socket 锁文件、数据目录,解除文件锁

bash

rm -rf /var/run/docker.sock
rm -rf /var/run/docker.pid
rm -rf /etc/docker
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

步骤 4:强制卸载 docker 包(如果 yum remove 卡住,跳过预卸载脚本)

先看已经安装哪些 docker 包

bash

yum list installed | grep docker

普通卸载

bash

yum remove -y docker-ce docker-ce-cli containerd.io docker-ce-rootless-extras

如果卸载卡死、preun 脚本挂住,强制卸载跳过脚本(对付僵死进程场景)51CTO...

bash

rpm -e --nodeps --noscripts docker-ce
rpm -e --nodeps --noscripts docker-ce-cli
rpm -e --nodeps --noscripts containerd.io

执行完,docker --version 提示 command not found,代表卸载干净。


两种结局

  1. ✅上面操作之后 docker 彻底消失 → 直接安装 docker‑19.03.15

bash

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io

#配置镜像加速器
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF

systemctl enable --now docker
docker --version
  1. ❗执行完全部命令,ps 依旧看到 dockerd 进程(D 状态 IO 僵死)

内核层面卡住,任何 kill 无效,只能执行机器重启 reboot,重启后 docker 不会再起来,再执行安装 docker‑19.03。

重要提醒:CentOS7.9 + K8s1.18 绝对不能使用 docker24+,内置 dockershim 已经移除,你之前 CRI 报错根源就在这里。

重装 docker‑19.03 完成之后再做

  1. 确认/etc/hosts里面写好 masterIP 和主机名 k8s‑master01
  2. 执行全套 kubeadm 残留清理

bash

kubeadm reset -f
rm -rf /etc/cni/net.d/*
rm -rf $HOME/.kube
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
  1. 使用 v1beta2 的 yaml 执行kubeadm init

如果你做完还是有问题,可以把下面命令输出贴给我:

bash

ps -ef | grep dockerd
systemctl status docker

补充备选思路:不想折腾 docker 版本,你也可以放弃 docker,直接用 containerd 作为 k8s1.18 的 CRI 运行时,避开 docker 版本坑。如果你想我可以给你一套 centos7.9 containerd 部署 k8s1.18 的操作。

更多推荐