彻底清理旧版本 Docker 的痕迹
问题的核心在于:旧的 Docker 服务仍在运行,并且锁定了它所使用的资源(如套接字文件、进程、数据目录),导致新的安装程序无法正确停止或替换它们。彻底清理旧版本 Docker 的痕迹,然后再在一个新的目录安装新版本。
但请注意,直接删除 Docker 目录(如 /var/lib/docker
)会销毁你所有的镜像、容器、卷和网络!请务必先确认你是否需要备份其中的数据。
解决方案:彻底清理并更换安装目录
这里我们假设你想将 Docker 的工作目录(即存放镜像、容器等数据的目录)从默认的 /var/lib/docker
更换到新的位置,例如 /new/path/docker
。
第一步:尝试优雅地停止旧 Docker 服务(可能失败,但必须尝试)
首先,用尽一切办法尝试停止它。
-
使用 systemctl 停止服务(最推荐)
sudo systemctl stop docker sudo systemctl stop docker.socket
-
如果 systemctl 报错或无响应,直接杀死进程
# 查找 Docker 相关进程 ps aux | grep docker# 通常会有 `dockerd` 进程,强制杀死所有 Docker 进程 sudo pkill -9 dockerd sudo pkill -9 docker-containerd
第二步:卸载旧版本的 Docker
即使服务没停,我们也先执行卸载命令,至少把包管理器的记录清理掉。
# 对于 Ubuntu/Debian 系统
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 对于 CentOS/RHEL 系统
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
注意: purge
比 remove
更好,它会同时删除配置文件。
第三步:关键一步 - 手动清理残留文件和目录
这是最重要的一步,因为包管理器卸载不会删除用户数据。
-
删除 Docker 的默认工作目录(警告:这会删除所有镜像和容器!)
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
-
删除 Docker 的套接字文件和配置文件
sudo rm -rf /var/run/docker.sock sudo rm -rf /etc/docker
-
再次确认没有任何 Docker 进程在运行
ps aux | grep docker
如果还有,再次用
sudo pkill -9 [进程名]
结束它们。
第四步:安装新版本的 Docker
现在系统已经干净了,可以安装新版。
-
按照官方文档安装 Docker
访问 https://docs.docker.com/engine/install/ 并选择你的操作系统(如 Ubuntu),按照指南安装。 -
在安装过程中指定新的工作目录
我们不通过修改安装包的方式,而是在 Docker 启动配置中更改它的数据目录。- 创建你想要的新目录,例如:
sudo mkdir -p /new/path/docker
- 修改 Docker 的启动配置文件(通常是
daemon.json
):
这个配置告诉 Docker 守护进程将所有数据(镜像、容器等)存储在新的路径。sudo mkdir /etc/docker # 如果上一步删除了,需要重新创建 sudo tee /etc/docker/daemon.json > /dev/null <<EOF {"data-root": "/new/path/docker" } EOF
- 创建你想要的新目录,例如:
第五步:启动并验证新 Docker
-
启动 Docker 服务
sudo systemctl start docker
-
验证安装和配置
# 检查 Docker 是否运行 sudo systemctl status docker# 运行 hello-world 镜像测试 sudo docker run hello-world# 最关键的一步:检查 Docker 信息,确认 "Docker Root Dir" 是否是你设置的新路径 sudo docker info | grep "Docker Root Dir"
你应该会看到输出:
Docker Root Dir: /new/path/docker
总结与要点
- 核心矛盾:旧进程锁死资源,导致新安装无法进行。
- 解决思路:强制清理(杀死进程、删除文件) -> 干净重装 -> 配置新路径。
- 数据警告:
rm -rf /var/lib/docker
是破坏性操作,确保你不需要里面的任何容器或镜像后再执行。如果需要备份,请在清理前使用docker save
和docker export
命令。 - 永久更改目录:通过修改
/etc/docker/daemon.json
中的"data-root"
项是官方推荐的方法,而不是移动目录或创建软链接。