
1. 项目概述为什么Docker在Ubuntu上的安装方式如此多样如果你在Ubuntu上装过Docker大概率会和我有一样的感受网上的教程五花八门有让你用apt直接装的有让你加个什么仓库的还有让你去官网下个脚本一键跑的。刚接触的时候你可能会懵到底哪种方式才是“正确”的为什么一个安装能有这么多花样其实这背后反映的是Docker生态和Linux发行版软件管理哲学的差异。Docker作为一个快速迭代的商业化开源项目它希望用户能第一时间用上最新的稳定版甚至测试版。而Ubuntu作为一个追求系统稳定性的发行版其官方仓库里的软件版本往往比较保守。这种“新”与“稳”的矛盾就催生了多种安装路径。每种方式都有其明确的适用场景和背后的考量选错了轻则版本老旧功能缺失重则可能因为依赖冲突把系统搞乱。我自己在运维和开发环境中几乎把每种方式都试了个遍。今天我就以一个过来人的身份帮你彻底理清在Ubuntu上安装Docker的几种主流方式拆解它们各自的原理、优劣和隐藏的“坑”。无论你是想在个人开发机上快速搭个环境还是在生产服务器上寻求最稳定可靠的部署看完这篇你都能找到最适合你的那条路。2. 核心思路拆解官方源、社区仓库与一键脚本的博弈在深入实操之前我们必须先理解这三种主流安装方式的核心设计思路。这决定了你后续的维护成本和系统安全性。2.1 方式一使用Ubuntu官方仓库安装——追求极致的稳定与系统集成这是最“Ubuntu”的方式。命令通常简单到令人发指sudo apt update sudo apt install docker.io。这里的docker.io包是由Ubuntu社区维护的它被深度集成到Ubuntu的软件生态中。核心逻辑Ubuntu的维护者会对上游Docker的源代码进行审核、打包并确保其与当前Ubuntu发行版的所有其他软件包兼容。他们会为Docker打上必要的补丁以修复可能存在的、特定于该Ubuntu版本的安全问题或兼容性问题。优点稳定性最高软件版本经过充分测试与系统其他部分兼容性最好几乎不会出现依赖地狱。安全性有保障安全更新会通过Ubuntu官方的安全更新通道Security Update统一推送你只需运行sudo apt upgrade即可。管理统一安装、更新、卸载完全通过apt管理符合系统管理员的使用习惯。缺点与注意事项版本严重滞后这是最致命的缺点。例如Ubuntu 22.04 LTS官方仓库里的docker.io版本可能长期停留在某个较旧的版本如20.10.x而Docker官方可能已经发布了多个大版本。这意味着你无法使用很多新特性如BuildKit的增强功能、Compose V2等。包名是docker.io因为历史上有一个名为docker的无关软件包占用了这个名字所以Docker包在Ubuntu官方源里叫docker.io。这本身不是问题但容易让人困惑。实操心得这种方式仅推荐用于对Docker新特性无要求且将系统稳定性置于一切之上的环境例如一些内部使用的、功能固定的老旧应用服务器。对于开发和测试环境我强烈不推荐。2.2 方式二使用Docker官方APT仓库安装——在稳定与新鲜之间取得平衡这是Docker官方推荐的、适用于生产环境的方式。你需要手动将Docker的官方APT软件源添加到你的系统源列表中。核心逻辑由Docker公司自己来为各个Linux发行版包括Ubuntu构建并维护软件包。这样Docker可以控制软件包的构建质量并确保用户能及时获得新版本和安全性更新同时这些包也针对主流发行版进行了适配。优点版本较新且稳定你可以获得Docker官方认定的稳定版Stable版本迭代比发行版仓库快得多。官方维护更新及时安全漏洞修复和新版本发布后Docker官方会快速更新仓库你可以通过apt系统方便地升级。支持多个版本通道除了Stable你还可以选择Test或Nightly通道适合不同需求的用户。缺点与注意事项需要信任并添加第三方源这引入了额外的安全考量。你需要确保从Docker官方获取仓库的GPG密钥和源地址。可能存在的依赖冲突虽然概率较低但Docker官方包的依赖可能与Ubuntu系统其他软件包的特定版本存在冲突相比Ubuntu官方源概率稍高。安装步骤稍多需要添加仓库、导入密钥等初始化操作。实操心得这是我个人最推荐用于大多数生产环境和开发环境的方式。它在“获取较新版本”和“便于系统化管理”之间取得了最佳平衡。后续的维护升级也非常顺畅。2.3 方式三使用便捷脚本get-docker.sh安装——追求极致的快速与简单Docker官方还提供了一个名为get-docker.sh的Shell脚本。只需一行命令curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh脚本会自动检测你的系统并完成所有安装步骤。核心逻辑这是一个“自动化安装程序”。脚本会执行包括检测系统版本、添加Docker官方仓库、安装必要依赖、安装Docker引擎等一系列操作将复杂过程封装成一个命令。优点极其简单快捷对新手最友好无需理解APT仓库等概念复制粘贴即可。自动适配脚本会自动识别你的Ubuntu版本甚至是其他发行版并选择对应的安装方案。缺点与注意事项“黑盒”操作你无法精确控制安装过程的每一个细节。对于生产服务器盲目运行从网络下载的脚本是危险行为即使它来自官方。不利于后续管理脚本安装后Docker的来源依然是Docker官方APT仓库。但管理员可能不清楚系统里已经添加了这个第三方源导致后续管理上的困惑。无法定制化你不能方便地选择安装特定的版本或组件。实操心得这个脚本非常适合个人学习、快速演示或在一次性环境如临时虚拟机中搭建。但对于任何严肃的、需要长期维护的服务器我都建议使用方式二手动添加官方仓库进行安装这样你对系统状态有完全的控制力和知情权。2.4 方式四离线安装包与二进制文件——应对极端网络环境除了上述三种在线方式在某些无法连接互联网或网络受限的环境如内网生产服务器、安全要求极高的环境我们需要离线安装。核心逻辑提前在有网络的环境中下载好所有必需的.deb安装包及其依赖或直接下载Docker引擎的静态编译二进制文件然后传输到目标服务器进行安装。优点完全脱离网络安装过程不依赖任何外部资源。版本固定可控可以精确部署某个特定版本便于环境一致性管理。缺点与注意事项准备工作繁琐需要手动解决依赖关系对于二进制方式还需要自行配置systemd服务等。更新麻烦每次升级都需要重新走一遍下载和传输的流程。安全性自担需要自行验证下载包的完整性并负责后续的安全更新。3. 核心细节解析与实操要点理解了思路我们来看看实操中的关键细节。这些细节决定了安装是否顺利以及后续是否好用。3.1 安装前的通用准备工作无论选择哪种方式以下几步都强烈建议在安装前完成可以避免大量奇怪的问题。1. 清理旧版本如果是重装或升级Docker的旧版本可能叫docker、docker-engine或docker.io。如果系统里有残留会导致冲突。执行以下命令进行彻底清理sudo apt remove docker docker-engine docker.io containerd runc注意这条命令不会删除镜像、容器、卷等用户数据默认在/var/lib/docker/。如果你需要全新安装可以手动备份后删除该目录。2. 安装基础依赖工具确保apt能通过HTTPS使用仓库sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-releaselsb-release包用于获取系统版本信息一些脚本会用到它。3. 验证虚拟化支持特别是桌面用户如果你在物理机或虚拟机上安装Docker Engine命令行版本Linux内核本身支持即可。但如果你打算安装Docker Desktop for Linux这是一个不同的、包含GUI的软件它需要系统的CPU虚拟化支持如Intel VT-x/AMD-V并在BIOS中启用。 对于命令行版的Docker Engine通常无需特别检查。但如果你在非常老旧的硬件或某些特殊虚拟化环境下遇到问题可以检查内核模块lsmod | grep kvm # 或者检查 /proc/cpuinfo 中的虚拟化标志 grep -E --color (vmx|svm) /proc/cpuinfo有输出则一般支持。3.2 Docker官方仓库安装的深度配置这是最常用的方式我们来拆解每一步的用意。1. 添加Docker的官方GPG密钥GPG密钥用于验证从仓库下载的软件包的完整性和真实性防止被篡改。sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpginstall -m 0755 -d ...以安全的方式创建目录并设置正确的权限755。gpg --dearmor将ASCII格式的GPG密钥转换为二进制格式apt可以直接使用。chmod ar确保所有用户都能读取这个密钥文件。2. 设置稳定版仓库这里需要根据你的系统架构amd64, arm64等和版本如jammy对应22.04来正确设置源。echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/nullarch$(dpkg --print-architecture)自动获取当前系统的架构。signed-by...明确指定用于验证这个源的GPG密钥路径。$(. /etc/os-release echo $VERSION_CODENAME)一种优雅的获取系统版本代号如jammy的方法比写死版本更通用。tee ... /dev/null将内容写入文件同时抑制标准输出。3. 安装特定版本 vs 安装最新版更新包索引后你可以选择安装最新稳定版或者某个特定版本。安装最新稳定版sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装特定版本# 首先查看仓库中可用的版本 apt-cache madison docker-ce | head -5 # 输出类似docker-ce | 5:24.0.7-1~ubuntu.22.04~jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages # 然后安装指定版本例如 24.0.7 sudo apt install docker-ce5:24.0.7-1~ubuntu.22.04~jammy docker-ce-cli5:24.0.7-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin在生产环境中锁定特定版本是推荐做法这可以确保所有服务器环境一致避免因自动升级引入意外变更。3.3 关于docker-compose的特别说明这是一个极易混淆的点。Docker Compose有两个主要版本V1和V2。V1一个独立的Python项目通过docker-compose命令调用。V2Docker官方将Compose功能直接集成到了Docker CLI中作为一个插件docker-compose-plugin提供通过docker compose命令调用注意中间没有横线。现状与选择Docker官方仓库方式二和便捷脚本方式三默认安装的是V2插件即docker-compose-plugin。安装后你应使用docker compose命令。如果你通过pip或下载二进制文件单独安装了docker-compose那很可能是V1使用docker-compose命令。强烈建议使用V2。它是未来性能更好与Docker CLI集成更紧密并且会持续获得更新。V1已进入维护模式。如何检查安装完Docker后运行docker compose version # 如果输出版本信息说明V2已安装。 docker-compose --version # 如果输出版本信息说明系统里还有V1。如果只有V1你可以通过apt安装V2插件sudo apt install docker-compose-plugin。4. 实操过程与核心环节实现下面我将以Ubuntu 22.04 LTS (Jammy Jellyfish)为例完整演示最推荐的**方式二Docker官方APT仓库**的安装流程并穿插关键环节的讲解。4.1 完整安装流程实录步骤1系统更新与旧版本清理首先我们以一个干净的状态开始。打开终端执行sudo apt update sudo apt upgrade -y # 升级现有软件包确保系统最新 sudo apt remove docker docker-engine docker.io containerd runc即使你是新系统执行删除旧版本命令也无害。这里containerd和runc是Docker依赖的底层容器运行时如果之前有安装也可能被一并移除。步骤2安装基础工具安装允许apt通过HTTPS使用仓库的必要工具sudo apt install -y ca-certificates curl gnupg lsb-release-y参数表示自动确认安装避免中途需要手动输入Y。步骤3添加Docker官方GPG密钥按照官方当前推荐的最佳实践将密钥放入/etc/apt/keyrings/目录sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg执行后可以使用ls -la /etc/apt/keyrings/查看密钥文件是否已存在。步骤4设置APT仓库源使用一条命令完成源的添加echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null这条命令的精妙之处在于它的适应性。$(dpkg --print-architecture)会自动替换为你的CPU架构如amd64或arm64。$(. /etc/os-release echo $VERSION_CODENAME)会获取你系统的版本代号如jammy。这意味着同一串命令可以在不同的Ubuntu版本和架构上运行无需修改。步骤5更新APT包索引并安装Docker添加新源后必须更新本地的软件包列表sudo apt update现在你可以查看Docker相关包了apt-cache policy docker-ce输出会显示可以安装的版本以及当前安装的版本暂无。接下来安装Docker引擎、CLI、Containerd以及Compose V2插件sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里安装的docker-compose-plugin就是Compose V2。docker-buildx-plugin是用于构建多平台镜像的强大工具建议一并安装。步骤6验证安装安装完成后Docker服务会自动启动。通过以下命令验证sudo systemctl status docker你应该看到active (running)的状态。然后运行经典的Hello World镜像来测试整个引擎是否工作正常sudo docker run hello-world这个命令会从Docker Hub拉取一个很小的测试镜像运行一个容器输出一段欢迎信息后退出。如果看到“Hello from Docker!”等字样说明安装成功。步骤7可选但重要以非root用户身份管理Docker默认情况下执行docker命令需要sudo权限。为了方便可以将你的用户加入docker用户组这样就不用每次都加sudo了。sudo usermod -aG docker $USER重要执行此命令后你需要完全注销当前会话然后重新登录或者打开一个新的终端窗口用户组变更才会生效。生效后你就可以直接运行docker ps等命令了。实操心得很多新手在执行完usermod后直接在当前终端测试发现依然需要sudo就以为命令没生效。其实只是需要新开一个终端会话。这是一个非常常见的“坑”。4.2 安装后的关键配置安装成功只是第一步合理的配置能让Docker更好用。1. 配置镜像加速器国内用户必备默认从Docker Hub拉取镜像速度可能很慢。我们需要配置国内镜像加速器如阿里云、腾讯云、中科大等提供的服务。 编辑Docker守护进程配置文件如果不存在则创建sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://your-mirror.mirror.aliyuncs.com, https://docker.mirrors.ustc.edu.cn ] } EOF将https://your-mirror.mirror.aliyuncs.com替换为你从阿里云容器镜像服务控制台获取的专属加速器地址需要登录阿里云获取。可以配置多个镜像Docker会按顺序尝试。 配置完成后重启Docker服务使配置生效sudo systemctl daemon-reload sudo systemctl restart docker验证配置是否生效docker info在输出中查找Registry Mirrors部分应该能看到你配置的地址。2. 配置日志驱动与存储驱动高级默认配置对大多数场景足够。但对于生产环境你可能需要调整日志大小限制防止容器日志占满磁盘。同样在/etc/docker/daemon.json中配置{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 }这会将每个容器的日志文件大小限制在10MB最多保留3个文件即30MB。overlay2是当前推荐且默认的存储驱动。5. 常见问题与排查技巧实录即便按照步骤操作你也可能会遇到一些问题。这里记录了我踩过的坑和解决方案。5.1 安装阶段问题问题1添加GPG密钥或仓库时报错“GPG error: NO_PUBKEY”或“The following signatures couldn‘t be verified”这通常是因为GPG密钥没有正确添加或已过期。解决首先尝试重新下载并添加密钥使用前述步骤3的命令。如果问题依旧可以尝试从备用密钥服务器获取sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8 # 注意apt-key命令已逐渐被弃用上述方法可能不适用于最新系统。首选还是通过/etc/apt/keyrings的方式。更根本的方法是检查/etc/apt/sources.list.d/docker.list文件中的signed-by路径是否正确指向了有效的.gpg文件。问题2安装时提示“无法定位软件包 docker-ce”这说明APT没有从Docker仓库找到包。原因可能是仓库源地址写错检查/etc/apt/sources.list.d/docker.list文件内容确保Ubuntu版本代号如jammy正确。没有更新包索引确保在执行sudo apt install之前运行了sudo apt update。架构不匹配极少数情况下仓库可能不支持你的系统架构。用dpkg --print-architecture确认架构并检查Docker官方文档是否支持。问题3使用便捷脚本安装后docker compose命令找不到这说明docker-compose-plugin没有安装。脚本有时可能不会默认安装它。解决手动安装插件即可sudo apt install docker-compose-plugin。5.2 运行时问题问题4运行docker run hello-world提示“Cannot connect to the Docker daemon...”这表示Docker守护进程没有运行或者当前用户没有权限连接Docker socket。排查步骤检查服务状态sudo systemctl status docker。如果没运行启动它sudo systemctl start docker。检查用户组运行groups命令查看当前用户是否在docker组内。如果不在用sudo usermod -aG docker $USER添加并重新登录。检查socket权限有时/var/run/docker.sock文件的权限可能出错。可以临时用sudo docker ...测试如果sudo可以那一定是用户组或socket权限问题。问题5拉取镜像速度极慢甚至超时这是国内网络环境最常见的问题。解决务必配置镜像加速器如前文4.2节所述。配置后记得重启Docker服务。进阶技巧可以配置多个镜像源Docker会依次尝试。也可以为特定的仓库如gcr.io,quay.io单独配置代理或镜像。问题6磁盘空间报警/var/lib/docker目录过大Docker的镜像、容器、卷等数据默认存储在/var/lib/docker。长期使用会积累大量数据。清理手段docker system prune删除所有已停止的容器、未被任何容器使用的网络、构建缓存dangling images。加-a参数还会删除未被使用的镜像。docker volume prune删除未被使用的卷。谨慎操作docker system prune -a --volumes会删除几乎所有未被使用的数据包括卷可能导致数据丢失执行前请确认。根本解决考虑将Docker的数据目录迁移到更大的磁盘分区或者使用外部存储。5.3 版本与兼容性问题问题7如何升级或降级Docker版本假设你通过官方仓库安装。升级到最新版sudo apt update sudo apt upgrade。这会升级所有包包括Docker。升级指定包sudo apt install --only-upgrade docker-ce docker-ce-cli。降级到特定版本首先查看可用版本apt-cache madison docker-ce。卸载当前版本sudo apt remove docker-ce docker-ce-cli注意这不会删除镜像、容器等数据。安装指定版本sudo apt install docker-ceVERSION_STRING docker-ce-cliVERSION_STRING。问题8docker composevsdocker-compose命令混用导致混淆这是V1和V2并存导致的。解决策略卸载V1如果你是通过pip安装的运行pip uninstall docker-compose。如果通过其他方式安装找到并删除二进制文件。统一使用V2确保安装了docker-compose-plugin然后始终使用docker compose没有横线命令。设置别名如果你习惯了docker-compose可以在shell配置文件如~/.bashrc中添加别名alias docker-composedocker compose。5.4 生产环境特别注意事项安全加固不要将用户加入docker组在生产服务器上为了安全不建议将普通用户加入docker组。因为docker组权限等同于root容器逃逸风险。应该始终通过sudo来执行docker命令或者结合更细粒度的授权工具如sudo规则。定期更新关注Docker官方和安全公告定期更新Docker引擎以修复安全漏洞。可以通过配置无人值守升级unattended-upgrades来自动安装安全更新。使用非root用户运行容器在Dockerfile中使用USER指令或者在docker run时使用-u参数指定非root用户UID遵循最小权限原则。资源与监控限制容器资源使用-m、--cpus等参数限制容器的内存和CPU使用防止单个容器耗尽主机资源。配置日志轮转如前文所述在daemon.json中配置log-opts避免日志文件无限增长。监控Docker守护进程确保Docker服务被监控如通过systemd的systemctl status docker或监控工具如Prometheus并在其异常停止时告警。6. 不同场景下的安装方案选型指南最后我们来做个总结面对不同的需求你应该如何选择。场景推荐安装方式核心理由额外建议个人学习/开发笔记本Docker官方APT仓库或Docker Desktop官方仓库能获得较新版本满足开发需求。Docker Desktop提供了图形界面对初学者更友好并集成了Kubernetes。如果机器性能足够且喜欢GUI可选Docker Desktop。否则命令行方式更轻量。生产环境服务器Docker官方APT仓库在“版本较新”和“便于管理”之间最佳平衡。可通过apt进行版本锁定和可控升级。务必锁定具体版本号配置镜像加速器并实施安全加固措施。CI/CD流水线节点Docker官方APT仓库需要稳定且版本可控的环境。官方仓库安装方式易于通过脚本如Ansible自动化部署。考虑将Docker数据目录放在专用磁盘或高速存储上。内网/离线环境离线deb包安装无法连接互联网必须自给自足。需在内网搭建私有镜像仓库如Harbor并规划好离线包的更新流程。快速演示/临时环境便捷脚本 (get-docker.sh)最快速度搭建可用环境用完即弃。确保脚本来源可信Docker官方并在非生产环境使用。追求绝对系统稳定Ubuntu官方仓库 (docker.io)与Ubuntu系统绑定最紧密稳定性第一新特性非必需。接受功能滞后并关注Ubuntu官方提供的安全更新。我个人在实际操作中的体会是对于绝大多数情况从Docker官方APT仓库安装是那个“不会错”的选择。它提供了足够的控制力又不像离线安装那么繁琐能获得较新的版本又不像脚本安装那样“黑盒”。在服务器上我永远会手动执行添加仓库、安装指定版本这一套流程并将这些步骤写入自动化配置脚本如Ansible Playbook。而对于开发者本地环境如果不想折腾直接使用Docker Desktop确实能省去很多麻烦尤其是它在文件共享、网络配置上提供了更直观的解决方案。理解这几种方式的差异不是为了增加选择困难而是让你在遇到问题时能快速定位到问题的根源——是仓库不对是版本冲突还是权限问题。希望这篇近万字的拆解能帮你把Ubuntu上安装Docker这件事彻底搞明白。