Ubuntu 24.04 安装 Docker
<h2 id="一环境说明">一、环境说明</h2><ul>
<li>虚拟机:VMware Workstation Pro 17</li>
<li>系统:Ubuntu 24.04.2 服务器版</li>
<li>SSH:FinalShell 4.5.12</li>
</ul>
<p>当前系统状态为刚完成安装,进行一些基础配置。</p>
<p>当前登录用户为普通用户,因此所有命令都需要添加 <code>sudo</code> 命令来临时获得 <code>root</code> 权限。至于需要输入密码的问题,通过修改 <code>/etc/sudoers</code> 来解决。</p>
<p>因为当前使用的是 VMware,考虑到安装过程可能出现意外,建议对当前系统环境拍摄快照,以便后期恢复。</p>
<p>拍摄快照:VMware 选中当前计算机 - 右键选中「快照」 - 「拍摄快照」。</p>
<p>官方安装文档:在 Ubuntu 上安装 Docker Engine</p>
<h2 id="二安装-docker">二、安装 Docker</h2>
<h3 id="21-验证当前系统是否安装-docker">2.1 验证当前系统是否安装 Docker</h3>
<pre><code class="language-bash">docker -v
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816105-1532385417.png" alt="Ubuntu2404Docker安装-25103017-01" loading="lazy"></p>
<p>可以看到当前系统并没有安装 Docker 引擎,同时系统给出了安装语句,但我们通常建议使用 Docker 官方源安装最新版本,而不是使用 Ubuntu 自带的 docker.io(可能较旧)。</p>
<h3 id="22-更新软件包索引">2.2 更新软件包索引</h3>
<pre><code class="language-bash">sudo apt update
</code></pre>
<p>在安装软件前推荐先执行此命令,用于刷新本地的软件包索引,这样可以确保后续安装或升级时获取的是最新版本信息。</p>
<h3 id="23-安装依赖包">2.3 安装依赖包</h3>
<pre><code class="language-bash">sudo apt install -y ca-certificates curl
</code></pre>
<ul>
<li><code>ca-certificates</code>:允许系统信任 HTTPS 证书,用于安全地访问网络源。</li>
<li><code>curl</code>:命令行工具,用于从网络下载文件(如 Docker 的 GPG 密钥)。</li>
</ul>
<h3 id="24-创建用于存储-gpg-密钥的目录">2.4 创建用于存储 GPG 密钥的目录</h3>
<pre><code class="language-bash">sudo install -m 0755 -d /etc/apt/keyrings
</code></pre>
<ul>
<li><code>install</code>:一个用于复制文件和创建目录的命令,比 <code>mkdir</code> 和 <code>chmod</code> 的组合更简洁。</li>
<li><code>-m 0755</code>:设置目录的权限为 <code>0755</code>(所有者可读、写、执行,其他用户可读和执行)。这是存储密钥目录的标准权限。</li>
<li><code>-d</code>:指定要创建的是目录而不是文件。</li>
<li><code>/etc/apt/keyrings</code>:APT 包管理器推荐的用于存储第三方软件仓库密钥的目录。</li>
</ul>
<h3 id="25-下载-gpg-密钥">2.5 下载 GPG 密钥</h3>
<p>下载 Docker 官方的 GPG 密钥,并将其保存到上一步创建的目录中。</p>
<p><strong>GPG 密钥用于验证 Docker 软件包的“身份”和“完整性”,确保你下载的 Docker 软件包来自可信的源头,并且在传输过程中没有被任何人篡改或植入恶意代码。</strong></p>
<p>在官方中使用下载的地址是:https://download.docker.com/linux/ubuntu/gpg,此处改为阿里云镜像地址,但下载下来的还是官方的 GPG 密钥。</p>
<pre><code class="language-bash">sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
</code></pre>
<ul>
<li><code>-f</code> 或 <code>--fail</code>:让 curl 在服务器错误时静默失败(不输出 HTML 错误页面)。</li>
<li><code>-s</code> 或 <code>--silent</code>:静默模式,不显示进度条或错误信息。</li>
<li><code>-S</code> 或 <code>--show-error</code>:与 <code>-s</code> 一起使用时,如果失败会显示错误信息。</li>
<li><code>-L</code> 或 <code>--location</code>:如果请求的页面发生了重定向,则自动跟随重定向。</li>
<li><code>-o /etc/apt/keyrings/docker.asc</code>:将下载的内容输出到指定文件。文件扩展名 <code>.asc</code> 表明这是一个 ASCII 格式的 GPG 密钥。</li>
</ul>
<h3 id="26-更改密钥文件的权限">2.6 更改密钥文件的权限</h3>
<p>为所有用户添加可读的权限,这样所有用户下载时都可以通过密钥进行验证。</p>
<pre><code class="language-bash">sudo chmod a+r /etc/apt/keyrings/docker.asc
</code></pre>
<ul>
<li><code>chmod a+r</code>:<code>a</code> 代表所有用户 (all),<code>+r</code> 代表添加读取 (read) 权限。</li>
</ul>
<h3 id="27-添加-docker-的软件源">2.7 添加 Docker 的软件源</h3>
<p>将 Docker 的官方软件源添加到 Ubuntu 24.04 的软件源列表,<code>apt install</code> 时用于获取官方源提供 Docker CE 的所有组件:<code>docker-ce</code>, <code>docker-ce-cli</code>, <code>containerd.io</code>, <code>docker-buildx-plugin</code>, <code>docker-compose-plugin</code> 等。</p>
<p><strong>即告诉 Ubuntu 系统,以后获取 Docker 软件包不要从 Ubuntu 自己的仓库找,而要从 Docker 官方的这个特定地址获取,并且使用指定的 GPG 密钥来验证这些软件包的真伪</strong>。</p>
<p>此处地址为官方地址的阿里云镜像地址,Docker 官方地址为:https://download.docker.com/linux/ubuntu。</p>
<pre><code class="language-bash">echo \
"deb 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
</code></pre>
<ol>
<li><strong><code>echo "deb ..."</code></strong>:
<ul>
<li>用于生成一个标准的 Debian/Ubuntu 软件源条目(sources.list entry)。</li>
</ul>
</li>
<li><strong><code></code></strong>:
<ul>
<li><code>arch=$(dpkg --print-architecture)</code>:这是一个<strong>命令替换</strong>。它会先执行 <code>dpkg --print-architecture</code> 命令(该命令会输出您系统的架构,如 <code>amd64</code> 或 <code>arm64</code>),然后用输出结果替换这部分内容。这确保了软件源地址与您的系统架构匹配。</li>
<li><code>signed-by=/etc/apt/keyrings/docker.asc</code>:<strong>极其重要</strong>。它明确指定了用于验证此软件源中所有软件包的 GPG 密钥的路径。这是确保软件包来自 Docker 官方而非恶意镜像的安全关键步骤。</li>
</ul>
</li>
<li><strong><code>http://mirrors.aliyun.com/docker-ce/linux/ubuntu</code></strong>:
<ul>
<li>Docker 官方软件源的阿里云镜像地址。</li>
</ul>
</li>
<li><strong><code>$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")</code></strong>:
<ul>
<li>这是另一个<strong>命令替换</strong>和<strong>参数扩展</strong>的巧妙结合。</li>
<li><code>. /etc/os-release</code>:这会执行(source)一个系统文件,该文件包含当前 Ubuntu 版本的详细信息(如 <code>VERSION_ID="24.04"</code>, <code>VERSION_CODENAME=noble</code>, <code>UBUNTU_CODENAME=noble</code>)。</li>
<li><code>&& echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}"</code>:如果前一个命令成功,则执行 <code>echo</code>。<code>${UBUNTU_CODENAME:-$VERSION_CODENAME}</code> 是一个参数扩展,意思是“如果 <code>UBUNTU_CODENAME</code> 变量存在且不为空,则使用它的值;否则,使用 <code>VERSION_CODENAME</code> 的值”。</li>
<li>最终,这部分会被替换为您的 Ubuntu 系统代号,例如 <code>jammy</code> (22.04), <code>noble</code> (24.04) 等。这确保了您添加的软件源与您的系统版本完全匹配。</li>
</ul>
</li>
<li><strong><code>stable</code></strong>:
<ul>
<li>指定要使用 Docker 的稳定版(stable)发布通道。而不是测试版(test)或夜间构建版(nightly)。</li>
</ul>
</li>
<li><strong><code>| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null</code></strong>:
<ul>
<li><code>|</code>:管道符,将 <code>echo</code> 命令的输出传递给 <code>tee</code> 命令。</li>
<li><code>tee</code>:一个同时输出到屏幕和文件的命令。这里与 <code>sudo</code> 一起使用,以便拥有向受保护目录写入的权限。</li>
<li><code>/etc/apt/sources.list.d/docker.list</code>:将软件源条目写入到 <code>/etc/apt/sources.list.d/</code> 目录下的一个新文件 <code>docker.list</code> 中。这是一种最佳实践,可以保持组织有序,并且更容易管理和删除单个软件的源。</li>
<li><code>> /dev/null</code>:将 <code>tee</code> 命令输出到<strong>标准输出(屏幕)</strong> 的内容重定向到“空设备”,从而抑制任何输出,保持终端整洁。</li>
</ul>
</li>
</ol>
<p>查看结果:</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815938-213199597.png" alt="Ubuntu2404Docker安装-25103017-02" loading="lazy"></p>
<h3 id="28-更新软件包索引">2.8 更新软件包索引</h3>
<pre><code class="language-bash">sudo apt update
</code></pre>
<p>在添加了新的软件源(Docker 源)之后,必须再次运行 <code>apt update</code>,这样 APT 才会知道这个新源的存在,并从中获取可用软件包的列表。如果不执行这一步,系统将找不到 Docker 软件包。</p>
<h3 id="29-安装-docker">2.9 安装 Docker</h3>
<p>安装<strong>最新版本</strong>的 Docker,包括 Docker 引擎及其相关组件。</p>
<pre><code class="language-bash">sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
</code></pre>
<ol>
<li><code>docker-ce</code>
<ul>
<li><strong>全称</strong>:Docker Community Edition</li>
<li><strong>作用</strong>:这是 <strong>Docker 引擎的核心</strong>,也就是常说的 "Docker 守护进程" (<code>dockerd</code>)。</li>
<li><strong>功能</strong>:它是一个持续运行的后台服务,负责管理 Docker 的方方面面:
<ul>
<li>下载和存储镜像(Images)。</li>
<li>创建、运行、停止和删除容器(Containers)。</li>
<li>管理网络(Networks)和存储卷(Volumes)。</li>
<li>暴露 REST API 供其他工具(如 CLI)调用。</li>
</ul>
</li>
<li><strong>简言之</strong>:它是 Docker 的“大脑”和“发动机”。</li>
</ul>
</li>
<li><code>docker-ce-cli</code>
<ul>
<li><strong>全称</strong>:Docker Community Edition Command Line Interface</li>
<li><strong>作用</strong>:这是 <strong>Docker 的命令行工具</strong>。你平时在终端里打的 <code>docker</code> 命令就来自于它。</li>
<li><strong>功能</strong>:它本身不执行管理操作,而是作为一个客户端,接收你的命令(如 <code>docker run</code>, <code>docker ps</code>),然后通过 API 与上面的 <code>docker-ce</code> 守护进程通信,并告诉你结果。</li>
<li><strong>简言之</strong>:它是用户与 Docker 引擎交互的“遥控器”。</li>
</ul>
</li>
<li><code>containerd.io</code>
<ul>
<li><strong>作用</strong>:这是一个<strong>行业标准的容器运行时</strong>。它是更底层、更核心的组件。</li>
<li><strong>功能</strong>:它负责容器生命周期的最底层操作,例如:
<ul>
<li>从镜像中拉取和存储容器文件系统层。</li>
<li>管理容器的执行、暂停、恢复和销毁。</li>
<li>管理容器网络和存储的低级细节。</li>
</ul>
</li>
<li><strong>与 Docker 的关系</strong>:从 Docker 的架构演变来看,<code>docker-ce</code>(守护进程)现在将大部分实际的容器运行时操作<strong>委托</strong>给了 <code>containerd</code>。这种解耦使得架构更清晰,<code>containerd</code> 也可以被其他系统(如 Kubernetes)直接使用。</li>
<li><strong>简言之</strong>:它是真正“动手”拉取镜像和运行容器的“工程师”,而 <code>docker-ce</code> 是它的“项目经理”。</li>
</ul>
</li>
<li><code>docker-buildx-plugin</code>
<ul>
<li><strong>作用</strong>:Docker 的<strong>扩展构建插件</strong>,提供了下一代强大的镜像构建功能。</li>
<li><strong>功能</strong>:它是 <code>docker build</code> 命令的增强版,支持许多高级特性:
<ul>
<li><strong>多平台构建</strong>:一次性为多种 CPU 架构(如 amd64, arm64, arm/v7)构建镜像,无需复杂的交叉编译环境。</li>
<li><strong>构建缓存管理</strong>:更高效的缓存机制,加速构建过程。</li>
<li><strong>并行构建</strong>:同时处理多个构建任务,充分利用多核CPU。</li>
</ul>
</li>
<li><strong>注意</strong>:在较新版本的 Docker 中,<code>buildx</code> 已成为默认的构建引擎。</li>
</ul>
</li>
<li><code>docker-compose-plugin</code>
<ul>
<li><strong>作用</strong>:Docker 官方提供的 <strong>Compose 功能</strong>,用于定义和运行多容器应用。</li>
<li><strong>功能</strong>:它提供了 <code>docker compose</code> 命令(注意没有横线),用来替代旧的、独立的 <code>docker-compose</code>(Python 编写)工具。
<ul>
<li>通过一个 <code>docker-compose.yml</code> 文件来配置你的应用所需的所有服务、网络、卷。</li>
<li>用一个命令(<code>docker compose up</code>)就能启动整个复杂的应用栈(例如一个包含 Web 前端、后端 API、数据库、缓存的应用)。</li>
</ul>
</li>
<li><strong>为什么是插件形式</strong>:Docker 公司为了更好的集成和发布周期,将 Compose 功能做成了 CLI 插件,而不是一个独立的二进制文件。</li>
</ul>
</li>
</ol>
<div class="mermaid">graph LR
A[用户] --> B
B -- 发送指令 --> C
C -- 调度容器操作 --> D
D -- 真正运行容器 --> E
F -- 解析yml文件 --> C
G -- 处理构建请求 --> C
</div><p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816030-1423890844.png" alt="Ubuntu2404Docker安装-25103017-03" loading="lazy"></p>
<h3 id="210-验证安装是否成功">2.10 验证安装是否成功</h3>
<pre><code class="language-bash">docker -v
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815930-409601335.png" alt="Ubuntu2404Docker安装-25103017-04" loading="lazy"></p>
<h3 id="211-开机自启">2.11 开机自启</h3>
<p><strong>安装成功后,Docker 服务将会开机自动启动。</strong></p>
<p>执行 <code>systemctl is-enabled docker</code> 命令,可以看到输出是 <code>enabled</code>,说明 Docker 已经设置为开机自动启动了</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816026-849120804.png" alt="Ubuntu2404Docker安装-25103017-05" loading="lazy"></p>
<h2 id="三替换国内镜像源">三、替换国内镜像源</h2>
<h3 id="31-拉取镜像失败">3.1 拉取镜像失败</h3>
<p>当前 Docker 状态:</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816090-679684370.png" alt="Ubuntu2404Docker安装-25103017-06" loading="lazy"></p>
<p>现在已经安装好 Docker 了,但还不能完全使用。</p>
<p>当前拉取镜像时,是从 Docker Hub 中拉取的。但国内访问 Docker Hub 时,会无法访问,导致无法拉取镜像。</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815981-641296121.png" alt="Ubuntu2404Docker安装-25103017-07" loading="lazy"></p>
<p>对于这种情况,建议<strong>添加国内镜像源地址</strong>。</p>
<p>但请放心,国内镜像源本质上是<strong>为了提升访问速度而建立的 Docker Hub 缓存代理</strong>。它会帮你从 Docker Hub 拉取镜像,并将这些镜像存储在自己的服务器上。你通过它们下载的镜像,<strong>源头依然是 Docker Hub</strong>。你可以把它们理解为设立在身边的 Docker Hub “分身”,旨在解决远距离访问速度慢的问题。</p>
<p>国内镜像源工作流程:</p>
<div class="mermaid">flowchart TD
A[用户发起 docker pull 请求<br>例如: docker pull nginx] --> B{请求被拦截并转发}
B --> C[配置的国内镜像源<br>如 docker.xuanyuan.me]
subgraph C [镜像加速器 - Docker Hub 的缓存代理]
D{检查镜像是否已缓存?}
D -- 是 --> E[直接从缓存返回镜像]
D -- 否 --> F[向 Docker Hub 发起请求]
F --> G[缓存镜像到本地]
G --> H[返回镜像给用户]
end
E --> I[用户获得镜像]
H --> I
F -.-> J
</div><h3 id="32-打开配置文件">3.2 打开配置文件</h3>
<p>当前 Docker 28.4.0 版本中,并没有存在配置文件,因此需要创建并打开。</p>
<pre><code class="language-bash">sudo vim /etc/docker/daemon.json
</code></pre>
<h3 id="33-添加镜像源">3.3 添加镜像源</h3>
<p>当前一些可用的镜像源列表:</p>
<table>
<thead>
<tr>
<th style="text-align: left">镜像源名称</th>
<th style="text-align: left">镜像加速地址</th>
<th style="text-align: left">主要特点/备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong>DaoCloud 镜像站</strong></td>
<td style="text-align: left"><code>https://docker.m.daocloud.io</code></td>
<td style="text-align: left">国内老牌服务商,稳定可靠</td>
</tr>
<tr>
<td style="text-align: left"><strong>网易云镜像加速</strong></td>
<td style="text-align: left"><code>http://hub-mirror.c.163.com</code></td>
<td style="text-align: left">多节点覆盖</td>
</tr>
<tr>
<td style="text-align: left"><strong>中国科学技术大学</strong></td>
<td style="text-align: left"><code>https://docker.mirrors.ustc.edu.cn</code></td>
<td style="text-align: left">教育网用户访问效果可能较好</td>
</tr>
<tr>
<td style="text-align: left"><strong>南京大学镜像站</strong></td>
<td style="text-align: left"><code>https://docker.nju.edu.cn</code></td>
<td style="text-align: left">支持 Docker Hub、GCR、GHCR、Quay、NVCR 等</td>
</tr>
<tr>
<td style="text-align: left"><strong>Docker 中国官方镜像</strong></td>
<td style="text-align: left"><code>https://registry.docker-cn.com</code></td>
<td style="text-align: left">官方认证,适合企业环境</td>
</tr>
</tbody>
</table>
<p>在配置时,我们一般会配置多个镜像源。</p>
<p>Docker 会<strong>严格按照配置文件中列出的顺序</strong>来尝试镜像源,这时如果第一个源出现问题了,它会继续尝试第二个,以此类推。</p>
<p><strong>它不会自动选择“最快”的镜像源</strong>。因此建议将<strong>最稳定、最快、最可靠的镜像源放在第一位</strong>。</p>
<p>具体配置如下:</p>
<pre><code class="language-json">{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"http://hub-mirror.c.163.com",
"https://docker.nju.edu.cn"
]
}
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815958-54251591.png" alt="Ubuntu2404Docker安装-25103017-08" loading="lazy"></p>
<p>注意:这些镜像源的设置<strong>不会影响</strong> <code>docker search</code> 命令的搜索来源,<code>docker search</code> 默认依然是从 Docker Hub 的官方仓库查询。</p>
<h3 id="34-重启-docker-服务">3.4 重启 Docker 服务</h3>
<p>重启 Docker 服务,实现镜像源更改。</p>
<pre><code class="language-bash">sudo systemctl restart docker
</code></pre>
<p>如果修改了服务配置(例如,修改了 Docker 的 <code>docker.service</code> 文件中的环境变量、启动参数或依赖关系),<code>systemd</code>(Linux 的系统和服务管理器) 并不会自动感知到这个变化。</p>
<p><code>systemctl daemon-reload</code> 命令会<strong>通知 <code>systemd</code> 去重新读取并加载所有服务单元文件</strong>的更改,使新的配置生效。</p>
<p>当然,它只是让 <code>systemd</code> 记住了新的配置,只有下次启动服务时才会应用。</p>
<p>我们当前修改的配置文件是 daemon.json,在重启服务前无需执行 <code>sudo systemctl daemon-reload</code> 这个命令。</p>
<h3 id="35-验证配置">3.5 验证配置</h3>
<p>重启后,查看一下镜像源配置是否成功。可以看到相比最初,增加了 <code>Registry Mirrors</code>。</p>
<pre><code class="language-bash">sudo docker info
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816083-47975171.png" alt="Ubuntu2404Docker安装-25103017-09" loading="lazy"></p>
<h3 id="36-测试">3.6 测试</h3>
<p>现在我们可以正常拉取镜像并执行了,拉取(如果本地没有)<code>hello-world</code> 镜像,并创建一个新的容器来运行它,输出 “Hello from Docker!” 等信息,则表明成功。</p>
<pre><code class="language-bash">sudo docker container run hello-world
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142816096-1868268055.png" alt="Ubuntu2404Docker安装-25103017-10" loading="lazy"></p>
<h2 id="四添加当前用户到用户组">四、添加当前用户到用户组</h2>
<h3 id="41-权限说明">4.1 权限说明</h3>
<p>默认情况下,只有 root 用户和组名为 <code>docker</code> 的用户组用户才能执行 Docker 命令。</p>
<p>普通用户执行 Docker 命令时需要添加 <code>sudo</code>,如果觉得麻烦,可以将用户添加到 Docker 用户组。</p>
<blockquote>
<p>Docker 守护进程(<code>dockerd</code>)启动后,会创建一个用于通信的 Unix 套接字(Socket)文件,默认路径是 <code>/var/run/docker.sock</code>。</p>
<p>通过命令可以查看到这个文件的详细信息:</p>
<pre><code class="language-bash">lanyu@server:~$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Sep 15 09:37 /var/run/docker.sock
</code></pre>
<p>这里的关键信息是:</p>
<ul>
<li><strong>所有者 (Owner)</strong>: <code>root</code></li>
<li><strong>所属组 (Group)</strong>: <code>docker</code></li>
<li><strong>权限 (Permissions)</strong>: <code>srw-rw----</code>(其中的 <code>rw-</code> 表示所属组具有读写权限)</li>
</ul>
<p>这意味着:</p>
<ol>
<li><strong>root 用户</strong> 永远可以直接操作这个套接字(所以用 <code>sudo</code> 总能运行 Docker 命令)。</li>
<li>所有属于 <strong><code>docker</code> 组</strong> 的用户也具有读写权限,因此可以无需 <code>sudo</code> 直接与 Docker 守护进程通信。</li>
<li>其他用户则没有任何权限。</li>
</ol>
<p>虽然可以通过修改配置文件 <code>daemon.json</code> 的方式,修改默认组名,但不推荐。</p>
</blockquote>
<h3 id="42-查看用户组">4.2 查看用户组</h3>
<p>默认情况下,安装好 Docker 后,会自动创建一个用户组,通过以下命令可以查看 <strong><code>docker</code> 组</strong> 信息。</p>
<pre><code class="language-bash">grep docker /etc/group
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815925-1522826258.png" alt="Ubuntu2404Docker安装-25103017-11" loading="lazy"></p>
<p><code>/etc/group</code> 文件存储了系统中所有<strong>用户组(Group)</strong> 的定义信息,其中的每一行都代表一个用户组,其格式由冒号 <code>:</code> 分隔为四个字段。</p>
<table>
<thead>
<tr>
<th style="text-align: left">示例值</th>
<th style="text-align: left">含义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><code>docker</code></td>
<td style="text-align: left"><strong>用户组的名称</strong>。这就是你查询的组。</td>
</tr>
<tr>
<td style="text-align: left"><code>x</code></td>
<td style="text-align: left"><strong>经过加密的组密码</strong>。几乎总是显示为 <code>x</code>,表示密码实际上被存储在更安全的 <code>/etc/gshadow</code> 文件中。通常组密码很少使用。</td>
</tr>
<tr>
<td style="text-align: left"><code>988</code></td>
<td style="text-align: left"><strong>组ID (GID)</strong>。这是系统用来识别这个组的唯一数字。<strong>这个数字在不同系统上可能不同</strong>(常见的有 999, 998 等),988 是完全正常的。</td>
</tr>
<tr>
<td style="text-align: left"><strong>(空)</strong></td>
<td style="text-align: left"><strong>属于该组的用户成员列表</strong>。这个字段是空的,表示目前<strong>没有用户被直接添加为这个组的成员</strong>。</td>
</tr>
</tbody>
</table>
<p>如果没有任何返回,那么可以执行 <code>sudo groupadd docker</code> 命令去创建一个名为 <code>docker</code> 的用户组。</p>
<h3 id="43-添加当前用户">4.3 添加当前用户</h3>
<pre><code class="language-bash">sudo usermod -aG docker $USER
</code></pre>
<ul>
<li><code>usermod</code>:修改用户属性的命令</li>
<li><code>-aG</code>:追加到附加组 (Append to Supplementary Groups)</li>
<li><code>docker</code>:目标用户组的名称</li>
<li><code>$USER</code>:shell 环境变量,代表当前用户名</li>
</ul>
<p>完成后,再次查看用户组,可以看到当前用户已经添加成功。</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815952-531648451.png" alt="Ubuntu2404Docker安装-25103017-12" loading="lazy"></p>
<h3 id="44-切换到-docker-组">4.4 切换到 <code>docker</code> 组</h3>
<pre><code class="language-bash">newgrp docker
</code></pre>
<p><code>newgrp</code> 命令的主要目的是<strong>临时性地将当前用户会话(terminal session)的主要组(primary group)或附加组(supplementary group)的权限生效</strong>。</p>
<p>当前用户已经添加到 <code>docker</code> 组,这个更改虽然被写入了 <code>/etc/group</code> 文件,但<strong>不会自动应用到你已经登录的当前会话中</strong>。</p>
<p>要让新的组权限生效,有三种方式:</p>
<ul>
<li><strong>注销后重新登录</strong>(最彻底的方式)。</li>
<li><strong>打开一个新的终端窗口</strong>(新的会话会读取新的组信息)。</li>
<li>使用 <strong><code>newgrp</code></strong> 命令(如果执行 <code>exit</code> 命令会退回到当前用户之前的权限)。</li>
</ul>
<p>我们使用 FinalShell 连接,其实<strong>打开一个新的终端窗口更方便</strong>。</p>
<h3 id="45-测试">4.5 测试</h3>
<p>执行一个 Docker 命令不加 <code>sudo</code> ,比如 <code>docker images</code>,可以看到命令正常运行。</p>
<p><img src="https://img2024.cnblogs.com/blog/3531988/202511/3531988-20251103142815990-325735020.png" alt="Ubuntu2404Docker安装-25103017-13" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/lanyusky/p/19187095
頁:
[1]