直接卸载docker-ce包不清理残留,90%重装会失败;典型症状是dockerd启动报“error initializing graphdriver: driver not supported”或“port 2375 already in use”,需彻底清除运行时、配置、存储、服务注册、用户态缓存五层残留。

直接卸载 docker-ce 包,不清理残留,90% 的情况下后续重装会失败——dockerd 启动卡在 failed to start daemon: error initializing graphdriver: driver not supported 或 port 2375 already in use 就是典型症状。彻底卸载不是“删软件”,而是清空运行时、配置、存储、服务注册、用户态缓存五层残留。
先停服务、查包、删主程序(基础但关键)
这步漏掉任意一项,systemd 可能还在后台拉起残留进程:
-
sudo systemctl stop docker.service docker.socket—— 必须同时停主服务和 socket,否则docker.sock文件锁住,/var/lib/docker删不干净 -
sudo systemctl disable docker.service docker.socket—— 防止重启后自动激活 -
dpkg -l | grep -i docker(Ubuntu/Debian)或rpm -qa | grep docker(CentOS/RHEL)—— 看清所有已安装包名,别只删docker-ce,漏掉docker-ce-cli、containerd.io、docker-compose-plugin会导致docker命令仍存在但报错command not found: dockerd -
sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras(Ubuntu)或sudo yum remove docker-ce docker-ce-cli containerd.io(RHEL)——purge比remove多删配置文件,更彻底
删存储目录和系统级配置(最容易被跳过的重灾区)
/var/lib/docker 是镜像、容器、卷、网络的根目录,但删它之前必须确认没有进程正在访问其中文件;而很多人删完这个就以为完了,其实还有三处必清:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
sudo rm -rf /var/lib/docker /var/lib/containerd /var/run/docker.sock——containerd是独立运行时,不删它,重装 Docker 后可能复用旧状态导致冲突;/var/run/docker.sock是 Unix socket 文件,权限继承自docker.socket单元,残留会导致新服务无法绑定 -
sudo rm -rf /etc/docker /etc/systemd/system/docker.service.d——/etc/docker/daemon.json若含自定义data-root或registry-mirrors,重装后会被自动加载,引发路径不存在或镜像拉取失败;docker.service.d下的 override 文件会覆盖默认 unit 行为,常见于企业定制部署 -
sudo rm -f /etc/default/docker /usr/lib/systemd/system/docker.service—— 前者是 Debian/Ubuntu 特有环境变量配置,后者是 systemd 单元原始模板,若被修改过却未删,重装时可能被 apt/dnf 跳过更新,造成 service 定义错乱
扫尾:用户级缓存、残留进程、验证是否真清空
很多问题出在用户家目录和未显式 kill 的子进程上,尤其当你用过 rootless 模式或 VS Code Remote-Containers:
-
rm -rf ~/.docker—— 这里存着config.json(含私有仓库 token)、contexts(Kubernetes 上下文)、buildx构建器配置;不删,下次docker login可能静默复用旧凭据,导致权限错误 -
ps aux | grep -i 'docker\|containerd\|runc'—— 查是否有残留进程,特别注意containerd-shim和runc子进程,它们可能挂着已删卷的挂载点,导致umount: /var/lib/docker: target is busy -
sudo lsof +D /var/lib/docker 2>/dev/null | grep -v "COMMAND"—— 确认无任何进程打开该目录下文件,否则rm -rf会静默失败(部分文件删不掉) - 最后验证:
which docker应无输出;docker version应报command not found;ls /var/lib/docker应报No such file or directory
真正麻烦的从来不是命令记不住,而是你不知道 docker system prune -a --volumes 只作用于运行中的 Docker 引擎——它对已卸载的系统毫无意义;也不清楚 ~/.docker/config.json 里一行 "credsStore": "desktop" 在 macOS/Windows 上会调用本地凭证服务,在 Linux 上却可能让新装的 CLI 陷入无限等待。卸载动作本身很快,但判断“是否真的空了”,得靠逐层验证,而不是看终端有没有报错。

















