CentOS 7 系统 Docker 彻底卸载:4 步深度清理与 2 种典型错误解析

当你在 CentOS 7 系统上尝试重新安装 Docker 时,是否遇到过因残留文件导致的诡异报错?那些看似简单的 yum remove 操作背后,隐藏着许多运维人员踩过的坑。本文将带你深入 Docker 卸载的底层逻辑,提供一套超越基础命令的完整清理方案。

1. 为什么需要彻底卸载 Docker?

大多数技术文档只会告诉你运行 yum remove docker-ce ,但这就像只擦掉了桌面的灰尘而忽略了抽屉里的杂物。Docker 在系统中留下的痕迹远比想象中复杂:

  • 配置文件残留 /etc/docker/daemon.json 中的自定义配置可能影响新版本
  • 存储驱动遗留 /var/lib/docker 的不同驱动(overlay2、devicemapper)会留下特有文件结构
  • 网络接口残留 :docker0 网桥和 iptables 规则可能未被清除
  • 用户组遗留 :docker 用户组权限可能导致后续安装时的权限冲突

我曾在一个生产环境中遇到 Docker 重装失败的问题,即使按照官方文档操作后,新安装的 Docker 仍无法正常启动容器。最终发现是旧的 devicemapper 存储驱动留下的 thin-pool 设备未被清理。

2. 四步深度清理流程

2.1 预处理:停止服务与备份关键数据

在开始卸载前,建议先备份以下数据:

# 备份容器列表
docker ps -a > ~/docker_containers_backup.txt

# 备份镜像列表
docker images > ~/docker_images_backup.txt

# 备份数据卷(根据实际路径调整)
tar -czvf ~/docker_volumes_backup.tar.gz /var/lib/docker/volumes/

然后停止所有 Docker 相关服务:

sudo systemctl stop docker
sudo systemctl disable docker
sudo systemctl stop containerd
sudo systemctl disable containerd

2.2 核心卸载:彻底移除软件包

执行标准卸载命令后,还需要清理依赖项:

sudo yum remove -y docker-ce docker-ce-cli containerd.io

# 清除未被自动移除的依赖
sudo yum autoremove -y

# 检查并删除残留包
for pkg in $(yum list installed | grep -i docker | awk '{print $1}'); do
    sudo yum remove -y $pkg
done

2.3 深度清理:文件系统残留

以下脚本可全面清理各类残留文件:

#!/bin/bash

# 删除主数据目录
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 删除配置文件
sudo rm -rf /etc/docker
sudo rm -f /etc/systemd/system/docker.service
sudo rm -f /etc/systemd/system/docker.socket

# 删除执行文件
sudo rm -f /usr/bin/docker
sudo rm -f /usr/bin/dockerd
sudo rm -f /usr/bin/docker-compose

# 清理网络配置
sudo ip link delete docker0
sudo iptables -t nat -F
sudo iptables -t mangle -F

2.4 环境重置:用户与权限清理

最后处理用户组和缓存:

# 删除docker用户组
sudo groupdel docker

# 清理yum缓存
sudo yum clean all
sudo rm -rf /var/cache/yum

# 重建rpm数据库(可选)
sudo rpm --rebuilddb

3. 两种典型错误分析与解决

3.1 "device is busy" 错误排查

当删除 /var/lib/docker 时出现该错误,通常意味着:

  1. 未停止的容器进程

    # 查找仍在运行的容器进程
    ps aux | grep -i docker
    
    # 强制终止所有容器相关进程
    sudo pkill -9 dockerd
    sudo pkill -9 containerd
    
  2. 存储驱动挂载点未卸载

    # 查看挂载点
    mount | grep docker
    
    # 卸载devicemapper相关挂载(如果使用该驱动)
    sudo umount /var/lib/docker/devicemapper
    
  3. 文件系统锁未释放

    # 查找被锁定的文件
    sudo lsof /var/lib/docker
    
    # 强制解除锁定
    sudo fuser -km /var/lib/docker
    

3.2 "permission denied" 错误解析

这类问题通常源于:

  1. SELinux 策略限制

    # 临时禁用SELinux
    sudo setenforce 0
    
    # 或永久禁用(需重启)
    sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    
  2. 残留的AppArmor配置

    # 检查AppArmor状态
    sudo aa-status
    
    # 停用docker相关配置
    sudo apparmor_parser -R /etc/apparmor.d/docker
    
  3. 文件权限混乱

    # 重置/var/lib目录权限
    sudo chown -R root:root /var/lib
    sudo chmod 755 /var/lib
    

4. 验证与重装建议

完成清理后,建议执行以下验证步骤:

# 检查docker相关进程是否完全退出
ps aux | grep -E 'docker|containerd'

# 确认关键目录已删除
ls -ld /var/lib/docker /etc/docker /usr/bin/docker

# 检查网络配置
ip a show docker0
iptables -t nat -L

如果需要重新安装 Docker,建议:

  1. 使用官方仓库而非第三方源
  2. 选择与系统内核匹配的 Docker 版本
  3. 首次安装后先不启动服务,检查配置是否符合预期
# 示例安装命令
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

记住,在运维领域,干净的卸载往往比正确的安装更重要。每次遇到 Docker 环境问题时,一套完整的清理流程能为你节省数小时的排查时间。

更多推荐