Ubuntu 24.04 安装 Docker

一、环境说明

  • 虚拟机:VMware Workstation Pro 17

  • 系统:Ubuntu 24.04.2 服务器版

  • SSH:FinalShell 4.5.12

当前系统状态为刚完成安装,进行一些基础配置。

当前登录用户为普通用户,因此所有命令都需要添加 sudo 命令来临时获得 root 权限。至于需要输入密码的问题,通过修改 /etc/sudoers 来解决。

因为当前使用的是 VMware,考虑到安装过程可能出现意外,建议对当前系统环境拍摄快照,以便后期恢复。

拍摄快照:VMware 选中当前计算机 - 右键选中「快照」 - 「拍摄快照」。

官方安装文档:在 Ubuntu 上安装 Docker Engine

二、安装 Docker

2.1 验证当前系统是否安装 Docker

bash 复制代码
docker -v

可以看到当前系统并没有安装 Docker 引擎,同时系统给出了安装语句,但我们通常建议使用 Docker 官方源安装最新版本,而不是使用 Ubuntu 自带的 docker.io(可能较旧)。

2.2 更新软件包索引

bash 复制代码
sudo apt update

在安装软件前推荐先执行此命令,用于刷新本地的软件包索引,这样可以确保后续安装或升级时获取的是最新版本信息。

2.3 安装依赖包

bash 复制代码
sudo apt install -y ca-certificates curl
  • ca-certificates:允许系统信任 HTTPS 证书,用于安全地访问网络源。
  • curl:命令行工具,用于从网络下载文件(如 Docker 的 GPG 密钥)。

2.4 创建用于存储 GPG 密钥的目录

bash 复制代码
sudo install -m 0755 -d /etc/apt/keyrings
  • install:一个用于复制文件和创建目录的命令,比 mkdirchmod 的组合更简洁。
  • -m 0755:设置目录的权限为 0755(所有者可读、写、执行,其他用户可读和执行)。这是存储密钥目录的标准权限。
  • -d:指定要创建的是目录而不是文件。
  • /etc/apt/keyrings:APT 包管理器推荐的用于存储第三方软件仓库密钥的目录。

2.5 下载 GPG 密钥

下载 Docker 官方的 GPG 密钥,并将其保存到上一步创建的目录中。

GPG 密钥用于验证 Docker 软件包的"身份"和"完整性",确保你下载的 Docker 软件包来自可信的源头,并且在传输过程中没有被任何人篡改或植入恶意代码。

在官方中使用下载的地址是:https://download.docker.com/linux/ubuntu/gpg,此处改为阿里云镜像地址,但下载下来的还是官方的 GPG 密钥。

bash 复制代码
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 密钥。

2.6 更改密钥文件的权限

为所有用户添加可读的权限,这样所有用户下载时都可以通过密钥进行验证。

bash 复制代码
sudo chmod a+r /etc/apt/keyrings/docker.asc
  • chmod a+ra 代表所有用户 (all),+r 代表添加读取 (read) 权限。

2.7 添加 Docker 的软件源

将 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。

bash 复制代码
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
  1. echo "deb [arch=...] ..."
    • 用于生成一个标准的 Debian/Ubuntu 软件源条目(sources.list entry)。
  2. [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
    • arch=$(dpkg --print-architecture):这是一个命令替换 。它会先执行 dpkg --print-architecture 命令(该命令会输出您系统的架构,如 amd64arm64),然后用输出结果替换这部分内容。这确保了软件源地址与您的系统架构匹配。
    • signed-by=/etc/apt/keyrings/docker.asc极其重要。它明确指定了用于验证此软件源中所有软件包的 GPG 密钥的路径。这是确保软件包来自 Docker 官方而非恶意镜像的安全关键步骤。
  3. http://mirrors.aliyun.com/docker-ce/linux/ubuntu
    • Docker 官方软件源的阿里云镜像地址。
  4. $(. /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 的值"。
    • 最终,这部分会被替换为您的 Ubuntu 系统代号,例如 jammy (22.04), noble (24.04) 等。这确保了您添加的软件源与您的系统版本完全匹配。
  5. stable
    • 指定要使用 Docker 的稳定版(stable)发布通道。而不是测试版(test)或夜间构建版(nightly)。
  6. | 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 命令输出到标准输出(屏幕) 的内容重定向到"空设备",从而抑制任何输出,保持终端整洁。

查看结果:

2.8 更新软件包索引

bash 复制代码
sudo apt update

在添加了新的软件源(Docker 源)之后,必须再次运行 apt update,这样 APT 才会知道这个新源的存在,并从中获取可用软件包的列表。如果不执行这一步,系统将找不到 Docker 软件包。

2.9 安装 Docker

安装最新版本的 Docker,包括 Docker 引擎及其相关组件。

bash 复制代码
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. docker-ce
    • 全称:Docker Community Edition
    • 作用 :这是 Docker 引擎的核心 ,也就是常说的 "Docker 守护进程" (dockerd)。
    • 功能 :它是一个持续运行的后台服务,负责管理 Docker 的方方面面:
      • 下载和存储镜像(Images)。
      • 创建、运行、停止和删除容器(Containers)。
      • 管理网络(Networks)和存储卷(Volumes)。
      • 暴露 REST API 供其他工具(如 CLI)调用。
    • 简言之:它是 Docker 的"大脑"和"发动机"。
  2. docker-ce-cli
    • 全称:Docker Community Edition Command Line Interface
    • 作用 :这是 Docker 的命令行工具 。你平时在终端里打的 docker 命令就来自于它。
    • 功能 :它本身不执行管理操作,而是作为一个客户端,接收你的命令(如 docker run, docker ps),然后通过 API 与上面的 docker-ce 守护进程通信,并告诉你结果。
    • 简言之:它是用户与 Docker 引擎交互的"遥控器"。
  3. containerd.io
    • 作用 :这是一个行业标准的容器运行时。它是更底层、更核心的组件。
    • 功能 :它负责容器生命周期的最底层操作,例如:
      • 从镜像中拉取和存储容器文件系统层。
      • 管理容器的执行、暂停、恢复和销毁。
      • 管理容器网络和存储的低级细节。
    • 与 Docker 的关系 :从 Docker 的架构演变来看,docker-ce(守护进程)现在将大部分实际的容器运行时操作委托 给了 containerd。这种解耦使得架构更清晰,containerd 也可以被其他系统(如 Kubernetes)直接使用。
    • 简言之 :它是真正"动手"拉取镜像和运行容器的"工程师",而 docker-ce 是它的"项目经理"。
  4. docker-buildx-plugin
    • 作用 :Docker 的扩展构建插件,提供了下一代强大的镜像构建功能。
    • 功能 :它是 docker build 命令的增强版,支持许多高级特性:
      • 多平台构建:一次性为多种 CPU 架构(如 amd64, arm64, arm/v7)构建镜像,无需复杂的交叉编译环境。
      • 构建缓存管理:更高效的缓存机制,加速构建过程。
      • 并行构建:同时处理多个构建任务,充分利用多核CPU。
    • 注意 :在较新版本的 Docker 中,buildx 已成为默认的构建引擎。
  5. docker-compose-plugin
    • 作用 :Docker 官方提供的 Compose 功能,用于定义和运行多容器应用。
    • 功能 :它提供了 docker compose 命令(注意没有横线),用来替代旧的、独立的 docker-compose(Python 编写)工具。
      • 通过一个 docker-compose.yml 文件来配置你的应用所需的所有服务、网络、卷。
      • 用一个命令(docker compose up)就能启动整个复杂的应用栈(例如一个包含 Web 前端、后端 API、数据库、缓存的应用)。
    • 为什么是插件形式:Docker 公司为了更好的集成和发布周期,将 Compose 功能做成了 CLI 插件,而不是一个独立的二进制文件。

发送指令 调度容器操作 真正运行容器 解析yml文件 处理构建请求 用户 docker-ce-cli
CLI 命令行 docker-ce
守护进程 containerd.io
容器运行时 Linux Kernel
系统内核 docker-compose-plugin docker-buildx-plugin

2.10 验证安装是否成功

bash 复制代码
docker -v

2.11 开机自启

安装成功后,Docker 服务将会开机自动启动。

执行 systemctl is-enabled docker 命令,可以看到输出是 enabled,说明 Docker 已经设置为开机自动启动了

三、替换国内镜像源

3.1 拉取镜像失败

当前 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

3.2 打开配置文件

当前 Docker 28.4.0 版本中,并没有存在配置文件,因此需要创建并打开。

bash 复制代码
sudo vim /etc/docker/daemon.json

3.3 添加镜像源

当前一些可用的镜像源列表:

镜像源名称 镜像加速地址 主要特点/备注
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 会严格按照配置文件中列出的顺序来尝试镜像源,这时如果第一个源出现问题了,它会继续尝试第二个,以此类推。

它不会自动选择"最快"的镜像源 。因此建议将最稳定、最快、最可靠的镜像源放在第一位

具体配置如下:

json 复制代码
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "http://hub-mirror.c.163.com",
    "https://docker.nju.edu.cn"
  ]
}

注意:这些镜像源的设置不会影响 docker search 命令的搜索来源,docker search 默认依然是从 Docker Hub 的官方仓库查询。

3.4 重启 Docker 服务

重启 Docker 服务,实现镜像源更改。

bash 复制代码
sudo systemctl restart docker

如果修改了服务配置(例如,修改了 Docker 的 docker.service 文件中的环境变量、启动参数或依赖关系),systemd(Linux 的系统和服务管理器) 并不会自动感知到这个变化。

systemctl daemon-reload 命令会通知 systemd 去重新读取并加载所有服务单元文件的更改,使新的配置生效。

当然,它只是让 systemd 记住了新的配置,只有下次启动服务时才会应用。

我们当前修改的配置文件是 daemon.json,在重启服务前无需执行 sudo systemctl daemon-reload 这个命令。

3.5 验证配置

重启后,查看一下镜像源配置是否成功。可以看到相比最初,增加了 Registry Mirrors

bash 复制代码
sudo docker info

3.6 测试

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

bash 复制代码
sudo docker container run hello-world

四、添加当前用户到用户组

4.1 权限说明

默认情况下,只有 root 用户和组名为 docker 的用户组用户才能执行 Docker 命令。

普通用户执行 Docker 命令时需要添加 sudo,如果觉得麻烦,可以将用户添加到 Docker 用户组。

Docker 守护进程(dockerd)启动后,会创建一个用于通信的 Unix 套接字(Socket)文件,默认路径是 /var/run/docker.sock

通过命令可以查看到这个文件的详细信息:

bash 复制代码
lanyu@server:~$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Sep 15 09:37 /var/run/docker.sock

这里的关键信息是:

  • 所有者 (Owner) : root
  • 所属组 (Group) : docker
  • 权限 (Permissions) : srw-rw----(其中的 rw- 表示所属组具有读写权限)

这意味着:

  1. root 用户 永远可以直接操作这个套接字(所以用 sudo 总能运行 Docker 命令)。
  2. 所有属于 docker 的用户也具有读写权限,因此可以无需 sudo 直接与 Docker 守护进程通信。
  3. 其他用户则没有任何权限。

虽然可以通过修改配置文件 daemon.json 的方式,修改默认组名,但不推荐。

4.2 查看用户组

默认情况下,安装好 Docker 后,会自动创建一个用户组,通过以下命令可以查看 docker 信息。

bash 复制代码
grep docker /etc/group

/etc/group 文件存储了系统中所有用户组(Group) 的定义信息,其中的每一行都代表一个用户组,其格式由冒号 : 分隔为四个字段。

示例值 含义
docker 用户组的名称。这就是你查询的组。
x 经过加密的组密码 。几乎总是显示为 x,表示密码实际上被存储在更安全的 /etc/gshadow 文件中。通常组密码很少使用。
988 组ID (GID) 。这是系统用来识别这个组的唯一数字。这个数字在不同系统上可能不同(常见的有 999, 998 等),988 是完全正常的。
(空) 属于该组的用户成员列表 。这个字段是空的,表示目前没有用户被直接添加为这个组的成员

如果没有任何返回,那么可以执行 sudo groupadd docker 命令去创建一个名为 docker 的用户组。

4.3 添加当前用户

bash 复制代码
sudo usermod -aG docker $USER
  • usermod:修改用户属性的命令
  • -aG:追加到附加组 (Append to Supplementary Groups)
  • docker:目标用户组的名称
  • $USER:shell 环境变量,代表当前用户名

完成后,再次查看用户组,可以看到当前用户已经添加成功。

4.4 切换到 docker

bash 复制代码
newgrp docker

newgrp 命令的主要目的是临时性地将当前用户会话(terminal session)的主要组(primary group)或附加组(supplementary group)的权限生效

当前用户已经添加到 docker 组,这个更改虽然被写入了 /etc/group 文件,但不会自动应用到你已经登录的当前会话中

要让新的组权限生效,有三种方式:

  • 注销后重新登录(最彻底的方式)。
  • 打开一个新的终端窗口(新的会话会读取新的组信息)。
  • 使用 newgrp 命令(如果执行 exit 命令会退回到当前用户之前的权限)。

我们使用 FinalShell 连接,其实打开一个新的终端窗口更方便

4.5 测试

执行一个 Docker 命令不加 sudo ,比如 docker images,可以看到命令正常运行。

复制代码
相关推荐
衡动科技2 小时前
Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)
ubuntu·树莓派·ros2
T0uken2 小时前
WSL:离线配置 Ubuntu 开发环境
linux·运维·ubuntu
�羡阳丶2 小时前
ubuntu22.04+5060显卡双系统安装,各种黑屏踩坑记录
linux·经验分享·ubuntu
b_xinjun11202 小时前
树莓派 Ubuntu 24.04.3 LTS 安装 OpenClaw 操作说明
linux·ubuntu·arcgis
暮秋4742 小时前
ubuntu部署阿里通义千问模型
运维·ubuntu·大模型
维度攻城狮2 小时前
Docker-Ubuntu安装并启动Chrome浏览器
chrome·ubuntu·docker·安装
硅基导游3 小时前
Linux内核观测与跟踪的利器BPF环境测试
linux·服务器·性能监控·bpf
YXXY3133 小时前
Linux进程概念(四)
linux
了一梨4 小时前
[T113] 交叉编译 OpenCV 4.5.2 + face 模块
linux·笔记·opencv