目录
- 前言
- 常见坑点速查表
- 1. 彻底卸载旧版 Docker
- 1.1 停止并禁用 Docker 服务
- 1.2 卸载软件包与依赖
- 1.3 手动清理残留数据与配置
- 1.4 清理用户组
- 2. 安装新版 Docker
- 2.1 更新系统并安装依赖
- 2.2 添加 Docker 官方 GPG 密钥与软件源
- 2.3 安装 Docker 及相关组件
- 3. 启动 Docker 并解决常见报错
- 3.1 启动服务时遇到 masked 报错
- 3.2 解除屏蔽并正常启动
- 3.3 设置开机自启
- 3.4 验证 Docker 安装成功
- 4. 总结
- 参考资料
前言
在 Ubuntu 系统上重新安装 Docker 时,如果旧版本未彻底清理干净,常常会遇到服务被屏蔽(masked)、残留配置冲突等问题。本文基于实际操作经验,完整记录从卸载旧版 Docker 到全新安装并配置开机自启的全过程,帮助读者避开常见坑点,一步到位完成环境搭建。
预计字数:200-300 字
常见坑点速查表
下表汇总了卸载重装 Docker 过程中最常见的 5 个问题,便于读者快速定位并对照解决:
| 坑点 | 原因 | 解决方案 | 对应章节 |
|---|---|---|---|
| 服务被屏蔽(masked) | 卸载阶段执行了systemctl mask docker,导致新装后无法启动 | 执行sudo systemctl unmask docker解除屏蔽后再启动 | 3.1 / 3.2 |
| 残留配置冲突 | 卸载后未清理/etc/docker、/var/lib/docker等目录 | 使用purge卸载后手动rm -rf清理残留目录 | 1.2 / 1.3 |
| 依赖包冲突 | 旧版本依赖未随主程序一并移除 | 执行sudo apt-get autoremove -y --purge docker*清理 | 1.2 |
| 端口占用 | 旧容器或进程仍占用 80/443 等端口 | 先停止并禁用旧服务,必要时systemctl stop docker后清理 | 1.1 |
| 镜像与容器丢失 | 直接删除/var/lib/docker导致数据不可恢复 | 卸载前先备份数据目录,确认无误后再清理 | 1.3 |
1. 彻底卸载旧版 Docker
1.1 停止并禁用 Docker 服务
在卸载前,先停止正在运行的 Docker 服务,并禁用开机自启,避免卸载过程中出现文件占用或服务冲突。
# 1. 停止 Docker 服务sudosystemctl stopdocker# 2. 禁用开机自启sudosystemctl disabledocker# 3. (可选但推荐) 屏蔽服务单元,防止被其他脚本意外启动sudosystemctl maskdocker1.2 卸载软件包与依赖
使用purge彻底删除 Docker 主程序及配置文件,并自动清理不再需要的依赖包。
# 1. 卸载主程序及配置文件 (purge 会删除配置文件)sudoapt-getpurge-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker.io# 2. 自动移除不再需要的依赖包sudoapt-getautoremove-y--purgedocker*# 3. 清理 apt 缓存sudoapt-getclean1.3 手动清理残留数据与配置
卸载软件包后,仍需手动删除 Docker 的数据目录、配置文件、套接字及用户级配置,确保系统完全干净。
# 1. 删除 Docker 核心数据目录 (镜像、容器、卷、网络等)sudorm-rf/var/lib/dockersudorm-rf/var/lib/containerd# 2. 删除 Docker 配置文件sudorm-rf/etc/docker# 3. 删除 Docker 运行时套接字 (如果还存在)sudorm-f/var/run/docker.sock# 4. 删除用户主目录下的 Docker 配置 (当前用户)rm-rf~/.docker# 5. (可选) 检查并删除其他可能的残留路径sudorm-rf/var/lib/docker-networkssudorm-rf/usr/local/bin/docker-composesudorm-rf/usr/bin/docker*清理完成后,可通过以下命令验证残留是否已彻底清除:
# 1. 检查是否还有残留的 Docker 软件包 (应无输出)dpkg-l|grepdocker# 2. 检查 Docker 服务状态 (应显示 not-found 或 inactive)systemctl statusdocker# 3. 检查 Docker 数据目录是否已删除 (应提示 No such file or directory)ls-la/var/lib/docker预期输出示例:
# dpkg -l | grep docker 无任何输出,说明软件包已全部卸载# systemctl status docker 显示 "Unit docker.service could not be found."# ls -la /var/lib/docker 提示 "ls: cannot access '/var/lib/docker': No such file or directory"1.4 清理用户组
删除 Docker 安装时创建的用户组,避免遗留权限配置。操作步骤如下:
# 1. 查看系统中是否存在 docker 用户组 (若存在会显示一行记录)getent groupdocker预期输出示例(存在时):
docker:x:999:若命令无任何输出,说明 docker 用户组已不存在,可跳过删除步骤。
# 2. 删除 docker 用户组sudogroupdeldocker预期输出示例(删除成功时无任何输出,直接返回命令行提示符)。
# 3. 验证 docker 用户组是否已删除 (应无任何输出)getent groupdocker预期输出示例(删除成功后):
# getent group docker 无任何输出,说明 docker 用户组已成功删除预计字数:600-800 字
完成以上所有清理步骤后,可通过下表逐项自检,确认卸载是否彻底:
| 检查点 | 验证命令 | 预期结果 |
|---|---|---|
| 软件包无残留 | dpkg -l | grep docker | 无任何输出,说明软件包已全部卸载 |
| 服务不存在 | systemctl status docker | 显示Unit docker.service could not be found.或inactive |
| 数据目录已删除 | ls -la /var/lib/docker | 提示No such file or directory |
| 用户组已删除 | getent group docker | 无任何输出,说明 docker 用户组已不存在 |
| 配置文件已清理 | ls -la /etc/docker | 提示No such file or directory |
2. 安装新版 Docker
2.1 更新系统并安装依赖
先更新软件源,并安装ca-certificates、curl、gnupg等必要工具,为后续添加 Docker 官方源做准备。
# 1. 更新软件源索引,确保能获取到最新的软件包列表sudoapt-getupdate# 2. 安装必要工具:ca-certificates 用于验证 HTTPS 证书,curl 用于下载文件,gnupg 用于导入 GPG 密钥sudoapt-getinstall-yca-certificatescurlgnupg2.2 添加 Docker 官方 GPG 密钥与软件源
创建密钥目录并导入 Docker 官方 GPG 密钥,随后将 Docker 的 apt 源添加到系统中,命令会自动适配当前 Ubuntu 版本。
# 1. 创建用于存放 Docker GPG 密钥的目录 (权限设为 0755,仅 root 可写)sudoinstall-m0755-d/etc/apt/keyrings# 2. 下载 Docker 官方 GPG 密钥并保存到指定目录sudocurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg-o/etc/apt/keyrings/docker.asc# 3. 设置密钥文件权限,仅允许 root 读写sudochmoda+r /etc/apt/keyrings/docker.asc# 4. 添加 Docker 官方 apt 软件源 ($(. /etc/os-release && echo "$UBUNTU_CODENAME") 会自动获取当前 Ubuntu 版本代号)echo\"deb [arch=$(dpkg --print-architecture)signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(./etc/os-release&&echo"$UBUNTU_CODENAME")stable"|\sudotee/etc/apt/sources.list.d/docker.list>/dev/null2.3 安装 Docker 及相关组件
更新软件源后,一次性安装 Docker 主程序、命令行工具、容器运行时、构建插件和 Compose 插件。
# 1. 更新软件源,使新添加的 Docker 源生效sudoapt-getupdate# 2. 安装 Docker 及全部相关组件:# docker-ce Docker 主程序 (社区版引擎)# docker-ce-cli Docker 命令行工具# containerd.io 容器运行时# docker-buildx-plugin 构建插件 (支持 BuildKit)# docker-compose-plugin Compose 插件 (用于多容器编排)sudoapt-getinstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin预计字数:500-700 字
3. 启动 Docker 并解决常见报错
3.1 启动服务时遇到 masked 报错
安装完成后执行sudo systemctl start docker时,可能遇到Unit /etc/systemd/system/docker.service is masked的报错。这是因为卸载阶段执行了systemctl mask docker,需要先解除屏蔽。
3.2 解除屏蔽并正常启动
执行sudo systemctl unmask docker解除屏蔽后,再次启动 Docker 服务即可正常运行。操作步骤如下:
# 1. 解除屏蔽,移除 systemd 对 docker 服务的屏蔽标记sudosystemctl unmaskdocker# 2. 启动 Docker 服务sudosystemctl startdocker# 3. 验证 Docker 服务状态 (应显示 active (running))systemctl statusdocker预期输出示例:
# systemctl unmask docker 无任何输出,说明屏蔽已成功解除# systemctl start docker 无任何输出,说明服务已成功启动# systemctl status docker 显示 "Active: active (running)",说明 Docker 已正常运行3.3 设置开机自启
使用sudo systemctl enable docker --now一步到位完成开机自启设置并立即启动服务。该命令等价于先执行systemctl enable docker(创建开机自启软链接)再执行systemctl start docker(立即启动服务),--now参数将两步合并为一步,避免遗漏。
# 1. 设置开机自启并立即启动服务 (--now 表示同时执行 enable 和 start)sudosystemctlenabledocker--now预期输出示例:
Synchronizing state of docker.service with SysVservicescript with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-installenabledocker若输出如上所示,说明已成功创建开机自启软链接,且服务已立即启动。
设置完成后,可通过以下命令验证开机自启是否生效:
# 2. 检查 docker 服务是否已设置为开机自启 (应输出 enabled)systemctl is-enableddocker预期输出示例:
enabled若输出为enabled,说明 Docker 已加入开机自启列表,系统重启后会自动运行。若输出为disabled或static,则需要重新执行sudo systemctl enable docker --now。
3.4 验证 Docker 安装成功
3.5 其他常见启动报错排查
除 masked 报错外,安装完成后还可能遇到以下 3 类常见问题,下面逐一给出排查思路与解决命令。
场景一:执行 docker 命令提示 “Cannot connect to the Docker daemon”
报错现象:执行docker ps、docker images等命令时,终端提示:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is thedockerdaemon running?原因分析:Docker 服务未启动,或当前用户不在docker用户组、无权访问 Docker 套接字。
解决命令:先启动 Docker 服务,再将当前用户加入docker用户组。
# 1. 启动 Docker 服务sudosystemctl startdocker# 2. 将当前用户加入 docker 用户组 (替换 $USER 为你的用户名)sudousermod-aGdocker$USER# 3. 重新加载用户组权限 (无需重启,重新登录后永久生效)newgrpdocker预期输出:systemctl start docker无任何输出;usermod无任何输出;执行docker ps后正常显示容器列表(初始为空列表)。
场景二:拉取镜像时提示 “permission denied”
报错现象:执行docker pull nginx等拉取镜像命令时,终端提示:
permission deniedwhiletrying to connect to the Docker daemon socket at unix:///var/run/docker.sock原因分析:当前用户不在docker用户组,没有访问 Docker 套接字的权限。
解决命令:将当前用户加入docker用户组,并重新登录使权限生效。
# 1. 将当前用户加入 docker 用户组sudousermod-aGdocker$USER# 2. 重新登录使组权限生效 (或执行 newgrp docker 临时生效)# 注意:修改用户组后必须重新登录或重启,否则权限不会立即生效newgrpdocker预期输出:usermod无任何输出;重新登录后执行docker pull nginx可正常拉取镜像,不再提示权限错误。
场景三:执行 docker compose 命令提示 “command not found”
报错现象:执行docker compose version时,终端提示:
docker:'compose'is not adockercommand.原因分析:docker-compose-plugin插件未正确安装,导致docker compose子命令不可用。
解决命令:重新安装docker-compose-plugin插件。
# 1. 更新软件源sudoapt-getupdate# 2. 重新安装 docker-compose-plugin 插件sudoapt-getinstall-ydocker-compose-plugin# 3. 验证 Compose 插件是否安装成功dockercompose version预期输出:
Docker Compose version v2.29.7服务正常启动后,可通过以下命令验证 Docker 及 Compose 是否安装成功、能否正常运行容器:
# 1. 查看 Docker 引擎版本号docker--version预期输出示例:
Docker version27.3.1, build ce12230# 2. 查看 Docker Compose 插件版本号dockercompose version预期输出示例:
Docker Compose version v2.29.7# 3. 运行官方测试镜像 hello-world,验证能否正常拉取并运行容器sudodockerrun hello-world预期输出示例(成功时会打印以下提示信息):
Hello from Docker!This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the"hello-world"image from the Docker Hub.3. The Docker daemon created a new container from that imagewhichruns the executable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client,whichsent it to your terminal.若docker run hello-world能正常输出上述提示,说明 Docker 引擎、容器运行时及镜像拉取链路均已配置正确,安装彻底成功。
使用sudo systemctl enable docker --now一步到位完成开机自启设置并立即启动服务。
预计字数:400-600 字
4. 总结
本文完整梳理了 Ubuntu 下 Docker 的卸载与重装流程,重点解决了卸载残留导致的 masked 报错问题。按照上述步骤操作,即可在干净的环境中顺利安装并运行 Docker。建议读者在操作前备份重要数据,并确认当前 Ubuntu 版本对应的软件源配置。
预计字数:200-300 字
参考资料
- Docker 官方安装文档:https://docs.docker.com/engine/install/ubuntu/
- Ubuntu 官方文档:https://ubuntu.com/server/docs
- systemd 单元文件管理手册:
man systemd.unit
预计字数:100-200 字