详解Linux系统下Docker的完整卸载流程:从实战操作到原理剖析

一、引言:Docker与卸载的必要性

在容器化技术飞速发展的今天,Docker作为开源容器引擎的代表,已广泛应用于开发、测试、生产环境中。它通过“打包镜像-运行容器”的模式,实现了应用与环境的解耦,极大提升了部署效率。然而,在实际运维过程中,我们常会遇到需要卸载Docker的场景:

  • 版本迭代需求:当需要升级Docker到新版本(如从20.x升级到26.x)时,为避免新旧版本文件冲突,通常建议先彻底卸载旧版本;
  • 系统资源清理:Docker运行过程中会产生大量镜像、容器、卷数据(默认存储在/var/lib/docker),若长期不清理或不再使用Docker,这些文件可能占用数十GB甚至上百GB磁盘空间;
  • 环境迁移与重建:服务器角色变更(如从“容器宿主机”转为“数据库服务器”)时,需移除Docker相关组件,避免不必要的进程占用与端口监听;
  • 故障排查需求:当Docker出现无法修复的异常(如daemon启动失败、容器网络冲突),且排查后确认需重新部署时,卸载重装是最直接的解决方案。

本文将以CentOS 7系统为核心(基于用户实际操作环境),结合真实命令输出与原理讲解,详细拆解Docker的完整卸载流程,同时补充Ubuntu/Debian系统的操作差异,帮助读者掌握从“停止服务”到“验证结果”的全环节操作,确保卸载彻底、无残留。

二、卸载前的准备工作:知己知彼,避免踩坑

在执行卸载操作前,需完成三项核心准备:确认系统发行版、备份重要数据、查看Docker当前状态。这些步骤能有效避免误操作导致的数据丢失或卸载不彻底。

2.1 确认Linux系统发行版

Docker的卸载命令依赖于系统的包管理器(CentOS用yum,Ubuntu用apt),因此首先需确认系统版本。通过以下命令可快速判断:

# 方法1:查看系统版本信息
cat /etc/redhat-release  # CentOS/RHEL系会显示“CentOS Linux release 7.x.x”
cat /etc/os-release      # 通用命令,显示PRETTY_NAME字段(如“Ubuntu 22.04.3 LTS”)

# 方法2:查看包管理器
which yum  # CentOS/RHEL系会显示“/usr/bin/yum”
which apt  # Ubuntu/Debian系会显示“/usr/bin/apt”

用户实际环境验证:从用户执行的yum list installed | grep docker命令可知,其系统为CentOS 7el7代表Enterprise Linux 7),因此后续操作将以yum包管理器为核心。

2.2 备份Docker重要数据(可选但关键)

若服务器上仍有需保留的容器、镜像或卷,需在卸载前完成备份。常用备份命令如下:

# 1. 备份镜像(导出为tar文件)
docker save -o /backup/nginx-image.tar nginx:latest  # 备份nginx镜像
docker save -o /backup/mysql-image.tar mysql:5.7     # 备份mysql镜像

# 2. 备份容器数据(若需保留容器状态,先提交为镜像再导出)
docker commit my-container my-container-backup       # 将“my-container”容器提交为镜像
docker save -o /backup/my-container.tar my-container-backup

# 3. 备份卷数据(卷默认存储在/var/lib/docker/volumes,直接打包目录)
tar -zcvf /backup/my-volume.tar.gz /var/lib/docker/volumes/my-volume

注意:若无需保留数据(如用户场景中docker ps -a无任何容器),可跳过此步骤直接进入卸载流程。

2.3 查看Docker当前运行状态

在卸载前,需先了解Docker的服务状态、进程ID、已安装组件,避免因“运行中进程占用文件”导致卸载失败。执行以下命令:

# 1. 查看Docker服务状态
systemctl status docker

# 2. 查看Docker进程(确认是否有dockerd进程在运行)
ps aux | grep dockerd

# 3. 查看已安装的Docker相关包
yum list installed | grep docker  # CentOS/RHEL系
# apt list --installed | grep docker  # Ubuntu/Debian系

用户实际操作输出分析
从用户执行systemctl status docker的结果可知:

  • Docker服务状态为Active: active (running),主进程PID为1004,说明Docker正运行中;
  • 服务配置文件路径为/usr/lib/systemd/system/docker.service,且默认“开机自启”(初始状态为enabled);
  • 通过yum list installed | grep docker查到6个已安装包:containerd.io(容器运行时)、docker-ce(Docker社区版引擎)、docker-ce-cli(命令行工具)、docker-buildx-plugin(构建插件)、docker-ce-rootless-extras(无根模式组件)、docker-compose-plugin(Compose插件),这些均为需卸载的核心组件。

三、CentOS 7系统下Docker的完整卸载流程(基于用户实战)

结合用户的操作记录,CentOS 7系统下Docker的卸载需分为“停止服务→禁用自启→卸载组件→清理残留→验证结果”5个核心步骤,每个步骤均需严格执行,确保无遗漏。

3.1 步骤1:停止Docker及相关服务

运行中的Docker服务会占用/var/lib/docker/run/docker.sock等文件,若直接卸载会导致“文件被占用”错误。因此需先停止Docker daemon及关联的containerd服务(containerd是Docker默认的容器运行时,独立于Docker服务)。

3.1.1 停止Docker服务

执行以下命令:

systemctl stop docker

用户操作反馈
用户执行后出现警告:Warning: Stopping docker.service, but it can still be activated by: docker.socket
原因解析docker.socket是Docker的套接字服务,用于监听客户端(如docker命令)与daemon的通信请求。即使docker.service停止,若docker.socket仍活跃,执行docker命令时会自动重启docker.service。因此需额外停止docker.socket

3.1.2 停止containerd与docker.socket服务

补充执行以下命令,彻底停止所有关联服务:

# 停止containerd服务
systemctl stop containerd

# 停止docker.socket服务(解决上述警告)
systemctl stop docker.socket
3.1.3 验证服务停止状态

执行systemctl status命令确认服务已停止:

systemctl status docker containerd docker.socket

预期输出
所有服务的Active字段均为inactive (dead),例如用户后续执行systemctl status docker时,显示Active: inactive (dead) since Mon 2025-11-10 13:26:17 CST,说明服务已成功停止。

3.2 步骤2:禁用Docker开机自启

若仅停止服务而不禁用自启,下次服务器重启时,Docker服务会自动启动,导致后续卸载或清理操作失败。因此需通过systemctl disable禁用自启。

执行命令:

# 禁用docker服务自启
systemctl disable docker

# 禁用containerd服务自启
systemctl disable containerd

# 禁用docker.socket自启(可选,若后续不再使用Docker)
systemctl disable docker.socket

用户操作反馈
用户执行systemctl disable docker后,输出Removed symlink /etc/systemd/system/multi-user.target.wants/docker.service,说明自启配置已被移除(systemd通过“符号链接”管理自启服务,移除链接即禁用自启)。

验证禁用结果
执行以下命令查看自启状态:

systemctl is-enabled docker containerd

预期输出disabled(表示已禁用自启)。

3.3 步骤3:查看并卸载Docker核心组件

Docker在CentOS 7中通过yum包管理器安装,因此需通过yum remove命令卸载已安装的所有Docker相关包。卸载前需先明确已安装的包名(避免遗漏)。

3.3.1 查看已安装的Docker包

执行命令:

yum list installed | grep docker

用户实际输出

containerd.io.x86_64            1.6.33-3.1.el7                 @docker-ce-stable
docker-buildx-plugin.x86_64     0.14.1-1.el7                   @docker-ce-stable
docker-ce.x86_64                3:26.1.4-1.el7                 @docker-ce-stable
docker-ce-cli.x86_64            1:26.1.4-1.el7                 @docker-ce-stable
docker-ce-rootless-extras.x86_64 26.1.4-1.el7                   @docker-ce-stable
docker-compose-plugin.x86_64    2.27.1-1.el7                   @docker-ce-stable

包作用解析

  • containerd.io:容器运行时,负责管理容器生命周期(创建、启动、停止),是Docker的核心依赖;
  • docker-ce:Docker Community Edition(社区版)引擎,提供容器调度与管理能力;
  • docker-ce-cli:Docker命令行工具,所有docker命令(如docker rundocker ps)均通过此包提供;
  • docker-buildx-plugin:增强型镜像构建工具,支持多平台镜像构建;
  • docker-ce-rootless-extras:无根模式(Rootless)组件,允许非root用户运行Docker;
  • docker-compose-plugin:Docker Compose插件,支持通过docker compose命令管理多容器应用。
3.3.2 卸载所有Docker相关包

将上述6个包名作为参数,执行yum remove命令:

yum remove -y containerd.io.x86_64 docker-buildx-plugin.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce-rootless-extras.x86_64 docker-compose-plugin.x86_64

命令参数解析

  • -y:自动确认卸载操作,无需手动输入y(避免交互等待);
  • 包名需完整(含架构x86_64与版本信息),确保精准卸载。

用户操作反馈
用户执行后,终端显示“Resolving DependenciesRunning transaction checkTransaction test succeeded”,最终输出“Removed: 6 Packages”,说明6个核心组件已全部卸载。其中出现的警告“warning: file /etc/docker: remove failed: No such file or directory”无需担心——原因是用户在卸载前已手动删除/etc/docker目录(后续步骤),yum尝试删除时发现文件不存在,不影响卸载结果。

3.4 步骤4:清理Docker残留数据(关键步骤)

卸载核心包后,Docker的配置文件、日志、镜像、容器、卷等数据不会自动删除(这些文件存储在独立目录,不属于yum管理的“包文件”)。若不清理,会残留大量冗余数据(尤其是/var/lib/docker目录,可能占用大量磁盘空间)。

3.4.1 清理核心数据目录

Docker的核心数据存储在以下目录,需通过rm -rf命令彻底删除:

# 1. 删除Docker主数据目录(含镜像、容器、卷、网络配置)
rm -rf /var/lib/docker

# 2. 删除containerd数据目录(含容器运行时配置与状态)
rm -rf /var/lib/containerd

# 3. 删除Docker配置文件目录(含daemon.json、证书等)
rm -rf /etc/docker

# 4. 删除Docker日志目录(含daemon日志、容器日志)
rm -rf /var/log/docker

# 5. 删除Docker套接字文件(客户端与daemon的通信接口)
rm -rf /run/docker.sock

# 6. 删除Docker环境变量配置(若存在,用于配置Docker环境变量)
rm -rf /etc/profile.d/docker.sh

用户操作匹配
用户在卸载前已执行上述命令(如rm -rf /var/lib/dockerrm -rf /etc/docker),这也是后续卸载时出现“file /etc/docker: remove failed”的原因——提前清理不影响最终结果,但建议按“先卸载包、再清理残留”的顺序操作,避免警告。

3.4.2 清理其他残留文件(可选)

若系统中曾通过“二进制包”或“脚本”安装过Docker,可能存在其他残留文件,可通过以下命令查找并删除:

# 查找所有含“docker”关键字的文件/目录
find / -name "*docker*" 2>/dev/null | grep -v "proc" | grep -v "sys"

# 对查找结果逐一确认,删除无关文件(示例:删除残留的二进制文件)
# rm -rf /usr/local/bin/docker  # 若存在非yum安装的docker二进制文件

注意find /命令会遍历整个系统,耗时较长;2>/dev/null用于屏蔽“权限不足”的错误提示;grep -v "proc"grep -v "sys"用于排除临时文件系统(/proc/sys)中的无关条目。

3.5 步骤5:验证Docker卸载结果

卸载与清理完成后,需从“命令、服务、包、磁盘空间”四个维度验证,确保Docker已彻底移除。

3.5.1 验证Docker命令是否残留

执行docker --version命令,若Docker已彻底卸载,终端会提示“命令未找到”:

docker --version

用户实际输出
-bash: /usr/bin/docker: No such file or directory,说明docker命令的二进制文件已被删除(/usr/bin/dockerdocker-ce-cli包提供的命令路径)。

3.5.2 验证Docker服务是否残留

执行systemctl status docker命令,确认服务已被移除:

systemctl status docker

预期输出
Unit docker.service could not be found.(表示systemd已找不到Docker服务配置文件,服务已彻底移除)。

3.5.3 验证Docker包是否残留

再次执行yum list installed | grep docker,确认无任何Docker相关包残留:

yum list installed | grep docker

用户实际输出
无任何输出,说明6个核心包已全部卸载,无残留。

3.5.4 验证磁盘空间是否释放

通过df -h命令查看/var/lib/docker所在分区的空间变化(通常为/分区):

# 查看分区空间使用情况
df -h

# 对比清理前后的空间(示例:清理前/分区使用率80%,清理后降至60%)

原理/var/lib/docker是Docker存储镜像、容器的主要目录,若曾拉取过大型镜像(如ubuntumysql),此目录可能占用数十GB空间。清理后,磁盘空间会明显释放。

四、Ubuntu/Debian系统下Docker的卸载流程(补充参考)

若使用Ubuntu或Debian系统,Docker的卸载流程与CentOS类似,但包管理器需替换为apt(Advanced Package Tool)。以下为完整步骤,供不同系统用户参考。

4.1 停止并禁用Docker服务

# 停止Docker服务
sudo systemctl stop docker docker.socket containerd

# 禁用自启
sudo systemctl disable docker docker.socket containerd

4.2 查看并卸载Docker核心组件

# 1. 查看已安装的Docker包
sudo apt list --installed | grep docker

# 2. 卸载核心组件(包名与CentOS类似,需保留“docker-ce”“containerd.io”等)
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

# 3. 清理无用依赖(apt自动清理卸载组件的依赖包)
sudo apt autoremove -y --purge docker-ce

命令解析

  • apt purge:比apt remove更彻底,会同时删除包的配置文件;
  • apt autoremove -y --purge:自动删除因安装Docker而依赖的“无用包”,并清理其配置文件。

4.3 清理残留数据(与CentOS一致)

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

4.4 验证卸载结果

# 1. 验证命令残留
docker --version  # 预期:“docker: command not found”

# 2. 验证服务残留
sudo systemctl status docker  # 预期:“Unit docker.service could not be found.”

# 3. 验证包残留
sudo apt list --installed | grep docker  # 预期:无输出

五、卸载过程中常见问题及解决方案

在实际卸载过程中,可能遇到“服务无法停止”“残留文件清理失败”等问题。以下为3类高频问题的解决方案,结合原理与实操。

5.1 问题1:停止Docker服务时提示“Job for docker.service failed”

现象:执行systemctl stop docker后,终端提示“Job for docker.service failed because the control process exited with error code.”,服务无法停止。

原因:Docker daemon进程(dockerd)异常卡死,或存在正在运行的容器阻止服务停止。

解决方案

  1. 强制停止dockerd进程:
    # 查找dockerd进程PID
    ps aux | grep dockerd | grep -v "grep"
    
    # 强制杀死进程(替换PID为实际值,如1004)
    kill -9 1004
    
  2. 停止所有运行中的容器(若进程仍无法杀死):
    docker stop $(docker ps -q)  # 停止所有运行中的容器
    docker rm $(docker ps -aq)  # 删除所有容器(可选)
    systemctl stop docker       # 再次尝试停止服务
    

5.2 问题2:卸载后仍能执行“docker”命令

现象:执行yum removeapt purge后,输入docker --version仍能显示版本信息,未提示“命令未找到”。

原因:终端缓存了docker命令的路径(PATH环境变量),或系统中存在“非包管理器安装的Docker二进制文件”(如通过curl -fsSL https://get.docker.com | sh脚本安装)。

解决方案

  1. 刷新终端缓存:
    source /etc/profile  # 重新加载环境变量
    hash -r              # 清除bash命令缓存
    
  2. 查找并删除非包管理器安装的二进制文件:
    # 查找所有“docker”二进制文件
    find / -name "docker" -type f 2>/dev/null | grep -E "(bin|sbin)"
    
    # 若找到“/usr/local/bin/docker”,删除它
    rm -rf /usr/local/bin/docker
    

5.3 问题3:清理/var/lib/docker后磁盘空间未释放

现象:执行rm -rf /var/lib/docker后,通过df -h查看,磁盘空间使用率无明显变化。

原因/var/lib/docker目录下的文件被“已退出但未释放资源的进程”占用(如containerd-shim进程,用于管理容器生命周期),导致删除后空间未立即释放。

解决方案

  1. 查找占用/var/lib/docker的进程:
    lsof | grep /var/lib/docker  # 列出所有占用该目录的进程
    
  2. 杀死占用进程并重启系统(若进程无法手动杀死):
    # 杀死占用进程(替换PID为实际值)
    kill -9 PID1 PID2
    
    # 重启系统(彻底释放资源)
    reboot
    
  3. 重启后再次查看磁盘空间:
    df -h  # 此时空间应已释放
    

六、卸载后的后续操作建议

卸载Docker后,为确保系统环境清洁、稳定,可执行以下后续操作:

6.1 清理系统冗余依赖

  • CentOS 7
    yum autoremove -y  # 清理无用依赖包
    yum clean all       # 清理yum缓存(避免残留Docker包的缓存文件)
    
  • Ubuntu/Debian
    sudo apt autoremove -y
    sudo apt clean       # 清理apt缓存
    

6.2 检查系统环境是否残留Docker配置

执行以下命令,确认无Docker相关配置残留:

# 1. 检查环境变量
echo $PATH | grep "docker"  # 预期:无输出

# 2. 检查用户组(Docker默认创建“docker”用户组,若不再使用可删除)
cat /etc/group | grep docker  # 若存在,执行“groupdel docker”删除
cat /etc/passwd | grep docker # 若存在docker用户,执行“userdel -r docker”删除

6.3 重新安装Docker的注意事项(若需)

若卸载后需重新安装Docker,需注意:

  1. 确保残留数据已彻底清理(尤其是/var/lib/docker),避免新旧数据冲突;
  2. 参考Docker官方文档,选择与系统版本匹配的安装命令(如CentOS 7需安装docker-ce-26.1.4,Ubuntu 22.04需安装对应版本);
  3. 安装后执行docker run hello-world验证:若能成功拉取镜像并运行容器,说明安装正常。

七、总结:Docker卸载的核心原则与关键步骤

Docker的卸载并非“仅删除命令”那么简单,需遵循“停止服务→卸载组件→清理残留→验证结果”的核心流程,核心原则可总结为三点:

  1. 彻底停止关联服务:不仅要停止docker.service,还要停止containerddocker.socket,避免服务自动重启;
  2. 完整卸载核心组件:需覆盖docker-cedocker-ce-clicontainerd.io等所有关联包,避免因组件残留导致后续问题;
  3. 彻底清理残留数据/var/lib/docker/etc/docker等目录是残留重灾区,必须手动删除,否则会占用大量磁盘空间。

无论是CentOS还是Ubuntu系统,卸载的核心逻辑一致,仅需根据包管理器(yum/apt)调整命令。通过本文的步骤与原理讲解,相信读者能轻松应对Docker卸载场景,确保系统环境清洁、无冗余。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值