一、环境说明
- 虚拟机:VMware Workstation Pro 17
- 系统:Ubuntu 24.04.2 服务器版
- SSH 工具:FinalShell 4.5.12
在 Ubuntu 24.04 服务器版上安装 Docker Engine 的完整流程。内容包括环境准备、通过官方源添加 GPG 密钥和软件源、安装 Docker 核心组件及插件、配置国内镜像源以解决拉取慢的问题,以及将当前用户加入 docker 组以实现免 sudo 执行命令。通过验证安装结果和测试 hello-world 镜像,确认 Docker 环境搭建成功。

当前系统状态为刚完成安装,进行一些基础配置。当前登录用户为普通用户,因此所有命令都需要添加 sudo 命令来临时获得 root 权限。建议对当前系统环境拍摄快照,以便后期恢复。
官方安装文档:在 Ubuntu 上安装 Docker Engine
docker -v
可以看到当前系统并没有安装 Docker 引擎,同时系统给出了安装语句,但我们通常建议使用 Docker 官方源安装最新版本,而不是使用 Ubuntu 自带的 docker.io(可能较旧)。
sudo apt update
在安装软件前推荐先执行此命令,用于刷新本地的软件包索引,这样可以确保后续安装或升级时获取的是最新版本信息。
sudo apt install -y ca-certificates curl
ca-certificates:允许系统信任 HTTPS 证书,用于安全地访问网络源。curl:命令行工具,用于从网络下载文件(如 Docker 的 GPG 密钥)。sudo install -m 0755 -d /etc/apt/keyrings
install:一个用于复制文件和创建目录的命令,比 mkdir 和 chmod 的组合更简洁。-m 0755:设置目录的权限为 0755(所有者可读、写、执行,其他用户可读和执行)。这是存储密钥目录的标准权限。-d:指定要创建的是目录而不是文件。/etc/apt/keyrings:APT 包管理器推荐的用于存储第三方软件仓库密钥的目录。下载 Docker 官方的 GPG 密钥,并将其保存到上一步创建的目录中。
GPG 密钥用于验证 Docker 软件包的'身份'和'完整性',确保你下载的 Docker 软件包来自可信的源头,并且在传输过程中没有被任何人篡改或植入恶意代码。
此处地址为官方地址的阿里云镜像地址,Docker 官方地址为:https://download.docker.com/linux/ubuntu。
sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
-f 或 --fail:让 curl 在服务器错误时静默失败(不输出 HTML 错误页面)。-s 或 --silent:静默模式,不显示进度条或错误信息。-S 或 --show-error:与 -s 一起使用时,如果失败会显示错误信息。-L 或 --location:如果请求的页面发生了重定向,则自动跟随重定向。-o /etc/apt/keyrings/docker.asc:将下载的内容输出到指定文件。文件扩展名 .asc 表明这是一个 ASCII 格式的 GPG 密钥。为所有用户添加可读的权限,这样所有用户下载时都可以通过密钥进行验证。
sudo chmod a+r /etc/apt/keyrings/docker.asc
chmod a+r:a 代表所有用户 (all),+r 代表添加读取 (read) 权限。将 Docker 的官方软件源添加到 Ubuntu 24.04 的软件源列表,apt install 时用于获取官方源提供 Docker CE 的所有组件:docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin 等。
即告诉 Ubuntu 系统,以后获取 Docker 软件包不要从 Ubuntu 自己的仓库找,而要从 Docker 官方的这个特定地址获取,并且使用指定的 GPG 密钥来验证这些软件包的真伪。
此处地址为官方地址的阿里云镜像地址,Docker 官方地址为:https://download.docker.com/linux/ubuntu。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "deb [arch=...] ..."
[arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
arch=$(dpkg --print-architecture):这是一个命令替换。它会先执行 dpkg --print-architecture 命令(该命令会输出您系统的架构,如 amd64 或 arm64),然后用输出结果替换这部分内容。这确保了软件源地址与您的系统架构匹配。signed-by=/etc/apt/keyrings/docker.asc:极其重要。它明确指定了用于验证此软件源中所有软件包的 GPG 密钥的路径。这是确保软件包来自 Docker 官方而非恶意镜像的安全关键步骤。http://mirrors.aliyun.com/docker-ce/linux/ubuntu
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
. /etc/os-release:这会执行(source)一个系统文件,该文件包含当前 Ubuntu 版本的详细信息(如 VERSION_ID="24.04", VERSION_CODENAME=noble, UBUNTU_CODENAME=noble)。&& echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}":如果前一个命令成功,则执行 echo。${UBUNTU_CODENAME:-$VERSION_CODENAME} 是一个参数扩展,意思是'如果 UBUNTU_CODENAME 变量存在且不为空,则使用它的值;否则,使用 VERSION_CODENAME 的值'。jammy (22.04), noble (24.04) 等。这确保了您添加的软件源与您的系统版本完全匹配。stable
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|:管道符,将 echo 命令的输出传递给 tee 命令。tee:一个同时输出到屏幕和文件的命令。这里与 sudo 一起使用,以便拥有向受保护目录写入的权限。/etc/apt/sources.list.d/docker.list:将软件源条目写入到 /etc/apt/sources.list.d/ 目录下的一个新文件 docker.list 中。这是一种最佳实践,可以保持组织有序,并且更容易管理和删除单个软件的源。> /dev/null:将 tee 命令输出到标准输出(屏幕) 的内容重定向到'空设备',从而抑制任何输出,保持终端整洁。查看结果:

sudo apt update
在添加了新的软件源(Docker 源)之后,必须再次运行 apt update,这样 APT 才会知道这个新源的存在,并从中获取可用软件包的列表。如果不执行这一步,系统将找不到 Docker 软件包。
安装最新版本的 Docker,包括 Docker 引擎及其相关组件。
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker-ce
dockerd)。docker-ce-cli
docker 命令就来自于它。docker run, docker ps),然后通过 API 与上面的 docker-ce 守护进程通信,并告诉你结果。containerd.io
docker-ce(守护进程)现在将大部分实际的容器运行时操作委托给了 containerd。这种解耦使得架构更清晰,containerd 也可以被其他系统(如 Kubernetes)直接使用。docker-ce 是它的'项目经理'。docker-buildx-plugin
docker build 命令的增强版,支持许多高级特性:
buildx 已成为默认的构建引擎。docker-compose-plugin
docker compose 命令(注意没有横线),用来替代旧的、独立的 docker-compose(Python 编写)工具。
docker-compose.yml 文件来配置你的应用所需的所有服务、网络、卷。docker compose up)就能启动整个复杂的应用栈(例如一个包含 Web 前端、后端 API、数据库、缓存的应用)。发送指令调度容器操作真正运行容器解析 yml 文件处理构建请求用户 docker-ce-cli
CLI 命令行 docker-ce
守护进程 containerd.io
容器运行时 Linux Kernel
系统内核 docker-compose-plugindocker-buildx-plugin

docker -v

安装成功后,Docker 服务将会开机自动启动。
执行 systemctl is-enabled docker 命令,可以看到输出是 enabled,说明 Docker 已经设置为开机自动启动了

当前 Docker 状态:

现在已经安装好 Docker 了,但还不能完全使用。
当前拉取镜像时,是从 Docker Hub 中拉取的。但国内访问 Docker Hub 时,会无法访问,导致无法拉取镜像。

对于这种情况,建议添加国内镜像源地址。
但请放心,国内镜像源本质上是为了提升访问速度而建立的 Docker Hub 缓存代理。它会帮你从 Docker Hub 拉取镜像,并将这些镜像存储在自己的服务器上。你通过它们下载的镜像,源头依然是 Docker Hub。你可以把它们理解为设立在身边的 Docker Hub'分身',旨在解决远距离访问速度慢的问题。
国内镜像源工作流程:
镜像加速器 - Docker Hub 的缓存代理是否检查镜像是否已缓存?直接从缓存返回镜像向 Docker Hub 发起请求缓存镜像到本地返回镜像给用户用户发起 docker pull 请求
例如:docker pull nginx 请求被拦截并转发用户获得镜像 Docker Hub
hub.docker.com
当前 Docker 28.4.0 版本中,并没有存在配置文件,因此需要创建并打开。
sudo vim /etc/docker/daemon.json
当前一些可用的镜像源列表:
| 镜像源名称 | 镜像加速地址 | 主要特点/备注 |
|---|---|---|
| DaoCloud 镜像站 | https://docker.m.daocloud.io | 国内老牌服务商,稳定可靠 |
| 网易云镜像加速 | http://hub-mirror.c.163.com | 多节点覆盖 |
| 中国科学技术大学 | https://docker.mirrors.ustc.edu.cn | 教育网用户访问效果可能较好 |
| 南京大学镜像站 | https://docker.nju.edu.cn | 支持 Docker Hub、GCR、GHCR、Quay、NVCR 等 |
| Docker 中国官方镜像 | https://registry.docker-cn.com | 官方认证,适合企业环境 |
在配置时,我们一般会配置多个镜像源。
Docker 会严格按照配置文件中列出的顺序来尝试镜像源,这时如果第一个源出现问题了,它会继续尝试第二个,以此类推。
它不会自动选择'最快'的镜像源。因此建议将最稳定、最快、最可靠的镜像源放在第一位。
具体配置如下:
{"registry-mirrors":["https://docker.m.daocloud.io","http://hub-mirror.c.163.com","https://docker.nju.edu.cn"]}

注意:这些镜像源的设置不会影响docker search 命令的搜索来源,docker search 默认依然是从 Docker Hub 的官方仓库查询。
重启 Docker 服务,实现镜像源更改。
sudo systemctl restart docker
如果修改了服务配置(例如,修改了 Docker 的 docker.service 文件中的环境变量、启动参数或依赖关系),systemd(Linux 的系统和服务管理器)并不会自动感知到这个变化。
systemctl daemon-reload 命令会通知 systemd 去重新读取并加载所有服务单元文件的更改,使新的配置生效。
当然,它只是让 systemd 记住了新的配置,只有下次启动服务时才会应用。
我们当前修改的配置文件是 daemon.json,在重启服务前无需执行 sudo systemctl daemon-reload 这个命令。
重启后,查看一下镜像源配置是否成功。可以看到相比最初,增加了 Registry Mirrors。
sudo docker info

现在我们可以正常拉取镜像并执行了,拉取(如果本地没有)hello-world 镜像,并创建一个新的容器来运行它,输出'Hello from Docker!'等信息,则表明成功。
sudo docker container run hello-world

默认情况下,只有 root 用户和组名为 docker 的用户组用户才能执行 Docker 命令。
普通用户执行 Docker 命令时需要添加 sudo,如果觉得麻烦,可以将用户添加到 Docker 用户组。
Docker 守护进程(
dockerd)启动后,会创建一个用于通信的 Unix 套接字(Socket)文件,默认路径是/var/run/docker.sock。通过命令可以查看到这个文件的详细信息:
这里的关键信息是:所有者 (Owner):
root所属组 (Group):docker权限 (Permissions):srw-rw----(其中的rw-表示所属组具有读写权限)这意味着:root 用户 永远可以直接操作这个套接字(所以用
sudo总能运行 Docker 命令)。所有属于docker组 的用户也具有读写权限,因此可以无需sudo直接与 Docker 守护进程通信。其他用户则没有任何权限。虽然可以通过修改配置文件
daemon.json的方式,修改默认组名,但不推荐。
默认情况下,安装好 Docker 后,会自动创建一个用户组,通过以下命令可以查看 docker 组 信息。
grep docker /etc/group

/etc/group 文件存储了系统中所有用户组(Group) 的定义信息,其中的每一行都代表一个用户组,其格式由冒号 : 分隔为四个字段。
| 示例值 | 含义 |
|---|---|
docker | 用户组的名称。这就是你查询的组。 |
x | 经过加密的组密码。几乎总是显示为 x,表示密码实际上被存储在更安全的 /etc/gshadow 文件中。通常组密码很少使用。 |
988 | 组 ID (GID)。这是系统用来识别这个组的唯一数字。这个数字在不同系统上可能不同(常见的有 999, 998 等),988 是完全正常的。 |
| (空) | 属于该组的用户成员列表。这个字段是空的,表示目前没有用户被直接添加为这个组的成员。 |
如果没有任何返回,那么可以执行 sudo groupadd docker 命令去创建一个名为 docker 的用户组。
sudo usermod -aG docker $USER
usermod:修改用户属性的命令-aG:追加到附加组 (Append to Supplementary Groups)docker:目标用户组的名称$USER:shell 环境变量,代表当前用户名完成后,再次查看用户组,可以看到当前用户已经添加成功。

docker 组newgrp docker
newgrp 命令的主要目的是临时性地将当前用户会话(terminal session)的主要组(primary group)或附加组(supplementary group)的权限生效。
当前用户已经添加到 docker 组,这个更改虽然被写入了 /etc/group 文件,但不会自动应用到你已经登录的当前会话中。
要让新的组权限生效,有三种方式:
**newgrp** 命令(如果执行 exit 命令会退回到当前用户之前的权限)。我们使用 FinalShell 连接,其实打开一个新的终端窗口更方便。
执行一个 Docker 命令不加 sudo,比如 docker images,可以看到命令正常运行。


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online