1. 为什么在Ubuntu 22.04上安装Docker值得你花时间

如果你正在看这篇文章,大概率是刚接触Ubuntu,或者刚接触Docker,又或者两者都是。你可能会想,网上安装Docker的教程不是一抓一大把吗,为什么还要专门写一篇?我花了不少时间在Ubuntu 22.04 LTS上折腾各种服务,从个人博客到复杂的微服务应用,Docker几乎是我每次搭建环境的起点。我发现,很多教程要么过于简略,只告诉你敲几条命令,要么就是版本老旧,在新系统上会遇到各种“坑”。一个看似简单的 apt install docker.io 背后,其实涉及到软件源选择、用户权限配置、服务启动、镜像加速等一系列细节,任何一个环节没处理好,都可能让你在后续的使用中寸步难行。

Ubuntu 22.04 LTS作为一个长期支持版本,是目前服务器和个人桌面非常主流的选择,它的稳定性和软件生态都相当不错。而Docker,早已不是那个只属于运维工程师的神秘工具,它已经渗透到开发、测试、部署的每一个环节。学会在Ubuntu上正确、完整地安装和配置Docker,就像是给你的Linux系统装上了一把“万能钥匙”,它能帮你瞬间复现一个MySQL数据库、一个Redis缓存、一个Nginx服务器,甚至一个完整的Python或Node.js开发环境,而且彼此隔离,互不干扰。这不仅能极大提升你的工作效率,也是你迈向容器化、云原生技术栈的坚实第一步。

所以,这篇指引的目的,不仅仅是让你把Docker“装上去”,更是要让你理解每一步操作背后的逻辑,知道可能会遇到哪些问题以及如何解决。我会从最基础的准备工作讲起,覆盖官方推荐和Ubuntu仓库两种安装方式,详细配置国内镜像加速,处理最常见的权限和启动问题,最后再带你跑通第一个容器来验证安装。整个过程我会尽量模拟一个真实的、从零开始的Ubuntu 22.04环境,把那些容易踩的“坑”都提前指出来。准备好了吗?我们开始。

2. 安装前的关键准备:清理旧版本与系统更新

在动手安装任何新软件之前,做好准备工作是避免后续一系列诡异问题的关键。对于Docker安装来说,这一步尤其重要,因为系统中可能残留着旧版本、测试版或者其他非官方渠道安装的Docker组件,它们会与新版本产生冲突。

2.1 彻底卸载旧版Docker及相关组件

首先,我们需要检查系统里是否已经存在Docker。打开你的终端,执行以下命令:

sudo apt list --installed | grep docker

如果这个命令返回了任何以“docker”开头的包名,比如 docker.io , docker-ce , docker-ce-cli 等,那么说明系统里已经有Docker了。即使你从未主动安装过,一些桌面环境或应用也可能依赖了旧的 docker.io 包。

为了确保一个干净的安装环境,我们执行一个标准的卸载流程。别担心,这不会删除你的镜像和容器数据(它们通常存放在 /var/lib/docker ),但为了绝对安全,如果你有重要数据,建议先备份。

# 停止所有正在运行的Docker服务
sudo systemctl stop docker.service
sudo systemctl stop docker.socket

# 卸载Docker引擎、命令行工具和容器运行时
sudo apt remove --purge docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc

# 上面的命令可能会提示有些包未安装,这很正常,继续执行即可。

# 删除Docker相关的配置文件和数据目录(谨慎操作!这会删除所有镜像和容器!)
# 如果你确定要全新安装,或者这是全新的系统,可以执行:
# sudo rm -rf /var/lib/docker
# sudo rm -rf /var/lib/containerd

# 我更推荐的做法是重命名而非直接删除,以防万一:
sudo mv /var/lib/docker /var/lib/docker.backup
sudo mv /var/lib/containerd /var/lib/containerd.backup

执行完卸载后,运行 sudo apt autoremove 来清理那些因为Docker而被安装,但现在不再需要的依赖包。

2.2 更新系统并安装核心依赖

一个最新的系统环境能保证软件源的索引是最新的,并且修复了已知的安全漏洞。在Ubuntu上,这是标准操作。

# 更新软件包列表索引
sudo apt update

# 升级所有可升级的已安装软件包
sudo apt upgrade -y

更新完成后,我们需要安装一些让 apt 能通过HTTPS协议使用仓库的必要工具。这些工具是后续添加Docker官方GPG密钥和软件源所必需的。

sudo apt install -y ca-certificates curl gnupg lsb-release
  • ca-certificates : 包含了公认的证书颁发机构(CA)的证书,用于验证HTTPS连接的安全性。
  • curl : 命令行工具,用于从网络下载数据,我们将用它来下载Docker的GPG密钥。
  • gnupg : GNU隐私卫士,用于管理加密密钥,我们将用它来验证下载的软件包的签名。
  • lsb-release : 一个工具,可以很容易地获取当前Linux发行版的LSB(Linux标准基础)信息,比如版本号。

安装完这些,我们的基础环境就准备好了。这里有个小经验:在执行 apt update 后,如果遇到“暂时不能解析域名‘archive.ubuntu.com’”之类的错误,通常是网络问题。可以尝试更换软件源(如换成阿里云、清华的镜像源),或者检查DNS设置( /etc/resolv.conf )。对于服务器,稳定的网络是前提。

3. 两种主流安装方式详解与选型建议

到了核心环节:如何安装Docker。在Ubuntu上,主要有两种途径:通过Docker官方提供的仓库安装,或者使用Ubuntu系统自带的仓库安装。它们各有优劣,我会详细解释,并告诉你哪种情况该选哪个。

3.1 方式一:通过Docker官方仓库安装(推荐用于生产与开发)

这是Docker官方推荐的方式,也是绝大多数生产环境和追求稳定新特性的开发环境所采用的方法。它的好处是版本新、更新及时,并且能确保你安装的是Docker Inc.官方维护的 docker-ce (Community Edition) 版本。

第一步:添加Docker的官方GPG密钥 GPG密钥用于验证从Docker仓库下载的软件包是否被篡改,这是安全安装的重要一环。

# 创建用于存储GPG密钥的目录(如果不存在)
sudo install -m 0755 -d /etc/apt/keyrings

# 下载Docker官方的GPG密钥并保存到指定位置
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置该密钥文件适当的读取权限
sudo chmod a+r /etc/apt/keyrings/docker.gpg

这条命令通过管道( | )将 curl 下载的密钥流直接传递给 gpg --dearmor 进行解码,并输出到文件。一气呵成,避免了将密钥保存到临时文件再移动的步骤。

第二步:添加Docker的APT软件源 接下来,我们需要告诉系统,去哪里找Docker的安装包。我们将源信息写入一个配置文件。

# 根据你的系统架构(通常是x86_64/amd64)和Ubuntu版本(jammy对应22.04)来构造源地址
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=... signed-by=...] : 这是APT源的新语法(Debian 11/Ubuntu 22.04+支持)。 arch 指定架构, signed-by 指定用于验证的GPG密钥文件路径。这比旧的在 /etc/apt/trusted.gpg.d/ 添加密钥的方式更安全、更清晰。
  • https://download.docker.com/linux/ubuntu : Docker官方仓库的基地址。
  • $(lsb_release -cs) : 这个命令会输出你的Ubuntu版本代号,对于22.04就是 jammy 。
  • stable : 使用稳定版仓库。还有 test 和 nightly 频道,但生产环境绝对不要用。

第三步:更新源并安装Docker引擎 添加源之后,需要更新本地软件包列表,然后才能安装。

# 更新软件包列表,让系统识别新添加的Docker源
sudo apt update

# 安装Docker引擎、命令行工具、容器运行时containerd以及docker-compose插件
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这里安装的包:

  • docker-ce : Docker社区版引擎,核心。
  • docker-ce-cli : 命令行接口,你用的 docker 命令就在这里。
  • containerd.io : 行业标准的容器运行时,Docker引擎底层依赖它。
  • docker-buildx-plugin : 用于构建多平台镜像的强大工具。
  • docker-compose-plugin : Docker Compose V2,用于定义和运行多容器应用。注意,这是作为Docker CLI的一个插件安装的,命令是 docker compose (中间没有横线),与旧的Python编写的 docker-compose 不同。

注意 :在运行 sudo apt update 时,你可能会看到关于Docker源的GPG密钥“NO_PUBKEY”警告。这通常是因为上一步添加密钥的权限或路径有问题。请回头检查 /etc/apt/keyrings/docker.gpg 文件是否存在且权限正确(644)。如果问题依旧,可以尝试用 sudo apt-key 旧方式临时解决,但建议还是排查新语法下的配置。

3.2 方式二:通过Ubuntu系统仓库安装(适合快速体验)

Ubuntu自己的软件仓库( universe 组件中)也提供了一个名为 docker.io 的Docker包。这个包的版本通常比较旧,但优点是安装极其简单,不需要添加外部源,适合在只需要快速体验一下Docker功能、且对版本没有要求的临时环境或学习场景。

# 直接安装即可
sudo apt update
sudo apt install -y docker.io

安装完成后,你同样会得到 docker 命令和基本的守护进程。但请注意,这个版本可能不包含最新的 docker-compose-plugin ,你需要额外通过 pip 或下载二进制文件来安装Compose。此外,一些新特性可能不支持。

选型建议总结:

  • 追求稳定、新特性、生产环境 : 毫不犹豫选择方式一(官方源) 。这是行业标准做法。
  • 只是想快速试试、在隔离的测试环境、且系统无法连接外网(但有本地Ubuntu镜像源) :可以考虑方式二。
  • 对于个人开发和学习,我 强烈推荐方式一 。从一开始就接触官方版本和最新工具链,能避免很多后续的兼容性问题。

4. 安装后的必须配置:权限、镜像加速与服务管理

安装完成只是第一步,要让Docker用起来顺手且高效,还需要进行几项关键配置。跳过这一步,你可能会遇到“权限拒绝”、镜像下载慢如蜗牛、或者服务无法开机自启等问题。

4.1 解决“Got permission denied”用户组权限问题

刚安装完Docker,如果你直接运行 docker ps ,很可能会看到这样的错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

这是因为Docker守护进程默认监听一个Unix套接字文件( /var/run/docker.sock ),而这个文件属于 root 用户和 docker 用户组。普通用户没有权限访问它。解决方法不是每次都加 sudo (那样很麻烦且不安全),而是将你的用户加入到 docker 用户组中。

# 将当前登录用户添加到docker用户组
sudo usermod -aG docker $USER
  • usermod : 修改用户属性的命令。
  • -aG : -a 表示追加(append), -G 指定要加入的附加组(Group)。合起来意思是“将用户追加到指定的附加组中”,避免覆盖用户已有的其他组。
  • docker : 组名。
  • $USER : 环境变量,代表当前用户名。

重要提示 :执行此命令后,组权限的变更 不会立即生效 。你需要 完全退出当前终端会话,并重新登录 ,或者开启一个新的终端窗口。这是因为用户组信息在用户登录时被加载到会话中,修改后需要重新加载。

验证是否成功:

# 重新登录后,运行
groups
# 查看输出中是否包含“docker”
# 或者直接运行
docker ps
# 如果不报权限错误,显示容器列表(目前为空),则成功

4.2 配置国内镜像加速器(大幅提升拉取速度)

默认情况下,Docker会从Docker Hub( docker.io )拉取镜像。对于国内用户,这通常速度很慢甚至不稳定。配置一个国内的镜像加速器是必做操作。常见的加速器有阿里云、腾讯云、网易云、中科大等。

这里以阿里云加速器为例(你需要一个阿里云账号来获取专属加速地址):

  1. 访问 https://cr.console.aliyun.com/,登录后进入“容器镜像服务”。
  2. 在左侧菜单找到“镜像工具” -> “镜像加速器”。
  3. 你会看到针对不同操作系统的配置指南,复制Ubuntu章节下的加速器地址,格式类似 https://xxxx.mirror.aliyuncs.com 。

配置Docker使用加速器,需要修改Docker守护进程的配置文件 /etc/docker/daemon.json 。如果文件不存在,就创建它。

# 使用你喜欢的编辑器,比如nano或vim
sudo nano /etc/docker/daemon.json

在文件中输入以下内容(将 https://xxxx.mirror.aliyuncs.com 替换成你从阿里云控制台复制的实际地址):

{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

这个配置文件做了几件事:

  • registry-mirrors : 指定镜像加速器地址。你可以配置多个,用逗号隔开。
  • exec-opts : 设置cgroup驱动为 systemd ,这与Ubuntu 22.04默认使用的cgroup v2和systemd作为init系统是兼容的最佳实践。
  • log-driver 和 log-opts : 配置Docker容器的日志驱动和单个日志文件的最大大小,避免日志占满磁盘。
  • storage-driver : 设置存储驱动为 overlay2 ,这是目前Linux内核推荐且性能较好的驱动。

保存并退出编辑器(在nano中是 Ctrl+X ,然后按 Y 确认,再按 Enter )。

让配置生效:

# 重新加载systemd的守护进程配置
sudo systemctl daemon-reload

# 重启Docker服务
sudo systemctl restart docker

# 验证配置是否生效
docker info

在 docker info 命令输出的信息中,寻找 Registry Mirrors 这一行,如果能看到你配置的加速器地址,说明成功了。

4.3 管理Docker服务:启动、自启与状态查看

Docker在Ubuntu上是通过 systemd 来管理的。掌握几个基本命令非常有用。

# 启动Docker服务(安装后默认已启动,但如果你手动停止了,可以用这个启动)
sudo systemctl start docker

# 停止Docker服务
sudo systemctl stop docker

# 重启Docker服务(修改配置后常用)
sudo systemctl restart docker

# 查看Docker服务的运行状态
sudo systemctl status docker

运行 status 命令后,你会看到一个动态的系统服务状态输出。如果服务是活跃(active)且正在运行(running),你会看到绿色的“active (running)”字样。按 q 键可以退出这个状态视图。

设置Docker开机自动启动 (这对于服务器至关重要):

sudo systemctl enable docker

这个命令会创建相应的systemd符号链接,告诉系统在启动时自动运行Docker服务。你可以用 sudo systemctl is-enabled docker 来验证是否已启用。

5. 验证安装与运行你的第一个容器

配置完成后,我们需要验证Docker是否安装正确,并且一切功能正常。最好的验证方法就是实际运行一个容器。

5.1 运行经典的“Hello World”测试

Docker官方提供了一个极小的测试镜像 hello-world 。运行它:

docker run hello-world

如果你是第一次运行,Docker会从配置的镜像加速器拉取 hello-world:latest 镜像,然后基于它创建一个容器并执行。如果一切顺利,你会在终端看到一段欢迎信息,大致内容是:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

这个输出说明:1. Docker客户端能成功与守护进程通信;2. 能够从镜像仓库拉取镜像;3. 能够成功创建并运行容器。三个核心功能全部正常。

5.2 运行一个更有用的容器:Nginx Web服务器

为了更贴近实际使用,我们来运行一个Nginx容器,它会在后台运行一个Web服务器。

# 拉取最新的Nginx官方镜像(同样会走镜像加速器)
docker pull nginx

# 运行一个名为“my-nginx”的容器,将容器的80端口映射到宿主机的8080端口,并在后台运行(-d 表示 detached mode)
docker run -d --name my-nginx -p 8080:80 nginx
  • -d : 后台运行。
  • --name my-nginx : 给容器起一个名字,方便后续管理(如停止、重启),而不是使用自动生成的ID。
  • -p 8080:80 : 端口映射。格式是 主机端口:容器端口 。这里将宿主机的8080端口映射到容器内部的80端口(Nginx默认监听80)。

现在,打开你的浏览器,访问 http://localhost:8080 或 http://<你的服务器IP>:8080 。你应该能看到Nginx的默认欢迎页面。这说明容器内的网络服务已经成功映射到宿主机,并且可以对外访问了。

5.3 基本的容器管理命令

现在容器在运行了,学习几个最基本的管理命令:

# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 查看指定容器的日志(用于调试)
docker logs my-nginx

# 停止运行中的容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除已停止的容器(加 -f 可以强制删除运行中的容器,但不推荐)
docker rm my-nginx

# 删除镜像(需要先删除依赖它的容器)
docker rmi nginx

通过这一系列操作,你已经完成了从安装、配置到运行一个实际服务容器的完整闭环。这证明了你的Docker环境是健康可用的。

6. 进阶配置与常见问题排查

即使按照上述步骤操作,由于系统环境的差异,你可能还是会遇到一些问题。这里我总结几个在Ubuntu 22.04上安装Docker时最常见的问题及其解决方案。

6.1 问题:Docker服务启动失败,提示“Failed to start Docker Application Container Engine.”

这是最令人头疼的问题之一。原因可能有很多,我们需要查看详细的日志来定位。

# 查看Docker服务的详细日志
sudo journalctl -xu docker.service

仔细阅读日志输出的最后几十行,错误信息通常会在这里。常见原因和解决思路:

  1. 存储驱动问题 :旧系统或某些VPS上,可能内核不支持 overlay2 。可以尝试在 /etc/docker/daemon.json 中更换为 devicemapper 或 vfs (性能差),但更建议升级内核。检查内核支持: grep overlay /proc/filesystems 。
  2. /var/run/docker.sock 权限或路径问题 :确保 /var/run/docker.sock 文件存在且属于 root:docker 组。可以尝试重启Docker服务。
  3. 与现有容器运行时冲突 :如果你之前安装过 podman 、 containerd (非Docker安装的版本)等,可能会产生冲突。尝试彻底卸载它们。
  4. Cgroup驱动不匹配 :在 /etc/docker/daemon.json 中明确设置 "exec-opts": ["native.cgroupdriver=systemd"] 通常能解决。

6.2 问题:虚拟机或WSL2中安装Docker Desktop失败,提示“Virtualization support not detected”

这个错误常见于在Windows上的WSL2中尝试安装Docker Desktop,或者在VMware/VirtualBox虚拟机中安装Docker时。错误核心是:Docker需要CPU的虚拟化支持(Intel VT-x或AMD-V),并且该功能需要在BIOS/UEFI中启用,同时不能被宿主机或其他虚拟机监控程序独占。

排查与解决步骤:

  1. 检查BIOS/UEFI设置 :重启电脑,进入BIOS/UEFI设置界面(通常是开机按F2、Del、F10等键),找到“Virtualization Technology”(Intel)或“SVM Mode”(AMD)的选项,确保其状态为 Enabled 。
  2. 在Windows宿主机上检查 :对于WSL2用户,首先确保Windows本身的Hyper-V和“虚拟机平台”功能已启用。
    • 打开“控制面板” -> “程序” -> “启用或关闭Windows功能”。
    • 勾选“Hyper-V”和“虚拟机平台”。重启电脑。
  3. 在虚拟机软件中设置 :如果你是在VMware或VirtualBox的Ubuntu虚拟机里安装Docker,需要确保虚拟机的处理器设置中,开启了虚拟化引擎。
    • VMware :关闭虚拟机 -> 右键虚拟机设置 -> 处理器 -> 勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”。
    • VirtualBox :关闭虚拟机 -> 设置 -> 系统 -> 处理器 -> 勾选“启用PAE/NX”和“启用嵌套VT-x/AMD-V”。
  4. 在Ubuntu系统内验证 :在终端运行 egrep -c ‘(vmx|svm)’ /proc/cpuinfo 。如果输出数字大于0,说明CPU支持虚拟化且已在BIOS启用。如果输出是0,则说明支持未开启。

6.3 安装并管理Docker Compose

虽然我们通过 docker-compose-plugin 安装了Compose V2,但它的使用命令是 docker compose (注意中间没有横线)。为了兼容习惯,或者如果你需要旧版的 docker-compose (V1),可以单独安装。

使用已安装的Compose插件(推荐) :

# 查看版本
docker compose version

# 使用示例:在包含docker-compose.yml的目录下
docker compose up -d
docker compose down

额外安装独立版本的docker-compose(如果需要) : 可以从GitHub Releases页面直接下载二进制文件,这通常比通过 pip 安装更干净。

# 下载最新稳定版(请去官网查看最新版本号替换)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

6.4 日常维护:清理磁盘空间

Docker用久了,会积累很多无用的镜像、容器、网络和构建缓存,占用大量磁盘空间。定期清理是个好习惯。

# 删除所有已停止的容器
docker container prune -f

# 删除所有未被任何容器引用的镜像(悬空镜像)
docker image prune -f

# 删除所有未被使用的网络
docker network prune -f

# 删除所有未被使用的卷(谨慎!确保卷内数据已备份)
docker volume prune -f

# 一键清理所有未使用的资源(镜像、容器、网络、构建缓存,不包括卷)
docker system prune -f

# 更激进的一键清理(包括未使用的卷,非常谨慎!)
docker system prune -af --volumes

我个人的习惯是,在开发机上每周运行一次 docker system prune -f ,在测试服务器上每次完成一轮测试后运行。对于生产服务器,清理需要非常谨慎,务必确认要删除的资源确实不再需要。

走到这里,你的Ubuntu 22.04系统上应该已经拥有了一个功能完整、配置妥当的Docker环境。从最开始的系统准备,到选择最适合的安装方式,再到解决权限、配置镜像加速,最后验证并运行容器,这个过程涵盖了从入门到能实际使用的全部关键点。Docker的世界很大,但这第一步走得扎实,后面学习容器编排、微服务部署、CI/CD集成才会更加顺畅。记住,遇到问题多查日志( journalctl 和 docker logs ),善用 docker --help 和官方文档,社区的解决方案通常也很丰富。

更多推荐