mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 16:37:34 +00:00
chore: lint cleanup and version corrections
- Accept benign linter changes (version notes, explicit tags, formatting) - Fix incorrect version downgrades introduced by linter: - golang:1.22→1.26 (restored) - rust:1.82→1.95 (restored) - 23 files updated
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
## 1.1 快速上手
|
||||
|
||||
> **版本说明**:本节示例基于 Docker v29.x 编写。示例中使用的 `nginx:alpine` 镜像标签为演示用途,请查阅 [Docker Hub - nginx](https://hub.docker.com/_/nginx) 确认最新可用版本。
|
||||
|
||||
本节将通过一个简单的 Web 应用例子,带你快速体验 Docker 的核心流程:构建镜像、运行容器。
|
||||
|
||||
### 为什么选择 Nginx + HTML 作为入门例子?
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 2.1 镜像
|
||||
|
||||
> **版本说明**:本节示例基于 Docker v29.x 编写。示例中使用的镜像标签(如 `ubuntu:24.04`、`nginx:latest`)为演示用途,建议查阅 [Docker Hub](https://hub.docker.com) 或相应镜像的官方页面确认最新可用版本。
|
||||
|
||||
Docker 镜像作为容器运行的基石,其设计理念和实现机制至关重要。本节将深入探讨镜像的本质、与操作系统的关系、内容构成以及核心的分层存储机制。
|
||||
|
||||
### 2.1.1 一句话理解镜像
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
## 2.3 仓库
|
||||
|
||||
> **版本说明**:本节示例基于 Docker v29.x 和常见镜像版本编写。示例中的版本号(如 `nginx:1.25`、`mysql:8.0`、`mysql:5.7` 等)为演示用途。实际使用时请访问 [Docker Hub 官方页面](https://hub.docker.com) 或相应镜像的发布页确认最新可用版本和标签。
|
||||
|
||||
Docker Registry 是镜像分发和管理的核心组件。本节将介绍 Registry 的基本概念、公共和私有服务的选择,以及镜像的安全管理。
|
||||
|
||||
### 2.3.1 一句话理解 Registry
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# 第二章 基本概念
|
||||
|
||||
> **版本说明**:本章内容及示例基于 Docker v29.x 编写。镜像标签相关示例请查阅官方文档以确认最新可用版本。
|
||||
|
||||
**Docker** 包括三个基本概念:
|
||||
|
||||
* **镜像** (`Image`):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
CLI 的实验特性通常包含仍在开发中的新功能。幸运的是,在较新版本中这些特性已经更加易用。
|
||||
|
||||
从 `v20.10` 版本开始,Docker CLI 所有实验特性的命令均默认开启,无需再进行配置或设置系统环境变量。
|
||||
从 `v20.10` 及更高版本开始,Docker CLI 所有实验特性的命令均默认开启,无需再进行配置或设置系统环境变量。
|
||||
|
||||
### 3.10.2 开启 dockerd 的实验特性
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ Ubuntu 是 Docker 最常用的运行环境之一。本节将介绍如何在 Ubun
|
||||
|
||||
#### 系统要求
|
||||
|
||||
根据 Docker 官方安装文档,当前受支持的 [Ubuntu](https://ubuntu.com/server) 64 位版本包括:
|
||||
根据 Docker 官方安装文档,当前受支持的 [Ubuntu](https://ubuntu.com/server) 64 位版本包括(具体以官方 [安装文档](https://docs.docker.com/engine/install/ubuntu/) 为准):
|
||||
|
||||
|
||||
* Ubuntu Resolute Raccoon 26.04 (LTS)
|
||||
|
||||
@@ -14,7 +14,7 @@ Debian 以其稳定性著称,是 Docker 的理想宿主系统。本节将指
|
||||
|
||||
#### 系统要求
|
||||
|
||||
Docker 支持以下版本的 [Debian](https://www.debian.org/intro/about) 操作系统:
|
||||
Docker 支持以下版本的 [Debian](https://www.debian.org/intro/about) 操作系统(具体以官方 [安装文档](https://docs.docker.com/engine/install/debian/) 为准):
|
||||
|
||||
* Debian Trixie 13 (stable)
|
||||
* Debian Bookworm 12 (oldstable,全面支持至 2026 年 6 月 10 日,LTS 至 2028 年 6 月 30 日)
|
||||
|
||||
@@ -14,7 +14,7 @@ Fedora 的快速发布周期(每 6 个月发布新版本)决定了它的用
|
||||
|
||||
#### 系统要求
|
||||
|
||||
根据 Docker 官方安装文档,当前受支持的 [Fedora](https://getfedora.org/) 版本包括:
|
||||
根据 Docker 官方安装文档,当前受支持的 [Fedora](https://getfedora.org/) 版本包括(具体以官方 [安装文档](https://docs.docker.com/engine/install/fedora/) 为准):
|
||||
|
||||
* Fedora 44
|
||||
* Fedora 43
|
||||
|
||||
@@ -16,7 +16,7 @@ CentOS (及其替代品 Rocky Linux、AlmaLinux) 是企业级服务器常用的
|
||||
|
||||
> **严重警告**:CentOS 7 已于 2024 年 6 月 30 日结束所有支持,不再接收任何安全更新。CentOS 8 已于 2021 年 12 月 31 日停止维护。强烈建议新项目使用 **Rocky Linux** 或 **AlmaLinux** 替代,这两个项目由社区维护,提供长期支持承诺。
|
||||
|
||||
Docker 官方当前安装文档覆盖的 CentOS 平台为 **CentOS Stream 9** 和 **CentOS Stream 10**。Rocky Linux、AlmaLinux 等 RHEL 兼容发行版通常可以沿用相近步骤,但建议先在测试环境验证仓库与依赖是否匹配。
|
||||
Docker 官方当前安装文档覆盖的 CentOS 平台为 **CentOS Stream 9** 和 **CentOS Stream 10**(具体以官方 [安装文档](https://docs.docker.com/engine/install/centos/) 为准)。Rocky Linux、AlmaLinux 等 RHEL 兼容发行版通常可以沿用相近步骤,但建议先在测试环境验证仓库与依赖是否匹配。
|
||||
|
||||
对于 Rocky Linux、AlmaLinux 或 CentOS Stream,推荐使用 `dnf` 包管理器。
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ Docker 对 ARM 架构有着良好的支持。
|
||||
|
||||
Docker 可以运行在多种 CPU 架构上,但本小节**只聚焦 Raspberry Pi OS 32-bit (armhf)** 的官方安装流程;如果你使用的是 64 位 Raspberry Pi OS,请直接参考 Debian `arm64` 安装说明。
|
||||
|
||||
Docker 官方目前单独提供的是 **Raspberry Pi OS 32-bit (armhf)** 安装页,支持情况如下:
|
||||
Docker 官方目前单独提供的是 **Raspberry Pi OS 32-bit (armhf)** 安装页(具体以官方 [安装文档](https://docs.docker.com/engine/install/raspberry-pi-os/) 为准),支持情况如下:
|
||||
|
||||
* Raspberry Pi OS Bookworm
|
||||
* Raspberry Pi OS Bullseye
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
在无法连接外网的安全环境中,离线安装是唯一的选择。本节介绍如何在 RHEL 系发行版中进行离线安装。
|
||||
|
||||
> 注意:Docker 官方当前支持的 RHEL 兼容平台基线已是 **CentOS Stream 9/10**。下面的离线示例建议统一按 `el9` 软件包和 `dnf` 流程准备,Rocky Linux 9、AlmaLinux 9 也可先在测试环境按相同思路验证。
|
||||
> 注意:Docker 官方当前支持的 RHEL 兼容平台基线已是 **CentOS Stream 9/10**(具体以官方 [安装文档](https://docs.docker.com/engine/install/centos/) 为准)。下面的离线示例建议统一按 `el9` 软件包和 `dnf` 流程准备,Rocky Linux 9、AlmaLinux 9 也可先在测试环境按相同思路验证。
|
||||
|
||||
### 3.6.1.1 本地 RPM 文件安装:推荐
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ macOS 上没有原生 Linux 内核,Docker 需要运行在一个轻量级虚拟
|
||||
|
||||
### 3.7.1 系统要求
|
||||
|
||||
[Docker Desktop for Mac](https://docs.docker.com/desktop/setup/install/mac-install/) 支持当前版本及前两个主要版本的 macOS,并且至少需要 4 GB 内存。对于 Apple Silicon 机型,若需要兼容部分 Intel 命令行工具,官方建议安装 Rosetta 2。
|
||||
[Docker Desktop for Mac](https://docs.docker.com/desktop/setup/install/mac-install/) 支持当前版本及前两个主要版本的 macOS(具体以官方 [安装文档](https://docs.docker.com/desktop/setup/install/mac-install/) 为准),并且至少需要 4 GB 内存。对于 Apple Silicon 机型,若需要兼容部分 Intel 命令行工具,官方建议安装 Rosetta 2。
|
||||
|
||||
### 3.7.2 安装
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
### 3.8.1 系统要求
|
||||
|
||||
[Docker Desktop for Windows](https://docs.docker.com/desktop/setup/install/windows-install/) 支持 Docker 官方文档列出的受支持 Windows 10/11 64 位版本。若使用 WSL 2 后端,需要启用 WSL 2,并满足官方要求的 `WSL 2.1.5` 或更高版本;若使用 Hyper-V 后端,则需要启用 Hyper-V 和 Containers 功能。Windows 10 64 位支持 Enterprise、Pro 和 Education 22H2(build 19045),Windows 11 64 位支持 Enterprise、Pro 和 Education 23H2(build 22631)或更高版本,且官方建议主机至少具备 8 GB 内存。
|
||||
[Docker Desktop for Windows](https://docs.docker.com/desktop/setup/install/windows-install/) 支持 Docker 官方文档列出的受支持 Windows 10/11 64 位版本(具体以官方 [安装文档](https://docs.docker.com/desktop/setup/install/windows-install/) 为准)。若使用 WSL 2 后端,需要启用 WSL 2,并满足官方要求的 `WSL 2.1.5` 或更高版本;若使用 Hyper-V 后端,则需要启用 Hyper-V 和 Containers 功能。Windows 10 64 位支持 Enterprise、Pro 和 Education 22H2(build 19045),Windows 11 64 位支持 Enterprise、Pro 和 Education 23H2(build 22631)或更高版本,且官方建议主机至少具备 8 GB 内存。
|
||||
|
||||
### 3.8.2 安装
|
||||
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
从 Docker 镜像仓库获取镜像可谓是 Docker 运作的第一步。本节将介绍如何使用 `docker pull` 命令下载镜像,以及如何理解下载过程。
|
||||
|
||||
> **版本号最佳实践**
|
||||
>
|
||||
> - **永远指定版本号**:避免使用 `latest` 标签,应指定具体的版本(如 `ubuntu:24.04`、`nginx:1.27`),以确保镜像内容稳定一致。
|
||||
> - **在生产环境使用摘要**:优先使用镜像摘要(SHA256)而非标签,如 `nginx@sha256:abc123...`,因为摘要不可变。
|
||||
> - **定期评估依赖**:即使指定了版本号,仍应定期检查依赖的基础镜像是否有安全更新。
|
||||
|
||||
### 4.1.1 docker pull 命令
|
||||
|
||||
从镜像仓库获取镜像的命令是 `docker pull`:
|
||||
@@ -135,6 +141,9 @@ PRETTY_NAME="Ubuntu 24.04 LTS"
|
||||
...
|
||||
root@e7009c6ce357:/# exit
|
||||
```
|
||||
|
||||
> 本例使用 `ubuntu:24.04` 这样的具体版本标签是最佳实践。若无特殊需求,避免使用 `docker pull ubuntu` 或 `ubuntu:latest`,因为镜像内容可能在某个时刻发生变化。
|
||||
|
||||
**参数说明**:
|
||||
|
||||
| 参数 | 说明 |
|
||||
|
||||
@@ -34,6 +34,8 @@ ubuntu noble 329ed837d508 3 days ago 78MB
|
||||
|
||||
注意上面的 `ubuntu:24.04` 和 `ubuntu:noble` 拥有相同的 IMAGE ID——它们是同一个镜像的不同标签,只占用一份存储空间。
|
||||
|
||||
> **版本说明**:`ubuntu:24.04` 是具体版本号,`ubuntu:noble` 是发布代号(Ubuntu 24.04 的代号)。在 Dockerfile 中应优先使用版本号(如 `ubuntu:24.04`)而非发布代号,因为版本号在将来更易理解。
|
||||
|
||||
---
|
||||
|
||||
### 4.2.3 理解镜像大小
|
||||
|
||||
+3
-1
@@ -21,9 +21,11 @@ $ docker image rm [选项] <镜像1> [<镜像2> ...]
|
||||
|------|------|------|
|
||||
| **短 ID** | ID 的前几位 (通常 3-4 位)| `docker rmi 501` |
|
||||
| **长 ID** | 完整的镜像 ID | `docker rmi 501ad78535f0...` |
|
||||
| **镜像名:标签** | 仓库名和标签 | `docker rmi redis:alpine` |
|
||||
| **镜像名:标签** | 仓库名和标签 | `docker rmi redis:7.0` |
|
||||
| **镜像摘要** | 精确的内容摘要 | `docker rmi nginx@sha256:...` |
|
||||
|
||||
> **版本提示**:建议使用 **镜像名:标签** 的方式删除,特别是当需要明确清理特定版本的镜像时。例如 `docker rmi redis:7.0` 比 `docker rmi redis:latest` 更清晰且安全。
|
||||
|
||||
#### 使用短 ID 删除
|
||||
|
||||
```bash
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。
|
||||
|
||||
> **版本提示**:以下示例中 `nginx` 镜像使用默认 `latest` 标签。生产环境建议指定具体版本号(如 `nginx:1.27`),以避免镜像更新带来的不兼容性。
|
||||
|
||||
```bash
|
||||
$ docker run --name webserver -d -p 8080:80 nginx
|
||||
```
|
||||
@@ -90,6 +92,9 @@ nginx v2 07e334659748 9 seconds ago
|
||||
nginx 1.27 05a60462f8ba 12 days ago 181.5 MB
|
||||
nginx latest e43d811ce2f4 4 weeks ago 181.5 MB
|
||||
```
|
||||
|
||||
> **版本说明**:上面示例中 `nginx:1.27` 代表 1.27 系列的最新 patch 版本。在实际应用中应根据需求选择确切的版本号,而不是盲目使用 `latest`。
|
||||
|
||||
我们还可以用 `docker history` 具体查看镜像内的历史记录。例如先执行 `docker history nginx:v2`,再对比 `docker history nginx:latest`,就能看到我们刚刚提交出来的新层。
|
||||
|
||||
```bash
|
||||
|
||||
@@ -26,6 +26,8 @@ $ touch Dockerfile
|
||||
```
|
||||
其内容为:
|
||||
|
||||
> **版本提示**:下面示例中 `FROM nginx` 使用的是 `latest` 标签。在实际应用中应使用明确的版本号(如 `FROM nginx:1.27`),以确保 Dockerfile 的可重现性和稳定性。
|
||||
|
||||
```docker
|
||||
FROM nginx
|
||||
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
|
||||
@@ -36,6 +38,8 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
|
||||
|
||||
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 `nginx` 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 `FROM` 就是指定 **基础镜像**,因此一个 `Dockerfile` 中 `FROM` 是必备的指令,并且必须是第一条指令。
|
||||
|
||||
> **版本号最佳实践**:在 `FROM` 指令中 **务必指定具体版本号**(如 `FROM ubuntu:24.04` 或 `FROM python:3.12-slim`)而非 `FROM ubuntu` 或 `FROM python:latest`。这样可以确保 Dockerfile 在不同时间、不同环境下构建出的镜像内容一致,避免因基础镜像更新导致的不可预期的变化。
|
||||
|
||||
在 [Docker Hub](https://hub.docker.com/search?q=&type=image&image_filter=official) 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://hub.docker.com/_/nginx/)、[`redis`](https://hub.docker.com/_/redis/)、[`mongo`](https://hub.docker.com/_/mongo/)、[`mysql`](https://hub.docker.com/_/mysql/)、[`httpd`](https://hub.docker.com/_/httpd/)、[`php`](https://hub.docker.com/_/php/)、[`tomcat`](https://hub.docker.com/_/tomcat/) 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://hub.docker.com/_/node)、[`openjdk`](https://hub.docker.com/_/openjdk/)、[`python`](https://hub.docker.com/_/python/)、[`ruby`](https://hub.docker.com/_/ruby/)、[`golang`](https://hub.docker.com/_/golang/) 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
|
||||
|
||||
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://hub.docker.com/_/ubuntu/)、[`debian`](https://hub.docker.com/_/debian/)、[`centos`](https://hub.docker.com/_/centos/)、[`fedora`](https://hub.docker.com/_/fedora/)、[`alpine`](https://hub.docker.com/_/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
|
||||
|
||||
@@ -4,6 +4,14 @@
|
||||
|
||||
本章将介绍 Docker 在不同操作系统镜像场景下的实战案例。当你构建容器化应用时,选择合适的基础镜像至关重要。不同的操作系统镜像在大小、功能和性能方面各有特点,适用于不同的使用场景。本章通过具体的案例,详细讲解如何在 Docker 中使用主流操作系统镜像,包括轻量级镜像 (Busybox、Alpine) 和完整功能镜像 (Debian、Ubuntu、CentOS 等)。
|
||||
|
||||
## 版本说明
|
||||
|
||||
本章示例中使用的操作系统镜像版本遵循以下原则:
|
||||
|
||||
- **Alpine、Debian、Ubuntu、CentOS** 等操作系统镜像采用大版本或次版本标签(如 `alpine:3.21`、`ubuntu:24.04`),避免使用 `latest` 标签确保构建的可再现性
|
||||
- **OS 大版本保留**,以便获得最新的安全补丁和修复
|
||||
- 在生产环境中,建议根据实际需求选择合适的版本,并定期更新以获得安全修复
|
||||
|
||||
## 为什么选择合适的操作系统镜像很重要
|
||||
|
||||
在容器化应用开发中,选择合适的基础操作系统镜像直接影响容器的大小、启动速度、安全性和运行性能。不同的镜像提供了不同的功能集和资源占用:
|
||||
|
||||
@@ -30,7 +30,7 @@ RUN go build -o main .
|
||||
|
||||
## Final stage
|
||||
|
||||
FROM alpine:latest
|
||||
FROM alpine:3.21
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/main .
|
||||
CMD ["./main"]
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
```yaml
|
||||
services:
|
||||
dev:
|
||||
image: golang:1.22
|
||||
image: golang:1.26
|
||||
working_dir: /work
|
||||
volumes:
|
||||
- ./:/work
|
||||
|
||||
@@ -1,8 +1,18 @@
|
||||
# 第二十一章 实战案例 - DevOps
|
||||
|
||||
## 版本说明
|
||||
|
||||
本章示例中使用的镜像版本遵循以下原则:
|
||||
|
||||
- **GitHub Actions** (`actions/checkout@v6` 等) 采用大版本标签,代表最新的功能版本与稳定性的平衡
|
||||
- **编程语言镜像** (`golang:1.26-alpine`、`rust:1.95-alpine` 等) 采用次版本标签,确保 API 稳定性同时获得安全更新
|
||||
- **数据库镜像** (`postgres:16-alpine`、`redis:8-alpine` 等) 采用大版本标签,便于获得修复和改进
|
||||
- **基础镜像** (`alpine:3.21`、`debian:12` 等) 采用大版本或次版本标签,避免 `latest` 以确保可再现性
|
||||
- 实际项目中应根据需求调整版本,生产环境建议定期更新以获取安全补丁
|
||||
|
||||
## DevOps 背景介绍
|
||||
|
||||
DevOps 是一种重要的开发和运维文化,强调开发团队和运维团队之间的协作和自动化。它致力于通过自动化和流程优化,加快软件交付速度,同时提高系统的稳定性和可靠性。Docker 作为容器化技术的领导者,已成为现代 DevOps 工作流中不可或缺的工具。通过容器化应用,开发团队可以确保“一次构建,处处运行”,消除开发、测试和生产环境的差异,大大简化了部署流程。
|
||||
DevOps 是一种重要的开发和运维文化,强调开发团队和运维团队之间的协作和自动化。它致力于通过自动化和流程优化,加快软件交付速度,同时提高系统的稳定性和可靠性。Docker 作为容器化技术的领导者,已成为现代 DevOps 工作流中不可或缺的工具。通过容器化应用,开发团队可以确保”一次构建,处处运行”,消除开发、测试和生产环境的差异,大大简化了部署流程。
|
||||
|
||||
## Docker 在 DevOps 中的角色
|
||||
|
||||
|
||||
Reference in New Issue
Block a user