ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu系统精准安装指定版本Docker的完整指南与国内优化方案

Ubuntu系统精准安装指定版本Docker的完整指南与国内优化方案 1. 项目概述在Ubuntu上安装Docker对于很多开发者来说几乎是环境搭建的“第一课”。但很多时候我们需要的不仅仅是“能装上”而是“装上指定版本”。比如你接手了一个老项目其Dockerfile里明确要求了docker-ce20.10.7或者你正在部署一个对Docker版本有严格依赖的CI/CD流水线新版本可能引入了不兼容的改动。这时候一句简单的sudo apt install docker.io或者跟着官方教程安装最新版很可能就把你带进坑里。我遇到过不止一次因为版本不匹配导致镜像构建失败或者容器网络行为异常排查起来非常耗时。所以掌握在Ubuntu上精准安装指定版本Docker的方法是一项非常实用的基本功。这篇文章我会手把手带你走通两条最核心的路径官方的标准安装流程以及针对国内网络环境优化的国内镜像源安装方法确保你能在任何情况下都能把需要的Docker版本稳稳当当地装到系统里。2. 核心思路与方案选型为什么安装Docker会有“指定版本”这个需求这背后其实涉及到软件部署的稳定性和可复现性。Docker作为一个活跃开发的开源项目版本迭代很快新版本固然带来了新特性和性能提升但也可能伴随着Bug或对旧有使用习惯的破坏性变更。在生产环境或要求严格一致的开发环境中锁定一个经过验证的稳定版本是规避风险的最佳实践。在Ubuntu上实现这个目标主流方法就是通过APT包管理器来安装Docker官方维护的docker-ce社区版包。整个流程的核心思路可以概括为“添加正确的软件源 - 获取可用的版本列表 - 精确安装目标版本”。这里的关键在于“正确的软件源”。我们将探讨两种源官方源直接从Docker官方和Ubuntu官方仓库获取是最标准、最“纯净”的路径适用于网络通畅的环境。国内镜像源将官方源的地址替换为国内镜像站如阿里云、腾讯云、中科大等的地址利用国内CDN加速下载解决官方源在国内访问速度慢甚至无法连接的问题。这是在国内环境下的首选方案。两种方案的底层操作添加仓库、安装软件是完全一致的区别仅在于软件仓库的地址。因此掌握了一种另一种也就触类旁通了。下面我们就从最基础的准备工作开始。3. 安装前的系统准备无论选择哪种源在动手安装之前都需要对Ubuntu系统做一些必要的检查和清理工作这能避免很多后续的奇怪问题。3.1 卸载旧版本Docker如果你的系统上曾经通过其他方式安装过Docker比如docker.iodocker-engine强烈建议先彻底卸载它们以免和我们要安装的docker-ce产生冲突。sudo apt-get remove docker docker-engine docker.io containerd runc这条命令会移除这些旧的Docker相关包但通常不会删除镜像、容器、卷等数据它们默认存放在/var/lib/docker/下。如果你需要全新开始可以手动删除这个目录警告这将永久删除所有Docker数据sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd3.2 安装基础依赖工具我们需要一些工具来帮助添加和管理APT仓库。sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-releaseca-certificates用于验证HTTPS证书确保从网络下载内容的安全性。curl命令行下载工具用于获取Docker的GPG密钥。gnupg用于管理GPG密钥验证软件包签名。lsb-release一个工具可以方便地获取当前系统的LSBLinux标准基础信息比如发行版代号我们后面会用到。3.3 信任Docker的APT仓库GPG密钥APT包管理器通过GPG密钥来验证软件仓库的合法性防止安装被篡改的软件包。我们需要先下载并信任Docker官方发布的密钥。官方源方法sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg这条命令做了两件事1. 创建存放密钥的目录2. 从Docker官网下载GPG公钥并将其转换为APT可识别的格式保存到指定文件。国内源方法以阿里云镜像为例原理相同只是从镜像站下载密钥。但请注意有些镜像站可能不直接提供GPG密钥文件或者其密钥文件地址不同。一个更稳妥的方法是仍然从Docker官方下载密钥因为密钥本身很小且不需要频繁下载直接使用官方地址通常没有问题。镜像源主要加速的是软件包本身的下载。所以这一步通常可以沿用上面的官方命令。注意确保/etc/apt/keyrings/目录的权限正确避免后续APT更新时出现权限警告sudo chmod ar /etc/apt/keyrings/docker.gpg4. 添加Docker的APT软件源这是决定你从哪个服务器下载Docker安装包的关键步骤。我们需要根据系统版本构造出正确的仓库地址字符串。4.1 确定你的Ubuntu版本代号使用lsb_release命令可以轻松获取lsb_release -cs常见的输出结果有jammy(22.04 LTS),focal(20.04 LTS),bionic(18.04 LTS)等。请记下这个代号下面会用到。4.2 添加仓库地址到APT源列表我们需要将仓库地址写入/etc/apt/sources.list.d/docker.list文件。这里给出两种源的写法。官方源地址echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null让我们拆解一下这个命令deb: 表示这是一个二进制软件仓库。[arch$(dpkg --print-architecture) signed-by...]: 这是APT仓库的选项。arch$(dpkg --print-architecture): 自动获取当前系统的架构如amd64, arm64确保下载对应架构的包。signed-by/etc/apt/keyrings/docker.gpg: 指定用于验证这个仓库的GPG密钥文件路径。https://download.docker.com/linux/ubuntu: Docker官方APT仓库的基地址。$(lsb_release -cs): 这里会替换成你系统的版本代号如jammy。stable: 使用稳定版仓库。Docker还提供test测试版和nightly每日构建版仓库生产环境务必使用stable。国内镜像源地址以阿里云为例国内镜像站通常提供了对download.docker.com的镜像。以阿里云镜像站为例其Docker CE镜像地址为https://mirrors.aliyun.com/docker-ce/linux/ubuntu。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可以看到唯一的变化就是把仓库基地址从https://download.docker.com/linux/ubuntu换成了https://mirrors.aliyun.com/docker-ce/linux/ubuntu。实操心得除了阿里云腾讯云(mirrors.cloud.tencent.com/docker-ce)、中科大(mirrors.ustc.edu.cn/docker-ce)也都是很好的选择。选择离你网络地理位置近的镜像站速度会更快。如果某个镜像站同步不及时可以尝试换另一个。4.3 更新APT软件包缓存添加新仓库后必须更新本地的软件包列表缓存这样APT才知道从哪里、有哪些版本的软件可以安装。sudo apt-get update执行这个命令后你应该能在输出信息中看到类似于“Get:XX https://mirrors.aliyun.com/docker-ce/linux/ubuntu jammy InRelease”这样的行这说明新添加的Docker仓库已经成功被拉取。5. 查询与安装指定版本Docker CE仓库配置好我们就可以开始寻找和安装特定版本的Docker了。5.1 查询所有可安装的Docker CE版本使用apt-cache madison命令可以列出仓库中某个包的所有可用版本。apt-cache madison docker-ce | head -20这条命令会列出docker-ce包的所有版本格式如下docker-ce | 5:20.10.23~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.22~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages docker-ce | 5:20.10.21~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages ...输出分为三列包名、版本字符串、所在的仓库。我们需要关注的是第二列的完整版本字符串例如5:20.10.23~3-0~ubuntu-jammy。这个字符串的格式通常是epoch:upstream_version~debian_revision。在安装时我们需要指定这个完整的字符串或者至少是epoch:upstream_version部分如5:20.10.23。如果你想更精确地查找比如找所有20.10.x的版本可以用grep过滤apt-cache madison docker-ce | grep “20.10”5.2 安装指定版本假设我们通过查询决定安装版本字符串为5:20.10.23~3-0~ubuntu-jammy的Docker CE。安装命令如下sudo apt-get install docker-ce5:20.10.23~3-0~ubuntu-jammy docker-ce-cli5:20.10.23~3-0~ubuntu-jammy containerd.io docker-compose-plugin这里我们安装了四个包docker-ce: Docker社区版引擎核心。docker-ce-cli: Docker命令行工具。containerd.io: 容器运行时Docker依赖它来管理容器生命周期。docker-compose-plugin: Docker Compose的插件版V2用于通过docker compose命令管理多容器应用。为什么要把版本号写两遍因为docker-ce和docker-ce-cli是两个独立的包但为了兼容性它们最好保持版本一致。containerd.io和docker-compose-plugin通常不需要指定版本APT会自动安装与docker-ce兼容的版本。重要提示在安装过程中APT可能会提示你安装这个指定版本会导致不安装docker-ce的“候选版本”即最新版。这是正常的直接确认即可。5.3 安装后的基础验证安装完成后运行以下命令进行验证# 启动Docker服务并设置为开机自启 sudo systemctl start docker sudo systemctl enable docker # 运行经典的hello-world镜像测试Docker引擎是否正常工作 sudo docker run hello-world如果看到“Hello from Docker!”等欢迎信息说明Docker已经安装成功并且可以正常拉取和运行容器了。6. 国内环境优化与配置对于国内用户安装完成只是第一步后续的日常使用尤其是拉取镜像同样可能受网络问题困扰。进行一些优化配置可以极大提升体验。6.1 配置Docker镜像加速器Docker拉取镜像默认从Docker Hubregistry-1.docker.io进行国内访问速度很慢。我们可以配置一个国内的镜像加速器地址。修改或创建Docker的守护进程配置文件/etc/docker/daemon.jsonsudo tee /etc/docker/daemon.json -‘EOF’ { “registry-mirrors”: [ “https://registry.docker-cn.com“, “https://hub-mirror.c.163.com“, “https://mirror.baidubce.com“ ] } EOF这里我一次性添加了三个常用的国内镜像源。Docker会按顺序尝试。你可以根据网络情况选择其中一个或多个。6.2 应用配置并重启服务修改配置后需要重启Docker服务使配置生效。sudo systemctl daemon-reload sudo systemctl restart docker重启后可以使用docker info命令查看配置是否生效在输出中寻找Registry Mirrors部分。6.3 为非root用户授权可选但推荐默认情况下执行docker命令需要sudo权限。为了方便可以将当前用户加入docker用户组这样就不用每次都加sudo了。sudo usermod -aG docker $USER重要执行此命令后你需要完全退出当前终端会话并重新登录或者新开一个终端窗口用户组的变更才会生效。之后你就可以直接运行docker ps等命令了。安全须知将用户加入docker组等同于授予其root权限因为Docker可以操作主机系统。请仅在个人开发环境或你信任的单用户系统上这样做。在生产服务器上应严格管理docker组的成员。7. 版本管理与后续维护安装指定版本后你可能会关心如何升级、降级或锁定版本。7.1 查看当前安装的Docker版本docker --version docker version # 显示更详细的客户端和服务器端版本信息7.2 升级Docker到新版本如果你想升级到仓库中可用的另一个指定版本步骤和安装时一样sudo apt-get update更新列表。apt-cache madison docker-ce查看可用的新版本。sudo apt-get install docker-ce新版本号 docker-ce-cli新版本号执行升级。如果你想升级到当前仓库中的最新稳定版可以运行sudo apt-get update sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io docker-compose-plugin--only-upgrade参数会确保只升级已安装的包不会安装新的包。7.3 阻止Docker自动升级锁定版本在Ubuntu上如果你使用apt进行系统常规升级sudo apt upgradeDocker可能会被一起升级到新版本。如果你想锁定当前版本防止意外升级可以使用apt-mark hold命令sudo apt-mark hold docker-ce docker-ce-cli containerd.io docker-compose-plugin这样这些包的状态就会被标记为“保留”在常规升级中会被跳过。如果需要解除锁定使用sudo apt-mark unhold 包名。8. 常见问题与故障排查实录在实际操作中你可能会遇到一些典型问题。这里记录了我踩过的一些坑和解决方法。8.1 添加仓库后apt-get update报错“GPG error”或“NO_PUBKEY”问题现象执行sudo apt-get update时出现类似“The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX”或“GPG error: ... The following signatures were invalid: ...”的错误。原因分析这通常是因为APT没有正确信任我们添加的Docker仓库GPG密钥。可能是密钥下载不完整、格式不对或者权限有问题。解决方案重新下载并安装密钥删除旧的密钥文件重新执行信任密钥的步骤见3.3节。sudo rm /etc/apt/keyrings/docker.gpg # 然后重新运行curl下载密钥的命令检查密钥文件权限确保密钥文件对所有用户可读。sudo chmod ar /etc/apt/keyrings/docker.gpg检查sources.list文件格式确保/etc/apt/sources.list.d/docker.list文件中signed-by路径指向正确的密钥文件位置。8.2 安装时找不到指定的版本号问题现象执行sudo apt-get install docker-ce版本号时提示“E: Version ‘...’ for ‘docker-ce’ was not found”。原因分析最常见的可能你输入的版本字符串不完整或格式有误。必须使用apt-cache madison命令列出的完整版本字符串或者至少包含epoch和上游版本号如5:20.10.23。可能的原因没有成功更新APT缓存。添加仓库后忘了运行sudo apt-get update。较罕见的原因你使用的镜像源同步延迟。国内镜像站可能比官方源晚几个小时同步。如果你要安装一个刚发布的最新版本可以尝试换回官方源或者等待几小时后再试。解决方案再次运行sudo apt-get update。仔细核对apt-cache madison docker-ce命令的输出复制粘贴完整的版本字符串。如果确认版本字符串正确且已更新缓存可以尝试暂时将仓库地址换回官方源查询和安装完成后再改回镜像源。8.3 Docker服务启动失败问题现象执行sudo systemctl start docker后失败使用sudo systemctl status docker查看状态显示异常。原因分析原因多样需要查看日志。sudo journalctl -xu docker常见原因及解决与现有容器运行时冲突例如之前安装的旧版Docker或Podman的残留。彻底卸载旧版本并清理/var/lib/docker和/var/lib/containerd目录见3.1节警告。存储驱动问题特别是Ubuntu某些版本默认的文件系统如ZFS可能与Docker的默认存储驱动overlay2不兼容。可以在/etc/docker/daemon.json中尝试更换存储驱动如对于ZFS用“storage-driver”: “vfs”但性能较差或者更推荐的是将Docker的数据目录/var/lib/docker挂载到一个支持overlay2的文件系统如ext4上。内核模块缺失或版本过低Docker需要一些特定的内核模块如overlay、br_netfilter等。确保系统已更新到较新的内核并加载了所需模块。可以尝试更新系统sudo apt update sudo apt upgrade然后重启。8.4 配置镜像加速器后拉取镜像依然很慢问题现象配置了registry-mirrors但docker pull速度没有明显改善。原因分析镜像加速器地址失效或网络不佳有些公共镜像源可能不稳定或已停止服务。配置未生效修改daemon.json后没有重启Docker服务。拉取的镜像不在加速器缓存中对于非常冷门的镜像加速器可能没有缓存首次拉取仍需从Docker Hub获取速度会慢。后续拉取会快。使用了私有仓库或第三方仓库镜像加速器通常只对Docker Hub (docker.io) 生效。如果你拉取的是quay.io、gcr.io或自建仓库的镜像加速器配置是不起作用的。解决方案确认Docker服务已重启并用docker info确认镜像加速器地址已列出。尝试更换registry-mirrors数组中的地址顺序或将其他可用的加速器地址加入列表。对于非Docker Hub的镜像可以考虑使用代理或者寻找该仓库对应的国内镜像如果有的话。8.5 用户加入docker组后仍需sudo问题现象执行了sudo usermod -aG docker $USER并重新登录后运行docker ps仍提示权限拒绝。原因分析用户组变更没有在新的会话中生效。最常见的原因是没有完全退出当前会话并重新登录。仅仅关闭终端窗口的某个标签页或者在同一终端里执行su - $USER有时不足以重新加载完整的用户登录会话环境。解决方案最可靠的方法完全注销当前图形界面登录或SSH连接然后重新登录。如果不想重新登录可以尝试在当前终端中启动一个新的登录shellnewgrp docker这个命令会为当前shell会话临时切换到docker组。但这只对当前终端有效。要永久生效还是需要重新登录。锁定版本这个习惯是在经历了几次深夜紧急回滚后养成的。有一次自动升级将Docker从20.10升级到了23.0导致我们一个基于特定API版本编写的容器健康检查脚本全部失效虽然问题不大但批量修复也花了些时间。从那以后非必要不升级要升级也先在测试环境走一遍全流程。对于国内网络环境镜像加速器是必选项它能将镜像拉取时间从几十分钟缩短到几十秒体验提升巨大。最后/etc/docker/daemon.json这个文件值得你多花点时间研究除了镜像加速日志驱动、存储驱动、默认网络等很多重要配置都在这里根据你的实际需求调优一下能让Docker跑得更顺畅。
返回列表