适用范围:通过 apt 安装的 Debian/Ubuntu Docker Engine。卸载软件与永久删除业务数据分开处理;Docker Desktop、Snap 和 rootless 安装需使用对应卸载流程。
一、确认安装来源和数据位置
卸载前先看实际安装了什么,记录容器、卷和 Docker 数据根目录:
dpkg-query -W -f='${Package}\t${Status}\n' docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras docker.io docker-compose docker-compose-v2 docker-buildx
sudo docker info --format '{{.DockerRootDir}}'
sudo docker ps -a
sudo docker volume ls
sudo systemctl status docker.service docker.socket containerd.service
未安装的包可能让 dpkg-query 返回非零,应逐项查看结果。Docker 官方 apt 仓库安装的包与 Debian/Ubuntu 自带 docker.io 不同;不要把所有名字里带 Docker 的包、目录和二进制都删掉。数据根目录也可能被 daemon.json 改到其他位置,默认的 /var/lib/docker 不能覆盖全部情况。
先备份需要的业务数据库、绑定挂载目录和命名卷,并确认能恢复。保存容器列表或镜像并不等于保存容器内全部数据;绑定挂载的数据不一定在 Docker 根目录里。
二、停止服务,卸载已安装的包
在确认可以中断现有容器业务后:
sudo systemctl stop docker.service docker.socket
如果使用 Docker 官方 apt 仓库,按照实际已安装的包选择下面列表:
sudo apt purge docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
containerd.io 可能还服务于其他工作负载,应先检查依赖、进程和数据用途,确认仅由这套 Docker 使用时再卸载:
apt-cache rdepends --installed containerd.io
sudo apt purge containerd.io
若安装的是发行版 docker.io,卸载自己查到的对应包,不同时套用一整组不相关包名。不自动执行 apt autoremove -y;先查看将删除的依赖是否还有其他用途。Docker Ubuntu 卸载说明、Debian 卸载说明
三、数据默认保留;确实要清空时另行处理
apt 卸载不会自动删除镜像、容器、卷和自定义配置,这是官方定义的行为。保留数据通常利于恢复或重装。如果目的只是重装 Engine,完成上一步即可,先不要删除数据目录。
只有确认备份可用、实际数据根目录就是 /var/lib/docker,且不再需要其中任何容器、镜像和命名卷时,才执行以下永久删除:
sudo rm -rf -- /var/lib/docker
自定义 data-root 必须逐字核对其绝对路径和挂载状态后单独处理,不能把从配置读取的字符串未经检查拼进递归删除命令。/var/lib/containerd 也可能保存 Docker 以外的镜像与工作负载,本文不提供无条件删除它的命令。业务绑定挂载目录不会由上面的删除自动清空,也不应为了“完全卸载”去全盘删除。
四、清理 apt 仓库与配置
先检查自己安装时创建的 Docker 源文件、keyring 和 /etc/docker/daemon.json:
ls -l /etc/apt/sources.list.d/docker.sources /etc/apt/sources.list.d/docker.list
ls -l /etc/apt/keyrings/docker.asc /etc/apt/keyrings/docker.gpg
当前官方安装流程使用 docker.sources 与 docker.asc,旧安装可能采用 .list 或 .gpg。只移除已确认属于该安装、且不再被其他源引用的具体文件;配置在备份后按实际需要清理。不要用 find / -name '*docker*' -exec rm ...、通配 purge 或不加判断的 killall。
最后执行 sudo apt update 并检查相关包和服务状态。systemctl 可能显示卸载后的单元不存在,这是需要判断的结果;它不证明业务数据已经删除。卸载是否成功与数据是否保留,要分开记录。
评论区