Ubuntu 系统 Docker 安装避坑指南

前言

针对安装过程中出现的 "无法连接 Docker 官方服务器""GPG 密钥文件冲突""SSL 连接重置" 等问题,本方案全程使用国内阿里云镜像源,彻底避开官方服务器访问瓶颈,同时提供分步操作说明与错误处理机制,确保新手也能顺利完成安装。

一、准备工作

1. 系统要求

  • 支持版本:Ubuntu 20.04 LTS / Ubuntu 22.04 LTS(64位,推荐官方 LTS 版本以保证稳定性)
  • 权限要求:拥有 sudo 权限(普通用户需确保能执行管理员命令)
  • 网络要求:能访问互联网(国内网络环境即可,无需科学上网)

2. 系统更新与旧版本卸载

若之前安装过 Docker 旧版本或残留文件,需先清理,避免冲突:

bash 复制代码
# 1. 更新系统包索引,确保依赖包为最新
sudo apt-get update && sudo apt-get upgrade -y

# 2. 卸载旧版 Docker 相关组件
sudo apt-get remove -y docker.io docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 3. 删除 Docker 数据目录(避免残留配置干扰新安装)
sudo rm -rf /var/lib/docker /var/lib/containerd

二、核心安装步骤(全程国内镜像源)

1. 安装必要依赖包

Docker 安装需依赖证书、curl 等工具,先提前安装:

bash 复制代码
sudo apt-get install -y ca-certificates curl gnupg lsb-release apt-transport-https
  • ca-certificates:用于验证 HTTPS 仓库的证书
  • apt-transport-https:允许 apt 通过 HTTPS 协议下载软件包

2. 配置阿里云 Docker 镜像源(关键避坑步骤)

核心问题:直接访问 Docker 官方源(download.docker.com)易出现网络超时或连接重置,改用阿里云镜像源可大幅提升成功率。

bash 复制代码
# 1. 创建 GPG 密钥存储目录(若不存在则自动创建)
sudo mkdir -p /etc/apt/keyrings

# 2. 下载阿里云 Docker GPG 密钥(自动覆盖已存在的密钥文件,无需手动确认)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

# 3. 添加阿里云 Docker 仓库到系统源列表
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 设置密钥文件权限(确保 apt 能正常读取密钥)
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  • --yes:自动覆盖已存在的 docker.gpg 文件,避免 "文件已存在" 的交互提示
  • $(dpkg --print-architecture):自动识别系统架构(如 amd64、arm64)
  • $(lsb_release -cs):自动识别 Ubuntu 版本代号(如 22.04 对应 jammy,20.04 对应 focal)

3. 安装 Docker 核心组件

bash 复制代码
# 1. 更新包索引(让系统识别新添加的阿里云 Docker 仓库)
sudo apt-get update

# 2. 安装 Docker 引擎、CLI、容器运行时及 Compose 插件
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

特殊情况处理:服务重启确认界面

若安装过程中弹出 "服务重启选择" 界面:

  • 无需手动勾选,系统默认已选中需重启的必要服务(如 containerd、网络服务等)
  • 按 Tab 键切换光标到 选项,再按 Enter 键确认即可
  • 作用:重启依赖服务以适配新安装的 Docker 组件,确保功能正常

三、权限配置(可选但推荐)

默认情况下,docker 命令需通过 sudo 执行(如 sudo docker run),将当前用户添加到 docker 用户组,可避免每次输入 sudo:

bash 复制代码
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 提示:需注销当前用户并重新登录,权限设置才会生效
echo "权限配置完成!请注销当前会话并重新登录,即可直接使用 docker 命令(无需 sudo)"

四、验证安装(确认 Docker 正常工作)

安装完成后,通过以下命令验证是否成功:

1. 验证 Docker 版本

bash 复制代码
# 查看 Docker 引擎版本
docker --version
# 示例输出:Docker version 24.0.6, build ed223bc

# 查看 Docker Compose 版本(Compose 已集成到 Docker 插件中)
docker compose version
# 示例输出:Docker Compose version v2.20.3

2. 运行测试容器(核心验证步骤)

通过运行官方 hello-world 容器,确认 Docker 引擎能正常启动容器:

bash 复制代码
# 若已配置用户组权限,可去掉 sudo;未配置则需加 sudo
sudo docker run --rm hello-world

成功标志:

终端输出以下内容,说明 Docker 安装成功且能正常拉取镜像、运行容器:

plaintext 复制代码
Hello from Docker!
This message shows that your installation appears to be working correctly.
...(后续为 Docker 工作原理说明,可忽略)

五、常见问题处理(针对安装失败的补救措施)

1. 问题:执行 apt-get update 时仍提示 "网络连接失败"

原因:DNS 配置异常,无法解析阿里云镜像源域名。解决方法:手动配置阿里云 DNS:

bash 复制代码
# 1. 添加阿里云 DNS 到系统配置
echo "nameserver 223.5.5.5" | sudo tee -a /etc/resolv.conf
echo "nameserver 223.6.6.6" | sudo tee -a /etc/resolv.conf

# 2. 重启网络服务使 DNS 配置生效
sudo systemctl restart systemd-resolved

# 3. 重新更新包索引
sudo apt-get update

2. 问题:需要安装特定版本的 Docker(如兼容旧项目)

解决方法:先列出可用版本,再指定版本安装:

bash 复制代码
# 1. 列出阿里云仓库中可用的 Docker 版本
apt-cache madison docker-ce

# 2. 安装指定版本(以 24.0.6 为例,需替换为实际需要的版本)
sudo apt-get install -y docker-ce=5:24.0.6-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.6-1~ubuntu.22.04~jammy containerd.io docker-compose-plugin

六、Docker 服务管理(日常运维常用命令)

操作需求 命令
启动 Docker 服务 sudo systemctl start docker
停止 Docker 服务 sudo systemctl stop docker
重启 Docker 服务 sudo systemctl restart docker
设置 Docker 开机自启 sudo systemctl enable docker
关闭 Docker 开机自启 sudo systemctl disable docker
查看 Docker 服务状态 sudo systemctl status docker

总结

本方案通过以下核心措施规避安装错误:

  • 全程阿里云镜像源:替代官方源,解决网络超时、连接重置问题
  • 自动覆盖密钥文件:用 --yes 参数跳过 "文件已存在" 的交互提示
  • 分步清理旧版本:避免残留配置与新版本冲突
  • 提供 DNS 补救方案:解决国内网络环境下的域名解析问题

按照此文档操作,可在 Ubuntu 系统中稳定完成 Docker 及 Docker Compose 的安装,适用于开发、测试及生产环境。

相关推荐
用户4099322502122 小时前
PostgreSQL查询的筛子、排序、聚合、分组?你会用它们搞定数据吗?
后端·ai编程·trae
穿花云烛展2 小时前
实习日记6(select选择的超出问题)
前端
猪哥帅过吴彦祖2 小时前
Flutter 系列教程:布局基础 (下) - Stack 绝对定位和 Expanded 弹性布局
前端·flutter·ios
伊织code2 小时前
Uvicorn - Python ASGI Web 服务器
服务器·前端·python·uvicorn·asgi
心月狐的流火号2 小时前
Go语言错误处理
后端·go
Cache技术分享2 小时前
201. Java 异常 - 如何抛出异常
前端·javascript·后端
SimonKing3 小时前
弃用html2canvas!新一代截图神器snapdom要快800倍
java·后端·程序员
Mintopia3 小时前
🌍 cesium-kit —— 快速实现动态标点与交互的 Cesium 工具库
前端·three.js·cesium
shark_chili3 小时前
IntelliJ IDEA 2025 设置与快捷键完整指南
后端