Ubuntu 22.04 Docker安装配置全攻略:从零到生产环境部署
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
)拉取镜像。对于国内用户,这通常速度很慢甚至不稳定。配置一个国内的镜像加速器是必做操作。常见的加速器有阿里云、腾讯云、网易云、中科大等。
这里以阿里云加速器为例(你需要一个阿里云账号来获取专属加速地址):
- 访问 https://cr.console.aliyun.com/,登录后进入“容器镜像服务”。
- 在左侧菜单找到“镜像工具” -> “镜像加速器”。
-
你会看到针对不同操作系统的配置指南,复制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
仔细阅读日志输出的最后几十行,错误信息通常会在这里。常见原因和解决思路:
-
存储驱动问题
:旧系统或某些VPS上,可能内核不支持
overlay2。可以尝试在/etc/docker/daemon.json中更换为devicemapper或vfs(性能差),但更建议升级内核。检查内核支持:grep overlay /proc/filesystems。 -
/var/run/docker.sock权限或路径问题 :确保/var/run/docker.sock文件存在且属于root:docker组。可以尝试重启Docker服务。 -
与现有容器运行时冲突
:如果你之前安装过
podman、containerd(非Docker安装的版本)等,可能会产生冲突。尝试彻底卸载它们。 -
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中启用,同时不能被宿主机或其他虚拟机监控程序独占。
排查与解决步骤:
- 检查BIOS/UEFI设置 :重启电脑,进入BIOS/UEFI设置界面(通常是开机按F2、Del、F10等键),找到“Virtualization Technology”(Intel)或“SVM Mode”(AMD)的选项,确保其状态为 Enabled 。
-
在Windows宿主机上检查
:对于WSL2用户,首先确保Windows本身的Hyper-V和“虚拟机平台”功能已启用。
- 打开“控制面板” -> “程序” -> “启用或关闭Windows功能”。
- 勾选“Hyper-V”和“虚拟机平台”。重启电脑。
-
在虚拟机软件中设置
:如果你是在VMware或VirtualBox的Ubuntu虚拟机里安装Docker,需要确保虚拟机的处理器设置中,开启了虚拟化引擎。
- VMware :关闭虚拟机 -> 右键虚拟机设置 -> 处理器 -> 勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”。
- VirtualBox :关闭虚拟机 -> 设置 -> 系统 -> 处理器 -> 勾选“启用PAE/NX”和“启用嵌套VT-x/AMD-V”。
-
在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
和官方文档,社区的解决方案通常也很丰富。
更多推荐

所有评论(0)