
1. 为什么在Ubuntu上安装Docker是开发者的必修课如果你是一名在Ubuntu上工作的开发者、运维工程师或者正在学习容器化技术那么学会在Ubuntu上安装和配置Docker几乎可以算作一项基础生存技能。这听起来可能有点夸张但当你真正开始接触现代应用开发、微服务架构或者持续集成/持续部署CI/CD流程时你会发现Docker无处不在。它就像一个标准化的“集装箱”将你的应用及其所有依赖环境打包在一起彻底解决了“在我机器上能跑到你那就出问题”的经典难题。Ubuntu作为最流行的Linux发行版之一尤其是在服务器和开发环境中与Docker的结合堪称天作之合。无论是使用物理服务器、云主机还是通过WSL2在Windows上运行Ubuntu掌握Docker的安装都是第一步。然而这个过程远不止于在终端里敲入几行命令那么简单。从系统内核版本检查、到软件源的配置再到权限设置和启动后的验证每一步都藏着一些新手容易踩进去的坑。比如你可能兴致勃勃地跟着教程安装却在最后一步遇到“Docker daemon启动失败”或者“用户没有权限执行docker命令”这样的拦路虎。更棘手的是如果你是在WSL2环境下还可能遇到虚拟化支持未检测到virtualization support not detected这类与宿主机深度相关的问题。因此这篇教程的目的不仅仅是告诉你“复制粘贴这些命令就能装上Docker”。我会以一个过来人的身份带你走一遍完整的流程并重点解释每个步骤背后的“为什么”以及如何避开那些常见的陷阱。我们会从最基础的准备工作开始一步步深入到安装后的优化配置确保你不仅能成功安装更能理解其原理为后续的Docker使用打下坚实的基础。2. 安装前的核心准备环境检查与依赖梳理在动手安装任何软件之前充分的准备工作能避免至少80%的后续问题。对于Docker安装这一步尤为重要。2.1 系统版本与内核确认首先我们需要确认你的Ubuntu系统版本和内核是否满足Docker的要求。Docker对Linux内核版本有最低要求而较新的Ubuntu LTS版本通常都满足。打开终端执行以下命令查看系统信息lsb_release -a你会看到类似如下的输出No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy这里的关键是Release: 22.04这代表你使用的是Ubuntu 22.04 LTSJammy Jellyfish。Docker官方支持当前的LTS版本及其前一个LTS版本。所以Ubuntu 20.04 (Focal)、22.04 (Jammy)、24.04 (Noble) 通常都是没问题的。接下来检查内核版本uname -r输出可能类似于5.15.0-91-generic。Docker CE社区版要求内核版本至少为3.10但建议使用4.x或更高版本。现代Ubuntu LTS默认的内核都远超这个要求所以这一步通常只是走个过场但养成检查的习惯是好的。2.2 卸载可能存在的旧版本这是一个非常关键但容易被忽略的步骤。如果你的系统上曾经通过apt安装过旧版本的Docker可能叫docker、docker.io或docker-engine它们可能会与新版本产生冲突。为了确保一个干净的安装环境我们需要先清理它们。执行以下命令组sudo apt-get remove docker docker-engine docker.io containerd runc请注意这个命令只会卸载Docker本身不会删除你已有的镜像、容器、卷或自定义配置文件。这些数据通常存放在/var/lib/docker/目录下如果你需要全新开始可以手动删除这个目录警告这将永久删除所有容器和镜像数据。2.3 安装必要的工具和配置软件源Docker的安装并不直接从Ubuntu默认的软件仓库获取。我们需要将Docker官方的软件仓库添加到系统的APT源列表中这样apt才能知道从哪里下载最新、最稳定的Docker包。首先安装一些用于通过HTTPS使用仓库的依赖包sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-releaseca-certificates: 用于验证HTTPS连接的安全性。curl: 命令行工具用于从网络下载文件这里用来下载Docker的GPG密钥。gnupg: GNU隐私卫士用于管理加密密钥这里用于验证Docker软件包的签名。lsb-release: 我们已经用过的工具用于获取系统发行版信息。接下来添加Docker官方的GPG密钥。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. 下载密钥并经过--dearmor处理将ASCII-armor格式转换为二进制格式后保存。然后将Docker仓库添加到APT源列表。这里我们需要根据你的系统架构通常是x86_64/amd64和版本代号来构造正确的仓库地址。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/.../docker.gpg]: 指定仓库适用的系统架构自动获取和用于验证的GPG密钥路径。https://download.docker.com/linux/ubuntu: Docker官方仓库的URL。$(lsb_release -cs): 自动获取你的Ubuntu版本代号如jammy。stable: 使用稳定版仓库。Docker还提供test测试版和nightly每日构建版仓库但生产环境强烈建议使用stable。sudo tee ... /dev/null: 将生成的仓库配置行写入/etc/apt/sources.list.d/docker.list文件并抑制输出。完成以上步骤后再次更新APT包索引让系统识别新添加的Docker仓库sudo apt-get update注意如果你在这一步遇到GPG error或NO_PUBKEY错误通常是因为GPG密钥没有正确添加或已过期。可以尝试重新下载并添加密钥或者检查仓库URL和版本代号是否正确。3. Docker安装的核心步骤与组件解析环境准备就绪后我们就可以正式安装Docker了。但安装的不仅仅是docker这一个包而是一组协同工作的组件。3.1 安装Docker引擎及相关组件执行安装命令sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里我们安装了多个包每个都有其作用docker-ce: Docker Community Edition的核心引擎即Docker守护进程dockerd和客户端docker。docker-ce-cli: Docker命令行接口CLI就是你用来输入docker run,docker ps等命令的工具。虽然docker-ce通常包含一个基础CLI但单独安装这个包能确保你获得完整功能的CLI。containerd.io: 一个行业标准的容器运行时。从Docker 1.11版本之后Docker引擎实际上是通过containerd来管理容器生命周期的创建、启动、停止等。它是Docker架构中的关键底层组件。docker-buildx-plugin: Docker的扩展构建工具支持多架构构建比如在AMD64机器上构建ARM64的镜像、构建缓存等高级功能。docker-compose-plugin: 将docker-compose功能集成到Docker CLI中。安装后你可以使用docker compose命令注意是空格不是横杠来管理和运行多容器应用这比单独安装docker-compose二进制文件更方便且版本与Docker引擎绑定兼容性更好。实操心得我强烈建议一次性安装所有这些插件。buildx对于现代多平台镜像构建几乎是必需品而docker compose插件则是管理复杂项目的标准方式。一次性装好避免后续再折腾。安装过程可能会提示你确认磁盘空间占用输入Y并回车即可。APT会自动处理所有依赖关系。3.2 启动Docker服务并设置开机自启安装完成后Docker服务守护进程默认不会自动启动。我们需要手动启动它并设置为开机自动启动这样重启服务器后Docker依然可用。sudo systemctl start docker sudo systemctl enable dockersudo systemctl start docker: 立即启动Docker服务。sudo systemctl enable docker: 设置Docker服务为开机自启。这会在系统启动时自动运行Docker守护进程。你可以通过以下命令检查Docker服务的运行状态sudo systemctl status docker如果看到Active: active (running)的字样并且下面没有红色的错误日志说明服务已经成功启动。3.3 验证安装与经典“Hello World”测试服务启动后最激动人心的时刻来了——运行你的第一个容器验证整个Docker环境是否工作正常。Docker官方提供了一个极小的测试镜像hello-world。运行以下命令sudo docker run hello-world如果一切顺利你会在终端看到一段欢迎信息大致内容如下Hello from Docker! This message shows that your installation appears to be working correctly. ...这个命令背后发生了什么docker run命令告诉Docker引擎要运行一个容器。Docker首先在本地查找名为hello-world的镜像没找到。于是它自动从默认的公共镜像仓库Docker Hub拉取pullhello-world:latest镜像。拉取完成后Docker基于这个镜像创建并启动一个新的容器。容器内预置的程序执行输出了你看到的那段文本然后容器进程结束。看到这段输出恭喜你Docker已经在你的Ubuntu系统上成功安装并运行起来了4. 安装后的关键配置权限管理与镜像加速安装成功只是第一步。为了让日常使用更顺畅、更安全我们还需要进行两项至关重要的配置。4.1 解决“Permission denied”问题将用户加入docker组你是否注意到在验证安装时我们使用了sudo默认情况下只有root用户和docker组的成员才有权限与Docker守护进程通信通过Unix socket/var/run/docker.sock。每次执行docker命令都加sudo非常麻烦而且有安全风险相当于赋予了普通用户部分root权限。更优雅的做法是将你的普通用户添加到docker组中。首先确保docker组存在安装Docker时会自动创建sudo groupadd docker如果提示组已存在忽略即可。然后将当前用户加入docker组sudo usermod -aG docker $USER-aG:-a表示追加append-G指定要加入的组。这样不会覆盖用户已有的其他组。$USER: 环境变量代表当前登录的用户名。这里有一个至关重要的细节组权限的更改不会立即生效于当前已登录的会话。你需要完全退出当前终端并重新登录或者打开一个新的终端窗口。简单关闭再打开同一个终端标签页可能不够因为你的shell会话进程仍然持有旧的组信息。重新登录后验证是否生效groups在输出列表中你应该能看到docker。现在你就可以不用sudo直接运行Docker命令了docker run hello-world重要警告将用户加入docker组实质上是授予了该用户相当于root的权限。因为Docker守护进程以root身份运行而通过它启动的容器在默认情况下也拥有宿主机的root权限。因此请仅将你信任的用户加入此组。在生产服务器上需谨慎评估。4.2 提升镜像拉取速度配置国内镜像加速器如果你在国内直接从Docker Hub拉取镜像可能会非常缓慢甚至超时失败。为此我们可以配置一个国内的镜像加速器。国内许多云服务商都提供了免费的Docker镜像加速服务。这里以阿里云容器镜像服务提供的加速器为例你需要一个阿里云账号来获取专属加速器地址但也可以使用其公共地址不过公共地址可能有速率限制。方法一使用阿里云专属加速地址推荐访问阿里云容器镜像服务控制台。在左侧菜单选择“镜像工具” - “镜像加速器”。你会看到针对不同操作系统的配置指南。在Ubuntu部分找到你的加速器地址格式类似于https://xxxx.mirror.aliyuncs.com。方法二使用其他公共加速地址一些常用的公共加速地址有中科大镜像https://docker.mirrors.ustc.edu.cn网易镜像https://hub-mirror.c.163.com腾讯云镜像https://mirror.ccs.tencentyun.com配置加速器需要修改Docker守护进程的配置文件/etc/docker/daemon.json。如果文件不存在就创建它。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://xxxx.mirror.aliyuncs.com] } EOF请将https://xxxx.mirror.aliyuncs.com替换为你自己的加速器地址。如果你想配置多个镜像源可以用数组形式例如{ registry-mirrors: [ https://hub-mirror.c.163.com, https://mirror.baidubce.com ] }修改配置后需要重启Docker服务使配置生效sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效docker info在输出信息中寻找Registry Mirrors部分你应该能看到你刚刚配置的镜像地址。5. 进阶配置与故障排查指南即使按照上述步骤操作你仍有可能遇到一些问题。此外一些优化配置能让你的Docker体验更好。5.1 存储驱动选择与磁盘空间管理Docker使用存储驱动来管理镜像和容器的数据层。对于Ubuntu默认的存储驱动通常是overlay2它性能良好且是推荐的选择。你可以通过docker info查看Storage Driver。随着使用Docker会占用大量磁盘空间镜像、停止的容器、卷、构建缓存等。定期清理是必要的。查看磁盘使用情况docker system df这个命令会清晰地列出镜像、容器、本地卷和构建缓存各占用了多少空间。清理无用资源docker system prune -a警告这个命令会删除所有已停止的容器、所有未被任何容器使用的网络、所有悬空镜像none和所有构建缓存。-a参数还会删除所有未被容器使用的镜像即所有未被引用的镜像。执行前请确认。5.2 常见安装与启动故障排查问题一安装时提示“无法定位软件包 docker-ce”这通常是因为APT源没有正确添加或更新。检查确认/etc/apt/sources.list.d/docker.list文件内容正确特别是Ubuntu版本代号。解决重新执行添加GPG密钥和仓库的步骤然后sudo apt-get update。问题二启动Docker服务失败报错关于“iptables”或“cgroup”这可能是系统内核或相关模块的问题。检查运行sudo journalctl -xe -u docker查看详细的启动日志。解决尝试更新系统sudo apt update sudo apt upgrade重启后重试。确保没有其他防火墙或安全软件冲突。问题三在WSL2中安装Docker Desktop失败提示“virtualization support not detected”这是在Windows宿主机上运行WSL2时安装Docker Desktop的常见问题与Ubuntu子系统内的Docker安装无关。但如果你想在纯WSL2 Ubuntu内使用Docker不安装Docker Desktop可以参考以下步骤在WSL2的Ubuntu中按照本教程安装Docker Enginedocker-ce。你需要手动启动Docker守护进程。由于WSL2不支持systemd我们可以使用service命令或直接运行dockerd。一种简单方法是在~/.bashrc文件末尾添加sudo service docker start但每次需要输入密码。更优雅的方式是使用第三方脚本如genie来创建一个systemd环境但这会增加复杂性。实际上更推荐的做法是在Windows主机上安装Docker Desktop for Windows并集成WSL2后端。这样你可以在Windows和WSL2中无缝使用Docker命令由Docker Desktop统一管理守护进程和资源。遇到上述错误时你需要进入电脑BIOS启用虚拟化技术Intel VT-x或AMD-V并在Windows中启用“Hyper-V”和“Windows Subsystem for Linux”功能。问题四运行docker run时提示“Cannot connect to the Docker daemon”这表示Docker客户端无法连接到守护进程。检查首先确认Docker服务是否运行sudo systemctl status docker。解决如果服务未运行启动它。如果服务在运行可能是权限问题。确保你已重新登录以使docker组生效或者当前命令使用了sudo。5.3 日常使用小技巧命令自动补全为bash或zsh安装Docker命令补全功能可以极大提高效率。通常安装bash-completion包后Docker CLI的补全脚本会自动安装。使用docker-compose对于多容器应用务必学习使用docker compose通过我们安装的插件。用一个docker-compose.yml文件定义所有服务、网络、卷通过docker compose up -d一键启动管理起来比一堆docker run命令清晰太多。理解镜像标签拉取镜像时尽量指定具体版本标签如nginx:1.25-alpine而不是只用nginx默认为latest。latest标签是流动的今天和明天拉取的可能是不同版本不利于环境稳定。安装和配置Docker只是容器化之旅的起点。当你熟悉了这些基础操作后就可以开始探索如何构建自己的镜像编写Dockerfile、管理数据卷、配置容器网络等更深入的主题了。记住多动手实践遇到问题善用docker --help、官方文档和社区资源这个工具的强大能力会逐渐为你所用。