mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 20:31:18 +00:00
style(docs): standardize heading formats and numbering
- Enforce Level 1-3 structural numbering based on SUMMARY.md hierarchy - Remove structural numbering from Level 4+ headings - Eliminate single child headings by converting to bold text - Auto-inject summary text for headings with multiple children missing intro text - Exclude Appendix chapters from structural numbering - Avoid modifying code block contents - Add script to detect non-standard English usage in headers
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
## 14.1 基本架构
|
||||
## 11.1 基本架构
|
||||
|
||||
Docker 的架构设计简洁而高效,主要由客户端和服务端两部分组成。
|
||||
|
||||
### 核心架构图
|
||||
### 11.1.1 核心架构图
|
||||
|
||||
Docker 采用了 **C/S (客户端/服务端)** 架构。Client 向 Daemon 发送请求,Daemon 负责构建、运行和分发容器。
|
||||
|
||||
@@ -23,7 +23,7 @@ graph LR
|
||||
|
||||
---
|
||||
|
||||
### 组件详解
|
||||
### 11.1.2 组件详解
|
||||
|
||||
Docker 的内部架构如同洋葱一样分层,每一层专注解决特定问题:
|
||||
|
||||
@@ -66,7 +66,7 @@ Docker 的大脑。
|
||||
|
||||
---
|
||||
|
||||
### 容器启动流程
|
||||
### 11.1.3 容器启动流程
|
||||
|
||||
当执行 `docker run -d nginx` 时,内部发生了什么?
|
||||
|
||||
@@ -110,7 +110,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
### Docker Engine v29+ 变化
|
||||
### 11.1.4 Docker Engine v29+ 变化
|
||||
|
||||
从 Docker Engine v29 (2025/2026) 开始,架构进一步简化和标准化:
|
||||
|
||||
@@ -119,7 +119,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
### Docker Desktop 架构
|
||||
### 11.1.5 Docker Desktop 架构
|
||||
|
||||
在 macOS 和 Windows 上,因为内核差异,架构稍微复杂:
|
||||
|
||||
@@ -140,7 +140,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
### 总结
|
||||
### 11.1.6 总结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
@@ -152,7 +152,7 @@ flowchart TD
|
||||
| **Shim** | 监工 | 保持 IO,允许无守护进程重启 |
|
||||
| **Runc** | 工人 | 真正干活 (创建容器),干完就走 |
|
||||
|
||||
### 延伸阅读
|
||||
### 11.1.7 延伸阅读
|
||||
|
||||
- [命名空间](./18.2_namespace.md):Runc 如何隔离容器
|
||||
- [控制组](./18.3_cgroups.md):Runc 如何限制资源
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
命名空间 (Namespace) 是 Linux 内核的一个强大特性,为容器提供了隔离的运行环境。
|
||||
|
||||
## 什么是 Namespace
|
||||
## 11.2 什么是 Namespace
|
||||
|
||||
> **Namespace 是 Linux 内核提供的资源隔离机制,它让容器内的进程仿佛运行在独立的操作系统中。** Namespace 是容器技术的核心基础之一。它回答了一个关键问题:**如何让一个进程 “以为” 自己独占整个系统?**
|
||||
|
||||
@@ -24,7 +24,7 @@ flowchart LR
|
||||
H4 -. "(实际是宿主机的 1234)" .- C1
|
||||
```
|
||||
|
||||
### Namespace 的类型
|
||||
### 11.2.1 Namespace 的类型
|
||||
|
||||
Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:
|
||||
|
||||
@@ -40,7 +40,7 @@ Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:
|
||||
|
||||
---
|
||||
|
||||
### PID Namespace
|
||||
### 11.2.2 PID Namespace
|
||||
|
||||
PID Namespace 负责进程 ID 的隔离,使得容器内的进程彼此不可见。
|
||||
|
||||
@@ -75,7 +75,7 @@ PID USER COMMAND
|
||||
|
||||
---
|
||||
|
||||
### NET Namespace
|
||||
### 11.2.3 NET Namespace
|
||||
|
||||
NET Namespace 负责网络栈的隔离,包括网卡、路由表和 iptables 规则等。
|
||||
|
||||
@@ -112,7 +112,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### MNT Namespace
|
||||
### 11.2.4 MNT Namespace
|
||||
|
||||
MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的文件系统视图。
|
||||
|
||||
@@ -149,7 +149,7 @@ MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的
|
||||
|
||||
---
|
||||
|
||||
### UTS Namespace
|
||||
### 11.2.5 UTS Namespace
|
||||
|
||||
UTS Namespace 主要用于隔离主机名和域名。
|
||||
|
||||
@@ -177,7 +177,7 @@ UTS = “UNIX Time-sharing System”,是历史遗留的名称。
|
||||
|
||||
---
|
||||
|
||||
### IPC Namespace
|
||||
### 11.2.6 IPC Namespace
|
||||
|
||||
IPC Namespace 用于隔离进程间通信资源,如 System V IPC 和 POSIX 消息队列。
|
||||
|
||||
@@ -198,7 +198,7 @@ IPC Namespace 用于隔离进程间通信资源,如 System V IPC 和 POSIX 消
|
||||
|
||||
---
|
||||
|
||||
### USER Namespace
|
||||
### 11.2.7 USER Namespace
|
||||
|
||||
USER Namespace 允许将容器内的用户 ID 映射到宿主机的不同用户 ID。
|
||||
|
||||
@@ -236,7 +236,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### 动手实验:体验 Namespace
|
||||
### 11.2.8 动手实验:体验 Namespace
|
||||
|
||||
使用 `unshare` 命令可以在不使用 Docker 的情况下体验 Namespace:
|
||||
|
||||
@@ -301,7 +301,7 @@ $ ip addr
|
||||
|
||||
---
|
||||
|
||||
### Namespace 的局限性
|
||||
### 11.2.9 Namespace 的局限性
|
||||
|
||||
Namespace 提供了隔离但不是安全边界:
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 14.3 控制组
|
||||
## 11.3 控制组
|
||||
|
||||
控制组 (Cgroups) 是 Linux 内核提供的另一种关键机制,主要用于资源的限制和审计。
|
||||
|
||||
### 什么是控制组
|
||||
### 11.3.1 什么是控制组
|
||||
|
||||
控制组 (Control Groups,简称 cgroups) 是 Linux 内核的一个特性,用于 **限制、记录和隔离** 进程组的资源使用 (CPU、内存、磁盘 I/O、网络等)。
|
||||
|
||||
@@ -31,7 +31,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### cgroups 的历史
|
||||
### 11.3.2 cgroups 的历史
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
@@ -44,7 +44,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### cgroups 可以限制的资源
|
||||
### 11.3.3 cgroups 可以限制的资源
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
@@ -58,7 +58,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### Docker 中的资源限制
|
||||
### 11.3.4 Docker 中的资源限制
|
||||
|
||||
Docker 提供了丰富的参数来配置容器的资源限制,主要包括内存、CPU、磁盘 I/O 等。
|
||||
|
||||
@@ -142,7 +142,7 @@ $ docker run --pids-limit=100 myapp
|
||||
|
||||
---
|
||||
|
||||
### 查看容器资源使用
|
||||
### 11.3.5 查看容器资源使用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -165,7 +165,7 @@ $ docker inspect mycontainer --format '{{json .HostConfig}}' | jq
|
||||
|
||||
---
|
||||
|
||||
### 资源限制的效果
|
||||
### 11.3.6 资源限制的效果
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
@@ -209,7 +209,7 @@ $ docker run --rm --cpus=1 stress --cpu 4
|
||||
|
||||
---
|
||||
|
||||
### cgroups v1 vs v2
|
||||
### 11.3.7 cgroups v1 vs v2
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
@@ -245,7 +245,7 @@ nodev cgroup2
|
||||
|
||||
---
|
||||
|
||||
### 在 Compose 中设置限制
|
||||
### 11.3.8 在 Compose 中设置限制
|
||||
|
||||
在 Compose 中设置限制配置如下:
|
||||
|
||||
@@ -265,7 +265,7 @@ services:
|
||||
|
||||
---
|
||||
|
||||
### 最佳实践
|
||||
### 11.3.9 最佳实践
|
||||
|
||||
在使用 Cgroups 限制资源时,遵循一些最佳实践可以避免潜在的问题。
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 14.4 联合文件系统
|
||||
## 11.4 联合文件系统
|
||||
|
||||
联合文件系统 (UnionFS) 是 Docker 镜像分层存储的基础,它允许将多个目录挂载为同一个虚拟文件系统。
|
||||
|
||||
### 什么是联合文件系统
|
||||
### 11.4.1 什么是联合文件系统
|
||||
|
||||
联合文件系统 (UnionFS) 是一种 **分层、轻量级** 的文件系统,它将多个目录 “联合” 挂载到同一个虚拟目录,形成一个统一的文件系统视图。
|
||||
|
||||
@@ -24,7 +24,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
### 为什么 Docker 使用联合文件系统
|
||||
### 11.4.2 为什么 Docker 使用联合文件系统
|
||||
|
||||
Docker 选择联合文件系统作为其存储驱动,主要基于以下几个核心优势。
|
||||
|
||||
@@ -62,7 +62,7 @@ COPY . . # 层4:应用代码
|
||||
|
||||
---
|
||||
|
||||
### Copy-on-Write (写时复制)
|
||||
### 11.4.3 Copy-on-Write (写时复制)
|
||||
|
||||
当容器修改只读层中的文件时:
|
||||
|
||||
@@ -92,7 +92,7 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
### Docker 支持的存储驱动
|
||||
### 11.4.4 Docker 支持的存储驱动
|
||||
|
||||
Docker 可使用多种联合文件系统实现:
|
||||
|
||||
@@ -128,7 +128,7 @@ Storage Driver: overlay2
|
||||
|
||||
---
|
||||
|
||||
### overlay2 工作原理
|
||||
### 11.4.5 overlay2 工作原理
|
||||
|
||||
overlay2 是目前最推荐的存储驱动:
|
||||
|
||||
@@ -169,7 +169,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
### 查看镜像层
|
||||
### 11.4.6 查看镜像层
|
||||
|
||||
运行以下命令:
|
||||
|
||||
@@ -198,7 +198,7 @@ $ docker inspect nginx:alpine --format '{{json .GraphDriver.Data}}' | jq
|
||||
|
||||
---
|
||||
|
||||
### 最佳实践
|
||||
### 11.4.7 最佳实践
|
||||
|
||||
为了构建高效、轻量的镜像,我们在使用联合文件系统时应注意以下几点。
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
## 14.5 容器格式
|
||||
## 11.5 容器格式
|
||||
|
||||
最初,Docker 采用了 `LXC` 中的容器格式。从 0.7 版本以后开始去除 LXC,转而使用自行开发的 [libcontainer](https://github.com/docker/libcontainer),从 1.11 开始,则进一步演进为使用 [runC](https://github.com/opencontainers/runc) 和 [containerd](https://github.com/containerd/containerd)。
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 14.6 Docker 网络实现
|
||||
## 11.6 Docker 网络实现
|
||||
|
||||
Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备 (特别是 veth pair)。建议先熟悉了解这两部分的基本概念再阅读本章。
|
||||
|
||||
### 基本原理
|
||||
### 11.6.1 基本原理
|
||||
|
||||
首先,要实现网络通信,机器需要至少一个网络接口 (物理接口或虚拟接口) 来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。
|
||||
|
||||
@@ -11,7 +11,7 @@ Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据
|
||||
|
||||
Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通 (这样的一对接口叫做 `veth pair`)。
|
||||
|
||||
### 创建网络参数
|
||||
### 11.6.2 创建网络参数
|
||||
|
||||
Docker 创建一个容器的时候,会执行如下操作:
|
||||
|
||||
@@ -29,7 +29,7 @@ Docker 创建一个容器的时候,会执行如下操作:
|
||||
* `--net=container:NAME_or_ID` 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 `lo` 环回接口通信。
|
||||
* `--net=none` 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。
|
||||
|
||||
### 网络配置细节
|
||||
### 11.6.3 网络配置细节
|
||||
|
||||
用户使用 `--net=none` 后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## 本章小结
|
||||
## 11.7 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
| IPC | 进程间通信 | 容器间 IPC 隔离 |
|
||||
| USER | 用户 ID | 容器 root ≠ 宿主机 root |
|
||||
|
||||
### 延伸阅读
|
||||
### 11.7.1 延伸阅读
|
||||
|
||||
- [控制组 (Cgroups)](18.3_cgroups.md):资源限制机制
|
||||
- [联合文件系统](18.4_ufs.md):分层存储的实现
|
||||
@@ -26,7 +26,7 @@
|
||||
| **磁盘 I/O** | `--device-write-bps` | `--device-write-bps /dev/sda:10mb` |
|
||||
| **进程数** | `--pids-limit` | `--pids-limit=100` |
|
||||
|
||||
### 延伸阅读
|
||||
### 11.7.2 延伸阅读
|
||||
|
||||
- [命名空间](18.2_namespace.md):资源隔离
|
||||
- [安全](../17_security/README.md):容器安全概述
|
||||
@@ -39,7 +39,7 @@
|
||||
| **overlay2** | Docker 默认推荐的存储驱动 |
|
||||
| **分层好处** | 镜像复用、快速构建、快速启动 |
|
||||
|
||||
### 延伸阅读
|
||||
### 11.7.3 延伸阅读
|
||||
|
||||
- [镜像](../02_basic_concept/2.1_image.md):理解镜像分层
|
||||
- [容器](../02_basic_concept/2.2_container.md):容器存储层
|
||||
|
||||
Reference in New Issue
Block a user