diff --git a/01_introduction/1.2_what.md b/01_introduction/1.2_what.md index 0354a33..cb0121f 100644 --- a/01_introduction/1.2_what.md +++ b/01_introduction/1.2_what.md @@ -118,12 +118,3 @@ Docker 的发展历程: - **至今**:[GitHub 项目](https://github.com/moby/moby) 超过 7 万星标 Docker 的成功推动了整个容器生态的发展,催生了 Kubernetes、Podman 等众多相关项目。笔者认为,Docker 最大的贡献不仅是技术本身,更是它**让容器技术从系统管理员的工具变成了每个开发者都能使用的标准工具**。 - -### 本章小结 - -- Docker 是一种轻量级虚拟化技术,核心价值是**环境一致性** -- 与虚拟机相比,Docker 更轻量、更快速、资源利用率更高 -- Docker 基于 Linux 内核的 Namespace、Cgroups 和 Union FS 技术 -- Docker 推动了容器技术的标准化(OCI)和生态发展 - -接下来,让我们了解[为什么要使用 Docker](1.3_why.md)。 diff --git a/01_introduction/1.3_why.md b/01_introduction/1.3_why.md index 77c647a..c764168 100644 --- a/01_introduction/1.3_why.md +++ b/01_introduction/1.3_why.md @@ -226,9 +226,3 @@ Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行 | 单机支持量 | 上千个容器 | 几十个虚拟机 | | 隔离性 | 进程级别 | 完全隔离 | | 最佳场景 | 微服务、CI/CD、开发环境 | 多租户、高安全需求 | - -### 本章小结 - -Docker 的核心价值可以用一句话概括:**让应用的开发、测试、部署保持一致,同时极大提高资源利用效率。**笔者认为,对于现代软件开发者来说,Docker 已经不是"要不要学"的问题,而是**必备技能**。无论你是前端、后端、运维还是全栈开发者,掌握 Docker 都能让你的工作更高效。 - -接下来,让我们学习 Docker 的[基本概念](../02_basic_concept/README.md)。 diff --git a/01_introduction/summary.md b/01_introduction/summary.md new file mode 100644 index 0000000..3d99dca --- /dev/null +++ b/01_introduction/summary.md @@ -0,0 +1,8 @@ +## 本章小结 + +- Docker 是一种轻量级虚拟化技术,核心价值是**环境一致性** +- 与虚拟机相比,Docker 更轻量、更快速、资源利用率更高 +- Docker 基于 Linux 内核的 Namespace、Cgroups 和 Union FS 技术 +- Docker 推动了容器技术的标准化(OCI)和生态发展 + +Docker 的核心价值可以用一句话概括:**让应用的开发、测试、部署保持一致,同时极大提高资源利用效率。**笔者认为,对于现代软件开发者来说,Docker 已经不是"要不要学"的问题,而是**必备技能**。无论你是前端、后端、运维还是全栈开发者,掌握 Docker 都能让你的工作更高效。 diff --git a/02_basic_concept/2.1_image.md b/02_basic_concept/2.1_image.md index cafa2e7..4ef814f 100644 --- a/02_basic_concept/2.1_image.md +++ b/02_basic_concept/2.1_image.md @@ -211,21 +211,3 @@ Docker 镜像可以通过以下方式获取: | **从 Dockerfile 构建** | 自定义镜像 | `docker build -t myapp .` | | **从容器提交** | 保存容器状态(不推荐) | `docker commit` | | **从文件导入** | 离线传输 | `docker load < image.tar` | - -### 本章小结 - -| 概念 | 要点 | -|------|------| -| **镜像是什么** | 只读的应用模板,包含运行所需的一切 | -| **分层存储** | 多层叠加,共享基础层,节省空间 | -| **只读特性** | 构建后不可修改,保证一致性 | -| **层的陷阱** | 删除操作只是标记,不减小体积 | - -理解了镜像,接下来让我们学习[容器](2.2_container.md)——镜像的运行实例。 - -### 延伸阅读 - -- [获取镜像](../04_image/4.1_pull.md):从 Registry 下载镜像 -- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):创建自己的镜像 -- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):构建高质量镜像的技巧 -- [底层实现 - 联合文件系统](../14_implementation/14.4_ufs.md):深入理解分层存储的技术原理 diff --git a/02_basic_concept/2.2_container.md b/02_basic_concept/2.2_container.md index eee65f6..ea61aba 100644 --- a/02_basic_concept/2.2_container.md +++ b/02_basic_concept/2.2_container.md @@ -235,22 +235,3 @@ Docker 容器通过以下 Namespace 实现隔离: | **USER** | 用户 | 独立的用户和组 ID | > 想深入了解?请阅读[底层实现 - 命名空间](../14_implementation/14.2_namespace.md)。 - -### 本章小结 - -| 概念 | 要点 | -|------|------| -| **容器是什么** | 镜像的运行实例,本质是隔离的进程 | -| **容器 vs 虚拟机** | 共享内核,更轻量,但隔离性较弱 | -| **存储层** | 可写层随容器删除而消失 | -| **数据持久化** | 使用 Volume 或 Bind Mount | -| **生命周期** | 与主进程(PID 1)绑定 | - -理解了镜像和容器,接下来让我们学习[仓库](2.3_repository.md)——存储和分发镜像的服务。 - -### 延伸阅读 - -- [启动容器](../05_container/5.1_run.md):详细的容器启动选项 -- [后台运行](../05_container/5.2_daemon.md):理解容器为什么会"立即退出" -- [进入容器](../05_container/5.4_attach_exec.md):如何操作运行中的容器 -- [数据管理](../08_data_network/README.md):Volume 和数据持久化详解 diff --git a/02_basic_concept/2.3_repository.md b/02_basic_concept/2.3_repository.md index 8f46546..26ada70 100644 --- a/02_basic_concept/2.3_repository.md +++ b/02_basic_concept/2.3_repository.md @@ -280,22 +280,3 @@ $ docker scout cves nginx:latest $ trivy image nginx:latest ``` - -### 本章小结 - -| 概念 | 要点 | -|------|------| -| **Registry** | 存储和分发镜像的服务 | -| **仓库(Repository)** | 同一软件的镜像集合 | -| **标签(Tag)** | 版本标识,默认为 latest | -| **Docker Hub** | 默认的公共 Registry | -| **私有 Registry** | 企业内部使用,推荐 Harbor | - -现在你已经了解了 Docker 的三个核心概念:[镜像](2.1_image.md)、[容器](2.2_container.md)和仓库。接下来,让我们开始[安装 Docker](../03_install/README.md),动手实践! - -### 延伸阅读 - -- [Docker Hub](../06_repository/6.1_dockerhub.md):Docker Hub 的详细使用 -- [私有仓库](../06_repository/6.2_registry.md):搭建私有 Registry -- [私有仓库高级配置](../06_repository/6.3_registry_auth.md):认证、TLS 配置 -- [镜像加速器](../03_install/3.9_mirror.md):配置镜像加速 diff --git a/02_basic_concept/summary.md b/02_basic_concept/summary.md new file mode 100644 index 0000000..4543148 --- /dev/null +++ b/02_basic_concept/summary.md @@ -0,0 +1,51 @@ +## 本章小结 + +| 概念 | 要点 | +|------|------| +| **镜像是什么** | 只读的应用模板,包含运行所需的一切 | +| **分层存储** | 多层叠加,共享基础层,节省空间 | +| **只读特性** | 构建后不可修改,保证一致性 | +| **层的陷阱** | 删除操作只是标记,不减小体积 | + +理解了镜像,接下来让我们学习[容器](2.2_container.md)——镜像的运行实例。 + +### 延伸阅读 + +- [获取镜像](../04_image/4.1_pull.md):从 Registry 下载镜像 +- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):创建自己的镜像 +- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):构建高质量镜像的技巧 +- [底层实现 - 联合文件系统](../14_implementation/14.4_ufs.md):深入理解分层存储的技术原理 + +| 概念 | 要点 | +|------|------| +| **容器是什么** | 镜像的运行实例,本质是隔离的进程 | +| **容器 vs 虚拟机** | 共享内核,更轻量,但隔离性较弱 | +| **存储层** | 可写层随容器删除而消失 | +| **数据持久化** | 使用 Volume 或 Bind Mount | +| **生命周期** | 与主进程(PID 1)绑定 | + +理解了镜像和容器,接下来让我们学习[仓库](2.3_repository.md)——存储和分发镜像的服务。 + +### 延伸阅读 + +- [启动容器](../05_container/5.1_run.md):详细的容器启动选项 +- [后台运行](../05_container/5.2_daemon.md):理解容器为什么会"立即退出" +- [进入容器](../05_container/5.4_attach_exec.md):如何操作运行中的容器 +- [数据管理](../08_data_network/README.md):Volume 和数据持久化详解 + +| 概念 | 要点 | +|------|------| +| **Registry** | 存储和分发镜像的服务 | +| **仓库(Repository)** | 同一软件的镜像集合 | +| **标签(Tag)** | 版本标识,默认为 latest | +| **Docker Hub** | 默认的公共 Registry | +| **私有 Registry** | 企业内部使用,推荐 Harbor | + +现在你已经了解了 Docker 的三个核心概念:[镜像](2.1_image.md)、[容器](2.2_container.md)和仓库。接下来,让我们开始[安装 Docker](../03_install/README.md),动手实践! + +### 延伸阅读 + +- [Docker Hub](../06_repository/6.1_dockerhub.md):Docker Hub 的详细使用 +- [私有仓库](../06_repository/6.2_registry.md):搭建私有 Registry +- [私有仓库高级配置](../06_repository/6.3_registry_auth.md):认证、TLS 配置 +- [镜像加速器](../03_install/3.9_mirror.md):配置镜像加速 diff --git a/04_image/4.1_pull.md b/04_image/4.1_pull.md index 0dd7cee..5ebfb53 100644 --- a/04_image/4.1_pull.md +++ b/04_image/4.1_pull.md @@ -249,19 +249,3 @@ $ docker system prune ``` --- - -### 本章小结 - -| 操作 | 命令 | -|------|------| -| 拉取镜像 | `docker pull 镜像名:标签` | -| 拉取所有标签 | `docker pull -a 镜像名` | -| 指定平台 | `docker pull --platform linux/amd64 镜像名` | -| 用摘要拉取 | `docker pull 镜像名@sha256:...` | - -### 延伸阅读 - -- [列出镜像](4.2_list.md):查看本地镜像 -- [删除镜像](4.3_rm.md):清理本地镜像 -- [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载 -- [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库 diff --git a/04_image/4.2_list.md b/04_image/4.2_list.md index e5a72da..b36983d 100644 --- a/04_image/4.2_list.md +++ b/04_image/4.2_list.md @@ -283,21 +283,3 @@ $ docker images --format "{{.Repository}}:{{.Tag}}" > images.txt ``` --- - -### 本章小结 - -| 操作 | 命令 | -|------|------| -| 列出所有镜像 | `docker images` | -| 按仓库名过滤 | `docker images nginx` | -| 列出虚悬镜像 | `docker images -f dangling=true` | -| 只输出 ID | `docker images -q` | -| 显示摘要 | `docker images --digests` | -| 自定义格式 | `docker images --format "..."` | -| 查看空间占用 | `docker system df` | - -### 延伸阅读 - -- [获取镜像](4.1_pull.md):从 Registry 拉取镜像 -- [删除镜像](4.3_rm.md):清理本地镜像 -- [镜像](../02_basic_concept/2.1_image.md):理解镜像概念 diff --git a/04_image/4.3_rm.md b/04_image/4.3_rm.md index 4c672ae..9cb88ee 100644 --- a/04_image/4.3_rm.md +++ b/04_image/4.3_rm.md @@ -287,20 +287,3 @@ Build Cache 0 0 0B 0B ``` --- - -### 本章小结 - -| 操作 | 命令 | -|------|------| -| 删除指定镜像 | `docker rmi 镜像名:标签` | -| 强制删除 | `docker rmi -f 镜像名` | -| 删除虚悬镜像 | `docker image prune` | -| 删除未使用镜像 | `docker image prune -a` | -| 批量删除 | `docker rmi $(docker images -q -f ...)` | -| 查看空间占用 | `docker system df` | - -### 延伸阅读 - -- [列出镜像](4.2_list.md):查看和过滤镜像 -- [删除容器](../05_container/5.6_rm.md):清理容器 -- [数据卷](../08_data_network/data/volume.md):清理数据卷 diff --git a/04_image/summary.md b/04_image/summary.md new file mode 100644 index 0000000..d6e2c29 --- /dev/null +++ b/04_image/summary.md @@ -0,0 +1,46 @@ +## 本章小结 + +| 操作 | 命令 | +|------|------| +| 拉取镜像 | `docker pull 镜像名:标签` | +| 拉取所有标签 | `docker pull -a 镜像名` | +| 指定平台 | `docker pull --platform linux/amd64 镜像名` | +| 用摘要拉取 | `docker pull 镜像名@sha256:...` | + +### 延伸阅读 + +- [列出镜像](4.2_list.md):查看本地镜像 +- [删除镜像](4.3_rm.md):清理本地镜像 +- [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载 +- [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库 + +| 操作 | 命令 | +|------|------| +| 列出所有镜像 | `docker images` | +| 按仓库名过滤 | `docker images nginx` | +| 列出虚悬镜像 | `docker images -f dangling=true` | +| 只输出 ID | `docker images -q` | +| 显示摘要 | `docker images --digests` | +| 自定义格式 | `docker images --format "..."` | +| 查看空间占用 | `docker system df` | + +### 延伸阅读 + +- [获取镜像](4.1_pull.md):从 Registry 拉取镜像 +- [删除镜像](4.3_rm.md):清理本地镜像 +- [镜像](../02_basic_concept/2.1_image.md):理解镜像概念 + +| 操作 | 命令 | +|------|------| +| 删除指定镜像 | `docker rmi 镜像名:标签` | +| 强制删除 | `docker rmi -f 镜像名` | +| 删除虚悬镜像 | `docker image prune` | +| 删除未使用镜像 | `docker image prune -a` | +| 批量删除 | `docker rmi $(docker images -q -f ...)` | +| 查看空间占用 | `docker system df` | + +### 延伸阅读 + +- [列出镜像](4.2_list.md):查看和过滤镜像 +- [删除容器](../05_container/5.6_rm.md):清理容器 +- [数据卷](../08_data_network/data/volume.md):清理数据卷 diff --git a/05_container/5.1_run.md b/05_container/5.1_run.md index affac38..a97f556 100644 --- a/05_container/5.1_run.md +++ b/05_container/5.1_run.md @@ -62,30 +62,21 @@ root@af8bae53bdd3:/# exit # 退出容器 执行 `docker run` 时,Docker 在后台完成以下操作: -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ docker run ubuntu:24.04 /bin/echo "Hello" │ -└───────────────────────────────┬─────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ 1. 检查本地是否有 ubuntu:24.04 镜像 │ -│ ├── 有 → 使用本地镜像 │ -│ └── 无 → 从 Registry 下载 │ -├─────────────────────────────────────────────────────────────────────┤ -│ 2. 创建容器 │ -│ • 基于镜像的只读层 │ -│ • 添加一层可读写层(容器存储层) │ -├─────────────────────────────────────────────────────────────────────┤ -│ 3. 配置网络 │ -│ • 创建虚拟网卡 │ -│ • 分配 IP 地址 │ -│ • 连接到 Docker 网桥 │ -├─────────────────────────────────────────────────────────────────────┤ -│ 4. 启动容器,执行指定命令 │ -├─────────────────────────────────────────────────────────────────────┤ -│ 5. 命令执行完毕,容器停止 │ -└─────────────────────────────────────────────────────────────────────┘ +```mermaid +flowchart TD + Cmd["docker run ubuntu:24.04 /bin/echo 'Hello'"] --> Step1 + + Step1{"1. 检查本地是否有 ubuntu:24.04 镜像"} + Step1 -- 有 --> Step1_Yes["使用本地镜像"] + Step1 -- 无 --> Step1_No["从 Registry 下载"] + + Step1_Yes --> Step2 + Step1_No --> Step2 + + Step2["2. 创建容器
• 基于镜像的只读层
• 添加一层可读写层(容器存储层)"] --> Step3 + Step3["3. 配置网络
• 创建虚拟网卡
• 分配 IP 地址
• 连接到 Docker 网桥"] --> Step4 + Step4["4. 启动容器,执行指定命令"] --> Step5 + Step5["5. 命令执行完毕,容器停止"] ``` ### 常用启动选项 @@ -241,19 +232,3 @@ $ docker run -v mydata:/app/data myapp ``` 详见[数据管理](../08_data_network/README.md)。 - -### 本章小结 - -| 操作 | 命令 | 说明 | -|------|------|------| -| 新建并运行 | `docker run` | 最常用的启动方式 | -| 交互式启动 | `docker run -it` | 用于调试或临时操作 | -| 后台运行 | `docker run -d` | 用于服务类应用 | -| 启动已停止的容器 | `docker start` | 重用已有容器 | - -### 延伸阅读 - -- [后台运行](5.2_daemon.md):理解 `-d` 参数和容器生命周期 -- [进入容器](5.4_attach_exec.md):操作运行中的容器 -- [网络配置](../08_data_network/network/README.md):理解端口映射的原理 -- [数据管理](../08_data_network/README.md):数据持久化方案 diff --git a/05_container/5.3_stop.md b/05_container/5.3_stop.md index 87b0373..78c2fa4 100644 --- a/05_container/5.3_stop.md +++ b/05_container/5.3_stop.md @@ -258,19 +258,3 @@ $ docker inspect 容器名 ``` --- - -### 本章小结 - -| 操作 | 命令 | 说明 | -|------|------|------| -| 优雅停止 | `docker stop` | 先 SIGTERM,超时后 SIGKILL | -| 强制停止 | `docker kill` | 直接 SIGKILL | -| 重新启动 | `docker start` | 启动已停止的容器 | -| 重启 | `docker restart` | 停止后立即启动 | -| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 | - -### 延伸阅读 - -- [启动容器](../05_container/5.1_run.md):容器启动详解 -- [删除容器](5.6_rm.md):清理容器 -- [容器日志](5.2_daemon.md):排查停止原因 diff --git a/05_container/5.4_attach_exec.md b/05_container/5.4_attach_exec.md index b404f15..d98539f 100644 --- a/05_container/5.4_attach_exec.md +++ b/05_container/5.4_attach_exec.md @@ -198,17 +198,29 @@ CONTAINER ID IMAGE STATUS NAMES | **适用场景** | 调试、临时操作 | 查看主进程输出 | | **推荐程度** | ✅ 推荐 | ⚠️ 特殊场景使用 | -``` -docker exec docker attach -┌─────────────────────┐ ┌─────────────────────┐ -│ 容器 │ │ 容器 │ -│ ┌───────────────┐ │ │ ┌───────────────┐ │ -│ │ PID 1: nginx │ │ │ │ PID 1: bash │◄─┼── 附加到主进程 -│ ├───────────────┤ │ │ └───────────────┘ │ -│ │ PID 50: bash │◄─┼── 新进程 │ │ -│ └───────────────┘ │ │ │ -└─────────────────────┘ └─────────────────────┘ -退出 bash 不影响 nginx 退出 bash 容器停止 +```mermaid +flowchart LR + subgraph Exec ["docker exec"] + direction TB + subgraph Container1 ["容器"] + E_PID1["PID 1: nginx"] + E_PID50["PID 50: bash"] + end + NewProc["新进程"] -- 附加到 --> E_PID50 + end + + subgraph Attach ["docker attach"] + direction TB + subgraph Container2 ["容器"] + A_PID1["PID 1: bash"] + end + MainProc["附加到主进程"] --> A_PID1 + end + + note1["退出 bash 不影响 nginx"] + note2["退出 bash 容器停止"] + Container1 -.-> note1 + Container2 -.-> note2 ``` --- @@ -280,17 +292,3 @@ $ docker exec -u root -it myapp bash ``` --- - -### 本章小结 - -| 需求 | 推荐命令 | -|------|---------| -| 进入容器调试 | `docker exec -it 容器名 bash` | -| 执行单条命令 | `docker exec 容器名 命令` | -| 查看主进程输出 | `docker attach 容器名`(慎用) | - -### 延伸阅读 - -- [后台运行](5.2_daemon.md):理解容器主进程 -- [查看容器](5.1_run.md):列出和过滤容器 -- [容器日志](5.2_daemon.md):查看容器输出 diff --git a/05_container/5.6_rm.md b/05_container/5.6_rm.md index f727271..c497458 100644 --- a/05_container/5.6_rm.md +++ b/05_container/5.6_rm.md @@ -265,19 +265,3 @@ $ docker system prune -a --volumes ``` --- - -### 本章小结 - -| 操作 | 命令 | -|------|------| -| 删除已停止容器 | `docker rm 容器名` | -| 强制删除运行中容器 | `docker rm -f 容器名` | -| 删除容器及匿名卷 | `docker rm -v 容器名` | -| 清理所有已停止容器 | `docker container prune` | -| 删除所有容器 | `docker rm -f $(docker ps -aq)` | - -### 延伸阅读 - -- [终止容器](5.3_stop.md):优雅停止容器 -- [删除镜像](../04_image/4.3_rm.md):清理镜像 -- [数据卷](../08_data_network/data/volume.md):数据卷管理 diff --git a/05_container/summary.md b/05_container/summary.md new file mode 100644 index 0000000..28b9148 --- /dev/null +++ b/05_container/summary.md @@ -0,0 +1,55 @@ +## 本章小结 + +| 操作 | 命令 | 说明 | +|------|------|------| +| 新建并运行 | `docker run` | 最常用的启动方式 | +| 交互式启动 | `docker run -it` | 用于调试或临时操作 | +| 后台运行 | `docker run -d` | 用于服务类应用 | +| 启动已停止的容器 | `docker start` | 重用已有容器 | + +### 延伸阅读 + +- [后台运行](5.2_daemon.md):理解 `-d` 参数和容器生命周期 +- [进入容器](5.4_attach_exec.md):操作运行中的容器 +- [网络配置](../08_data_network/network/README.md):理解端口映射的原理 +- [数据管理](../08_data_network/README.md):数据持久化方案 + +| 操作 | 命令 | 说明 | +|------|------|------| +| 优雅停止 | `docker stop` | 先 SIGTERM,超时后 SIGKILL | +| 强制停止 | `docker kill` | 直接 SIGKILL | +| 重新启动 | `docker start` | 启动已停止的容器 | +| 重启 | `docker restart` | 停止后立即启动 | +| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 | + +### 延伸阅读 + +- [启动容器](../05_container/5.1_run.md):容器启动详解 +- [删除容器](5.6_rm.md):清理容器 +- [容器日志](5.2_daemon.md):排查停止原因 + +| 需求 | 推荐命令 | +|------|---------| +| 进入容器调试 | `docker exec -it 容器名 bash` | +| 执行单条命令 | `docker exec 容器名 命令` | +| 查看主进程输出 | `docker attach 容器名`(慎用) | + +### 延伸阅读 + +- [后台运行](5.2_daemon.md):理解容器主进程 +- [查看容器](5.1_run.md):列出和过滤容器 +- [容器日志](5.2_daemon.md):查看容器输出 + +| 操作 | 命令 | +|------|------| +| 删除已停止容器 | `docker rm 容器名` | +| 强制删除运行中容器 | `docker rm -f 容器名` | +| 删除容器及匿名卷 | `docker rm -v 容器名` | +| 清理所有已停止容器 | `docker container prune` | +| 删除所有容器 | `docker rm -f $(docker ps -aq)` | + +### 延伸阅读 + +- [终止容器](5.3_stop.md):优雅停止容器 +- [删除镜像](../04_image/4.3_rm.md):清理镜像 +- [数据卷](../08_data_network/data/volume.md):数据卷管理 diff --git a/06_repository/6.1_dockerhub.md b/06_repository/6.1_dockerhub.md index 47bddee..ede5664 100644 --- a/06_repository/6.1_dockerhub.md +++ b/06_repository/6.1_dockerhub.md @@ -125,17 +125,3 @@ Docker Hub 会对官方镜像和付费用户的镜像进行安全扫描。在镜 链接 GitHub/Bitbucket 仓库后,当代码有提交或打标签时,Docker Hub 会自动运行构建。这保证了镜像总是与代码同步,且由可信的官方环境构建。 --- - -### 本章小结 - -| 功能 | 说明 | -|------|------| -| **官方镜像** | 优先使用的基础镜像 | -| **拉取限制** | 匿名 100次/6h,登录 200次/6h | -| **安全** | 推荐开启 2FA 并使用 Access Token | -| **自动化** | 支持 Webhooks 和自动构建 | - -### 延伸阅读 - -- [私有仓库](6.2_registry.md):搭建自己的 Registry -- [镜像加速器](../03_install/3.9_mirror.md):加速下载 diff --git a/06_repository/summary.md b/06_repository/summary.md new file mode 100644 index 0000000..b0051ff --- /dev/null +++ b/06_repository/summary.md @@ -0,0 +1,13 @@ +## 本章小结 + +| 功能 | 说明 | +|------|------| +| **官方镜像** | 优先使用的基础镜像 | +| **拉取限制** | 匿名 100次/6h,登录 200次/6h | +| **安全** | 推荐开启 2FA 并使用 Access Token | +| **自动化** | 支持 Webhooks 和自动构建 | + +### 延伸阅读 + +- [私有仓库](6.2_registry.md):搭建自己的 Registry +- [镜像加速器](../03_install/3.9_mirror.md):加速下载 diff --git a/07_dockerfile/7.10_workdir.md b/07_dockerfile/7.10_workdir.md index 7f9d33f..1df5b2f 100644 --- a/07_dockerfile/7.10_workdir.md +++ b/07_dockerfile/7.10_workdir.md @@ -188,19 +188,3 @@ $ docker run -w /tmp myimage pwd ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 设置后续指令的工作目录 | -| **语法** | `WORKDIR /path` | -| **自动创建** | 目录不存在会自动创建 | -| **持久性** | 影响后续所有指令,直到下次 WORKDIR | -| **不要用** | `RUN cd /path`(无效) | - -### 延伸阅读 - -- [COPY 复制文件](7.2_copy.md):文件复制 -- [RUN 执行命令](../04_image/4.5_build.md):执行构建命令 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 diff --git a/07_dockerfile/7.11_user.md b/07_dockerfile/7.11_user.md index 82952f4..b60ac2c 100644 --- a/07_dockerfile/7.11_user.md +++ b/07_dockerfile/7.11_user.md @@ -15,20 +15,19 @@ USER [:] > 笔者强调:以非 root 用户运行容器是最重要的安全实践之一。 -``` -root 用户运行的风险: -┌────────────────────────────────────────────────────────┐ -│ 容器内 root ←─ 可能逃逸 ─→ 宿主机 root │ -│ │ │ │ -│ └── 漏洞利用 ───────────────→ 完全控制宿主机 │ -└────────────────────────────────────────────────────────┘ - -非 root 用户运行: -┌────────────────────────────────────────────────────────┐ -│ 容器内普通用户 ──逃逸后──→ 宿主机普通用户 │ -│ │ │ │ -│ └── 权限受限,危害降低 ─────→ 无法控制系统 │ -└────────────────────────────────────────────────────────┘ +```mermaid +flowchart LR + subgraph Root ["root 用户运行的风险:"] + direction TB + R_C["容器内 root"] -- 可能逃逸 --> R_H["宿主机 root"] + R_C -- 漏洞利用 --> R_Control["完全控制宿主机"] + end + + subgraph NonRoot ["非 root 用户运行:"] + direction TB + NR_C["容器内普通用户"] -- 逃逸后 --> NR_H["宿主机普通用户"] + NR_C -- 权限受限,危害降低 --> NR_Safe["无法控制系统"] + end ``` --- @@ -279,19 +278,3 @@ RUN mkdir -p /app/data && chown appuser:appuser /app/data 2. 在运行时映射端口:`docker run -p 80:8080` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 切换后续指令的执行用户 | -| **语法** | `USER username` 或 `USER UID:GID` | -| **前提** | 用户必须已存在 | -| **运行时覆盖** | `docker run -u` | -| **切换工具** | 使用 gosu,不用 su/sudo | - -### 延伸阅读 - -- [安全](../11_ops/security/README.md):容器安全实践 -- [ENTRYPOINT](7.5_entrypoint.md):入口脚本中的用户切换 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 安全 diff --git a/07_dockerfile/7.12_healthcheck.md b/07_dockerfile/7.12_healthcheck.md index 88b0505..47cec54 100644 --- a/07_dockerfile/7.12_healthcheck.md +++ b/07_dockerfile/7.12_healthcheck.md @@ -195,19 +195,3 @@ HEALTHCHECK --start-period=60s CMD curl -f http://localhost/ || exit 1 健康检查应主要关注**当前服务**是否可用,而不是检查其下游依赖(数据库等)。下游依赖的检查应由应用逻辑处理。 --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 检测容器应用是否真实可用 | -| **命令** | `HEALTHCHECK [选项] CMD command` | -| **状态** | starting, healthy, unhealthy | -| **Compose** | 支持 `condition: service_healthy` 依赖 | -| **注意** | 避免副作用,节省资源 | - -### 延伸阅读 - -- [CMD 容器启动命令](7.4_cmd.md):启动主进程 -- [Compose 模板文件](../10_compose/10.5_compose_file.md):Compose 中的健康检查 -- [Docker 调试](../16_appendix/16.2_debug.md):容器排障 diff --git a/07_dockerfile/7.13_onbuild.md b/07_dockerfile/7.13_onbuild.md index 3a2c794..9a03d4d 100644 --- a/07_dockerfile/7.13_onbuild.md +++ b/07_dockerfile/7.13_onbuild.md @@ -141,18 +141,3 @@ python:3.12-onbuild 如果 `ONBUILD` 指令产生了临时文件,最好在同一个指令链中清理,或者提供机制让子镜像清理。 --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 定义在子镜像构建时执行的指令 | -| **语法** | `ONBUILD INSTRUCTION` | -| **适用** | 基础架构镜像(Node, Python, Go 等) | -| **限制** | 只继承一次,不可级联 | -| **规范** | 建议使用 `-onbuild` 标签后缀 | - -### 延伸阅读 - -- [COPY 指令](7.2_copy.md):文件复制 -- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):基础镜像设计 diff --git a/07_dockerfile/7.14_label.md b/07_dockerfile/7.14_label.md index 045d99f..9df92a3 100644 --- a/07_dockerfile/7.14_label.md +++ b/07_dockerfile/7.14_label.md @@ -142,18 +142,3 @@ $ docker rmi $(docker images -q --filter "label=stage=builder") ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 添加 key-value 元数据 | -| **语法** | `LABEL k=v k=v ...` | -| **规范** | 推荐使用 OCI 标准标签 | -| **弃用** | 不要再使用 `MAINTAINER` | -| **查看** | `docker inspect` | - -### 延伸阅读 - -- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md) -- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md) diff --git a/07_dockerfile/7.15_shell.md b/07_dockerfile/7.15_shell.md index f6db6ab..e2889b4 100644 --- a/07_dockerfile/7.15_shell.md +++ b/07_dockerfile/7.15_shell.md @@ -135,18 +135,3 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] 避免在 Dockerfile 中频繁切换 SHELL,这会使构建过程难以理解和调试。尽量在头部定义一次即可。 --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell | -| **Linux 默认** | `["/bin/sh", "-c"]` | -| **Windows 默认** | `["cmd", "/S", "/C"]` | -| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` | -| **影响范围** | 后续所有使用 shell 格式的指令 | - -### 延伸阅读 - -- [RUN 指令](../04_image/4.5_build.md):执行命令 -- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):错误处理与调试 diff --git a/07_dockerfile/7.1_run.md b/07_dockerfile/7.1_run.md index 0e4e6d3..e8d22e1 100644 --- a/07_dockerfile/7.1_run.md +++ b/07_dockerfile/7.1_run.md @@ -158,19 +158,3 @@ RUN --mount=type=secret,id=mysecret \ ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 在新层执行命令 | -| **原则** | 合并命令,清理缓存 | -| **格式** | Shell (常用) vs Exec | -| **陷阱** | `cd` 不持久,环境变量不持久 | -| **进阶** | 使用 Cache Mount 加速构建 | - -### 延伸阅读 - -- [CMD 容器启动命令](7.4_cmd.md):容器启动时的命令 -- [WORKDIR 指定工作目录](7.10_workdir.md):改变目录 -- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md) diff --git a/07_dockerfile/7.2_copy.md b/07_dockerfile/7.2_copy.md index 12810fb..1c8fe2a 100644 --- a/07_dockerfile/7.2_copy.md +++ b/07_dockerfile/7.2_copy.md @@ -265,20 +265,3 @@ COPY . . ``` --- - -### 本章小结 - -| 操作 | 示例 | -|------|------| -| 复制文件 | `COPY app.js /app/` | -| 复制多个文件 | `COPY *.json /app/` | -| 复制目录内容 | `COPY src/ /app/src/` | -| 修改所有者 | `COPY --chown=node:node . /app/` | -| 从构建阶段复制 | `COPY --from=builder /app/dist ./` | - -### 延伸阅读 - -- [ADD 指令](7.3_add.md):复制和解压 -- [WORKDIR 指令](7.10_workdir.md):设置工作目录 -- [多阶段构建](7.17_multistage_builds.md):优化镜像大小 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 diff --git a/07_dockerfile/7.3_add.md b/07_dockerfile/7.3_add.md index cf1b211..985e0c4 100644 --- a/07_dockerfile/7.3_add.md +++ b/07_dockerfile/7.3_add.md @@ -220,19 +220,3 @@ RUN tar -xzf /tmp/app.tar.gz -C /app && \ ``` --- - -### 本章小结 - -| 场景 | 推荐指令 | -|------|---------| -| 复制普通文件 | `COPY` | -| 复制目录 | `COPY` | -| 自动解压 tar | `ADD` | -| 从 URL 下载 | `RUN curl` | -| 保持 tar 不解压 | `COPY` | - -### 延伸阅读 - -- [COPY 复制文件](7.2_copy.md):基本复制操作 -- [多阶段构建](7.17_multistage_builds.md):减少镜像体积 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 diff --git a/07_dockerfile/7.4_cmd.md b/07_dockerfile/7.4_cmd.md index 47d5c20..529d5f9 100644 --- a/07_dockerfile/7.4_cmd.md +++ b/07_dockerfile/7.4_cmd.md @@ -275,19 +275,3 @@ CMD ["python", "app.py"] ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 指定容器启动时的默认命令 | -| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` | -| **覆盖方式** | `docker run image 新命令` | -| **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 | -| **核心原则** | 应用必须在前台运行 | - -### 延伸阅读 - -- [ENTRYPOINT 入口点](7.5_entrypoint.md):固定的启动命令 -- [后台运行](../05_container/5.2_daemon.md):容器前台/后台概念 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 diff --git a/07_dockerfile/7.5_entrypoint.md b/07_dockerfile/7.5_entrypoint.md index 5040ffd..95b2af6 100644 --- a/07_dockerfile/7.5_entrypoint.md +++ b/07_dockerfile/7.5_entrypoint.md @@ -315,17 +315,3 @@ wait $PID ``` --- - -### 本章小结 - -| ENTRYPOINT | CMD | 适用场景 | -|------------|-----|---------| -| ✓ | ✗ | 镜像作为固定命令使用 | -| ✗ | ✓ | 简单的默认命令 | -| ✓ | ✓ | **推荐**:固定命令 + 可配置参数 | - -### 延伸阅读 - -- [CMD 容器启动命令](7.4_cmd.md):默认命令 -- [最佳实践](../16_appendix/16.1_best_practices.md):启动命令设计 -- [后台运行](../05_container/5.2_daemon.md):前台/后台概念 diff --git a/07_dockerfile/7.6_env.md b/07_dockerfile/7.6_env.md index d32056a..0afbd69 100644 --- a/07_dockerfile/7.6_env.md +++ b/07_dockerfile/7.6_env.md @@ -259,19 +259,3 @@ ENV VAR3=value3 ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **语法** | `ENV KEY=value` | -| **作用范围** | 构建时 + 运行时 | -| **覆盖方式** | `docker run -e KEY=value` | -| **与 ARG** | ARG 仅构建时,ENV 持久化到运行时 | -| **安全** | 不要存储敏感信息 | - -### 延伸阅读 - -- [ARG 构建参数](7.7_arg.md):构建时变量 -- [Compose 环境变量](../10_compose/10.5_compose_file.md):Compose 中的环境变量 -- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 diff --git a/07_dockerfile/7.7_arg.md b/07_dockerfile/7.7_arg.md index 836119b..b0b07bf 100644 --- a/07_dockerfile/7.7_arg.md +++ b/07_dockerfile/7.7_arg.md @@ -242,20 +242,3 @@ FROM ${BASE_IMAGE} ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 定义构建时变量 | -| **语法** | `ARG NAME=value` | -| **覆盖** | `docker build --build-arg NAME=value` | -| **作用域** | FROM 之后需要重新声明 | -| **vs ENV** | ARG 仅构建时,ENV 构建+运行时 | -| **安全** | 不要存储敏感信息 | - -### 延伸阅读 - -- [ENV 设置环境变量](7.6_env.md):运行时环境变量 -- [FROM 指令](../04_image/4.5_build.md):基础镜像指定 -- [多阶段构建](7.17_multistage_builds.md):复杂构建场景 diff --git a/07_dockerfile/7.8_volume.md b/07_dockerfile/7.8_volume.md index 1599335..57d2539 100644 --- a/07_dockerfile/7.8_volume.md +++ b/07_dockerfile/7.8_volume.md @@ -15,21 +15,28 @@ VOLUME /路径 > **核心原则**:容器存储层应该保持无状态,任何运行时数据都应该存储在卷中。 -``` -没有 VOLUME: 使用 VOLUME: -┌─────────────────────┐ ┌─────────────────────┐ -│ 容器存储层 │ │ 容器存储层 │ -│ ┌─────────────┐ │ │ (只读/无状态) │ -│ │ 数据库文件 │←─问题 │ │ -│ │ 日志文件 │ │ └──────────┬──────────┘ -│ │ 上传文件 │ │ │ -│ └─────────────┘ │ ┌──────────▼──────────┐ -└─────────────────────┘ │ 数据卷 │ -容器删除 = 数据丢失 │ ┌─────────────┐ │ - │ │ 持久化数据 │←─安全 - │ └─────────────┘ │ - └─────────────────────┘ - 容器删除,数据保留 +```mermaid +flowchart LR + subgraph NoVolume ["没有 VOLUME:"] + direction TB + subgraph Container1 ["容器存储层"] + direction TB + Files["数据库文件 (问题)
日志文件
上传文件"] + end + Result1["容器删除 = 数据丢失"] + Container1 ~~~ Result1 + end + + subgraph UseVolume ["使用 VOLUME:"] + direction TB + Container2["容器存储层
(只读/无状态)"] + subgraph Volume ["数据卷"] + Data["持久化数据 (安全)"] + end + Container2 --> Volume + Result2["容器删除,数据保留"] + Volume ~~~ Result2 + end ``` --- @@ -256,19 +263,3 @@ VOLUME /var/lib/mysql ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 创建挂载点,标记为外部卷 | -| **语法** | `VOLUME /path` | -| **默认行为** | 自动创建匿名卷 | -| **覆盖方式** | `docker run -v name:/path` | -| **注意** | VOLUME 之后的修改会丢失 | - -### 延伸阅读 - -- [数据卷](../08_data_network/data/volume.md):卷的管理和使用 -- [挂载主机目录](../08_data_network/data/bind-mounts.md):Bind Mount -- [Compose 数据管理](../10_compose/10.5_compose_file.md):Compose 中的卷配置 diff --git a/07_dockerfile/7.9_expose.md b/07_dockerfile/7.9_expose.md index 4656a44..dcf4ba0 100644 --- a/07_dockerfile/7.9_expose.md +++ b/07_dockerfile/7.9_expose.md @@ -75,20 +75,11 @@ $ docker port $(docker ps -q) | **是否必需** | 否 | 是(外部访问时) | | **映射发生时** | 不发生 | 运行时发生 | -``` -┌────────────────────────────────────────────────────────────┐ -│ EXPOSE 80 │ -│ ↓ │ -│ 仅声明意图 │ -│ └───────────────────────────────────────┘ │ -│ │ -│ docker run -p │ -│ ↓ │ -│ ┌─────────────────────┐ │ -│ │ 实际端口映射 │ │ -│ │ 宿主机 ←→ 容器 │ │ -│ └─────────────────────┘ │ -└────────────────────────────────────────────────────────────┘ +```mermaid +flowchart TD + Expose["EXPOSE 80
仅声明意图"] + Run["docker run -p
实际端口映射
宿主机 ←→ 容器"] + Expose ~~~ Run ``` #### 没有 EXPOSE 也能 -p @@ -224,19 +215,3 @@ services: `expose` 在 Compose 中仅用于容器间通信的文档说明,不进行端口映射。 --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 声明容器提供服务的端口(文档) | -| **不会** | 自动映射端口或开放外部访问 | -| **配合** | `docker run -P` 自动映射 | -| **外部访问** | 需要 `-p 宿主机端口:容器端口` | -| **语法** | `EXPOSE 80` 或 `EXPOSE 80/tcp` | - -### 延伸阅读 - -- [网络配置](../08_data_network/network/README.md):Docker 网络详解 -- [端口映射](../08_data_network/network/port_mapping.md):-p 参数详解 -- [Compose 端口](../10_compose/10.5_compose_file.md):Compose 中的端口配置 diff --git a/07_dockerfile/summary.md b/07_dockerfile/summary.md new file mode 100644 index 0000000..26593ee --- /dev/null +++ b/07_dockerfile/summary.md @@ -0,0 +1,208 @@ +## 本章小结 + +| 要点 | 说明 | +|------|------| +| **作用** | 设置后续指令的工作目录 | +| **语法** | `WORKDIR /path` | +| **自动创建** | 目录不存在会自动创建 | +| **持久性** | 影响后续所有指令,直到下次 WORKDIR | +| **不要用** | `RUN cd /path`(无效) | + +### 延伸阅读 + +- [COPY 复制文件](7.2_copy.md):文件复制 +- [RUN 执行命令](../04_image/4.5_build.md):执行构建命令 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 + +| 要点 | 说明 | +|------|------| +| **作用** | 切换后续指令的执行用户 | +| **语法** | `USER username` 或 `USER UID:GID` | +| **前提** | 用户必须已存在 | +| **运行时覆盖** | `docker run -u` | +| **切换工具** | 使用 gosu,不用 su/sudo | + +### 延伸阅读 + +- [安全](../11_ops/security/README.md):容器安全实践 +- [ENTRYPOINT](7.5_entrypoint.md):入口脚本中的用户切换 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 安全 + +| 要点 | 说明 | +|------|------| +| **作用** | 检测容器应用是否真实可用 | +| **命令** | `HEALTHCHECK [选项] CMD command` | +| **状态** | starting, healthy, unhealthy | +| **Compose** | 支持 `condition: service_healthy` 依赖 | +| **注意** | 避免副作用,节省资源 | + +### 延伸阅读 + +- [CMD 容器启动命令](7.4_cmd.md):启动主进程 +- [Compose 模板文件](../10_compose/10.5_compose_file.md):Compose 中的健康检查 +- [Docker 调试](../16_appendix/16.2_debug.md):容器排障 + +| 要点 | 说明 | +|------|------| +| **作用** | 定义在子镜像构建时执行的指令 | +| **语法** | `ONBUILD INSTRUCTION` | +| **适用** | 基础架构镜像(Node, Python, Go 等) | +| **限制** | 只继承一次,不可级联 | +| **规范** | 建议使用 `-onbuild` 标签后缀 | + +### 延伸阅读 + +- [COPY 指令](7.2_copy.md):文件复制 +- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):基础镜像设计 + +| 要点 | 说明 | +|------|------| +| **作用** | 添加 key-value 元数据 | +| **语法** | `LABEL k=v k=v ...` | +| **规范** | 推荐使用 OCI 标准标签 | +| **弃用** | 不要再使用 `MAINTAINER` | +| **查看** | `docker inspect` | + +### 延伸阅读 + +- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md) +- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md) + +| 要点 | 说明 | +|------|------| +| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell | +| **Linux 默认** | `["/bin/sh", "-c"]` | +| **Windows 默认** | `["cmd", "/S", "/C"]` | +| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` | +| **影响范围** | 后续所有使用 shell 格式的指令 | + +### 延伸阅读 + +- [RUN 指令](../04_image/4.5_build.md):执行命令 +- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md):错误处理与调试 + +| 要点 | 说明 | +|------|------| +| **作用** | 在新层执行命令 | +| **原则** | 合并命令,清理缓存 | +| **格式** | Shell (常用) vs Exec | +| **陷阱** | `cd` 不持久,环境变量不持久 | +| **进阶** | 使用 Cache Mount 加速构建 | + +### 延伸阅读 + +- [CMD 容器启动命令](7.4_cmd.md):容器启动时的命令 +- [WORKDIR 指定工作目录](7.10_workdir.md):改变目录 +- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md) + +| 操作 | 示例 | +|------|------| +| 复制文件 | `COPY app.js /app/` | +| 复制多个文件 | `COPY *.json /app/` | +| 复制目录内容 | `COPY src/ /app/src/` | +| 修改所有者 | `COPY --chown=node:node . /app/` | +| 从构建阶段复制 | `COPY --from=builder /app/dist ./` | + +### 延伸阅读 + +- [ADD 指令](7.3_add.md):复制和解压 +- [WORKDIR 指令](7.10_workdir.md):设置工作目录 +- [多阶段构建](7.17_multistage_builds.md):优化镜像大小 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 + +| 场景 | 推荐指令 | +|------|---------| +| 复制普通文件 | `COPY` | +| 复制目录 | `COPY` | +| 自动解压 tar | `ADD` | +| 从 URL 下载 | `RUN curl` | +| 保持 tar 不解压 | `COPY` | + +### 延伸阅读 + +- [COPY 复制文件](7.2_copy.md):基本复制操作 +- [多阶段构建](7.17_multistage_builds.md):减少镜像体积 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 + +| 要点 | 说明 | +|------|------| +| **作用** | 指定容器启动时的默认命令 | +| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` | +| **覆盖方式** | `docker run image 新命令` | +| **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 | +| **核心原则** | 应用必须在前台运行 | + +### 延伸阅读 + +- [ENTRYPOINT 入口点](7.5_entrypoint.md):固定的启动命令 +- [后台运行](../05_container/5.2_daemon.md):容器前台/后台概念 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 + +| ENTRYPOINT | CMD | 适用场景 | +|------------|-----|---------| +| ✓ | ✗ | 镜像作为固定命令使用 | +| ✗ | ✓ | 简单的默认命令 | +| ✓ | ✓ | **推荐**:固定命令 + 可配置参数 | + +### 延伸阅读 + +- [CMD 容器启动命令](7.4_cmd.md):默认命令 +- [最佳实践](../16_appendix/16.1_best_practices.md):启动命令设计 +- [后台运行](../05_container/5.2_daemon.md):前台/后台概念 + +| 要点 | 说明 | +|------|------| +| **语法** | `ENV KEY=value` | +| **作用范围** | 构建时 + 运行时 | +| **覆盖方式** | `docker run -e KEY=value` | +| **与 ARG** | ARG 仅构建时,ENV 持久化到运行时 | +| **安全** | 不要存储敏感信息 | + +### 延伸阅读 + +- [ARG 构建参数](7.7_arg.md):构建时变量 +- [Compose 环境变量](../10_compose/10.5_compose_file.md):Compose 中的环境变量 +- [最佳实践](../16_appendix/16.1_best_practices.md):Dockerfile 编写指南 + +| 要点 | 说明 | +|------|------| +| **作用** | 定义构建时变量 | +| **语法** | `ARG NAME=value` | +| **覆盖** | `docker build --build-arg NAME=value` | +| **作用域** | FROM 之后需要重新声明 | +| **vs ENV** | ARG 仅构建时,ENV 构建+运行时 | +| **安全** | 不要存储敏感信息 | + +### 延伸阅读 + +- [ENV 设置环境变量](7.6_env.md):运行时环境变量 +- [FROM 指令](../04_image/4.5_build.md):基础镜像指定 +- [多阶段构建](7.17_multistage_builds.md):复杂构建场景 + +| 要点 | 说明 | +|------|------| +| **作用** | 创建挂载点,标记为外部卷 | +| **语法** | `VOLUME /path` | +| **默认行为** | 自动创建匿名卷 | +| **覆盖方式** | `docker run -v name:/path` | +| **注意** | VOLUME 之后的修改会丢失 | + +### 延伸阅读 + +- [数据卷](../08_data_network/data/volume.md):卷的管理和使用 +- [挂载主机目录](../08_data_network/data/bind-mounts.md):Bind Mount +- [Compose 数据管理](../10_compose/10.5_compose_file.md):Compose 中的卷配置 + +| 要点 | 说明 | +|------|------| +| **作用** | 声明容器提供服务的端口(文档) | +| **不会** | 自动映射端口或开放外部访问 | +| **配合** | `docker run -P` 自动映射 | +| **外部访问** | 需要 `-p 宿主机端口:容器端口` | +| **语法** | `EXPOSE 80` 或 `EXPOSE 80/tcp` | + +### 延伸阅读 + +- [网络配置](../08_data_network/network/README.md):Docker 网络详解 +- [端口映射](../08_data_network/network/port_mapping.md):-p 参数详解 +- [Compose 端口](../10_compose/10.5_compose_file.md):Compose 中的端口配置 diff --git a/08_data_network/data/bind-mounts.md b/08_data_network/data/bind-mounts.md index 4997074..90f4e82 100644 --- a/08_data_network/data/bind-mounts.md +++ b/08_data_network/data/bind-mounts.md @@ -4,14 +4,19 @@ Bind Mount(绑定挂载)将**宿主机的目录或文件**直接挂载到容器中。容器可以读写宿主机的文件系统。 -``` -宿主机 容器 -┌─────────────────────┐ ┌─────────────────────┐ -│ /home/user/code/ │ │ │ -│ ├── index.html │◄───────►│ /usr/share/nginx/ │ -│ ├── style.css │ Bind │ html/ │ -│ └── app.js │ Mount │ (同一份文件) │ -└─────────────────────┘ └─────────────────────┘ +```mermaid +flowchart LR + subgraph Host ["宿主机"] + direction TB + Dir1["/home/user/code/
├── index.html
├── style.css
└── app.js"] + end + + subgraph Container ["容器"] + direction TB + Dir2["/usr/share/nginx/html/
(同一份文件)"] + end + + Dir1 <-->|Bind Mount| Dir2 ``` --- @@ -29,16 +34,14 @@ Bind Mount(绑定挂载)将**宿主机的目录或文件**直接挂载到容 #### 选择建议 -``` -需求 推荐方案 -───────────────────────────────────────── -开发时同步代码 → Bind Mount -持久化数据库数据 → Volume -共享配置文件 → Bind Mount -容器间共享数据 → Volume -备份方便 → Bind Mount(直接访问) -生产环境 → Volume -``` +| 需求 | 推荐方案 | +|------|----------| +| 开发时同步代码 | Bind Mount | +| 持久化数据库数据 | Volume | +| 共享配置文件 | Bind Mount | +| 容器间共享数据 | Volume | +| 备份方便 | Bind Mount(直接访问) | +| 生产环境 | Volume | --- @@ -311,19 +314,3 @@ $ docker run -v /app/data:/data ... ``` --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **作用** | 将宿主机目录挂载到容器 | -| **语法** | `-v /宿主机:/容器` 或 `--mount type=bind,...` | -| **只读** | 添加 `readonly` 或 `:ro` | -| **适用场景** | 开发环境、配置文件、日志 | -| **vs Volume** | Bind 更灵活,Volume 更适合生产 | - -### 延伸阅读 - -- [数据卷](volume.md):Docker 管理的持久化存储 -- [tmpfs 挂载](tmpfs.md):内存临时存储 -- [Compose 数据管理](../../10_compose/10.5_compose_file.md):Compose 中的挂载配置 diff --git a/08_data_network/data/summary.md b/08_data_network/data/summary.md new file mode 100644 index 0000000..ac8c386 --- /dev/null +++ b/08_data_network/data/summary.md @@ -0,0 +1,30 @@ +## 本章小结 + +| 要点 | 说明 | +|------|------| +| **作用** | 将宿主机目录挂载到容器 | +| **语法** | `-v /宿主机:/容器` 或 `--mount type=bind,...` | +| **只读** | 添加 `readonly` 或 `:ro` | +| **适用场景** | 开发环境、配置文件、日志 | +| **vs Volume** | Bind 更灵活,Volume 更适合生产 | + +### 延伸阅读 + +- [数据卷](volume.md):Docker 管理的持久化存储 +- [tmpfs 挂载](tmpfs.md):内存临时存储 +- [Compose 数据管理](../../10_compose/10.5_compose_file.md):Compose 中的挂载配置 + +| 操作 | 命令 | +|------|------| +| 创建数据卷 | `docker volume create name` | +| 列出数据卷 | `docker volume ls` | +| 查看详情 | `docker volume inspect name` | +| 删除数据卷 | `docker volume rm name` | +| 清理未用 | `docker volume prune` | +| 挂载数据卷 | `-v name:/path` 或 `--mount source=name,target=/path` | + +### 延伸阅读 + +- [绑定挂载](bind-mounts.md):挂载宿主机目录 +- [tmpfs 挂载](tmpfs.md):内存中的临时存储 +- [存储驱动](../../14_implementation/14.4_ufs.md):Docker 存储的底层原理 diff --git a/08_data_network/data/volume.md b/08_data_network/data/volume.md index 0a540d9..bf4378f 100644 --- a/08_data_network/data/volume.md +++ b/08_data_network/data/volume.md @@ -397,20 +397,3 @@ $ docker volume inspect my-vol 3. 在目标机器恢复 --- - -### 本章小结 - -| 操作 | 命令 | -|------|------| -| 创建数据卷 | `docker volume create name` | -| 列出数据卷 | `docker volume ls` | -| 查看详情 | `docker volume inspect name` | -| 删除数据卷 | `docker volume rm name` | -| 清理未用 | `docker volume prune` | -| 挂载数据卷 | `-v name:/path` 或 `--mount source=name,target=/path` | - -### 延伸阅读 - -- [绑定挂载](bind-mounts.md):挂载宿主机目录 -- [tmpfs 挂载](tmpfs.md):内存中的临时存储 -- [存储驱动](../../14_implementation/14.4_ufs.md):Docker 存储的底层原理 diff --git a/08_data_network/network/README.md b/08_data_network/network/README.md index 1121d49..afc9216 100644 --- a/08_data_network/network/README.md +++ b/08_data_network/network/README.md @@ -47,10 +47,22 @@ graph TD ### 数据流向 -``` -容器 A (172.17.0.2) → docker0 → 容器 B (172.17.0.3) (容器间通信) -容器 A (172.17.0.2) → docker0 → eth0 → 互联网 (访问外网) -外部请求 → eth0 → docker0 → 容器 A (被外部访问,需端口映射) +```mermaid +flowchart LR + subgraph Comm1 ["容器间通信"] + direction LR + C1A["容器 A (172.17.0.2)"] --> D0A["docker0"] --> C1B["容器 B (172.17.0.3)"] + end + + subgraph Comm2 ["访问外网"] + direction LR + C2A["容器 A (172.17.0.2)"] --> D0B["docker0"] --> Eth0A["eth0"] --> InternetA["互联网"] + end + + subgraph Comm3 ["被外部访问,需端口映射"] + direction LR + Req["外部请求"] --> Eth0B["eth0"] --> D0C["docker0"] --> C3A["容器 A"] + end ``` --- @@ -124,17 +136,12 @@ PING db (172.18.0.3): 56 data bytes 自定义网络自动提供 DNS 服务: -``` -┌─────────────────────────────────────────────────────────┐ -│ mynet 网络 │ -│ │ -│ ┌─────────┐ DNS ┌─────────┐ │ -│ │ web │ ──── "db" → 172.18.0.3 ───► │ db │ │ -│ │172.18.0.2│ │172.18.0.3│ │ -│ └─────────┘ └─────────┘ │ -│ │ -│ web 容器可以用 "db" 作为主机名访问 db 容器 │ -└─────────────────────────────────────────────────────────┘ +```mermaid +flowchart LR + subgraph MyNet ["mynet 网络 : web 容器可以用 'db' 作为主机名访问 db 容器"] + direction LR + Web["web
172.18.0.2"] -- "DNS: 'db' → 172.18.0.3" --> DB["db
172.18.0.3"] + end ``` --- @@ -231,17 +238,10 @@ $ docker port mycontainer ### 端口映射示意图 -``` -外部请求 http://宿主机IP:8080 - │ - ▼ - ┌─────────────┐ - │ 宿主机:8080 │ ─── iptables NAT ───┐ - └─────────────┘ │ - ▼ - ┌───────────────┐ - │ 容器 nginx:80 │ - └───────────────┘ +```mermaid +flowchart TD + Req["外部请求 http://宿主机IP:8080"] --> Host["宿主机:8080"] + Host -- "iptables NAT" --> Container["容器 nginx:80"] ``` --- diff --git a/08_data_network/network/dns.md b/08_data_network/network/dns.md index 9e8d283..ccc18e3 100644 --- a/08_data_network/network/dns.md +++ b/08_data_network/network/dns.md @@ -98,16 +98,3 @@ $ docker run -h myweb nginx - **解决**:使用自定义网络 (`docker network create ...`)。 --- - -### 本章小结 - -| 场景 | DNS 行为 | 备注 | -|------|----------|------| -| **默认网络** | 继承宿主机 | 不支持容器名解析 | -| **自定义网络** | Docker 嵌入式 DNS | ✅ 支持容器名解析 | -| **手动指定** | 使用 `--dns` | 覆盖默认配置 | - -### 延伸阅读 - -- [网络模式](README.md):Docker 网络概览 -- [端口映射](port_mapping.md):外部访问 diff --git a/08_data_network/network/port_mapping.md b/08_data_network/network/port_mapping.md index a74203b..f3635d5 100644 --- a/08_data_network/network/port_mapping.md +++ b/08_data_network/network/port_mapping.md @@ -9,19 +9,11 @@ 为了让外部(如你的浏览器、其他局域网机器)访问容器内的服务,我们需要将容器的端口**映射**到宿主机的端口。 -``` - 外部用户 (Browser) - │ - ▼ - 宿主机 (localhost:8080) - │ - ┌────┴────┐ 端口映射 - │ Docker │ (8080 -> 80) - │ Proxy │ - └────┬────┘ - │ - ▼ - 容器 (Class B: 80) +```mermaid +flowchart TD + User["外部用户 (Browser)"] --> Host["宿主机 (localhost:8080)"] + Host --> Proxy["Docker Proxy
端口映射 (8080 -> 80)"] + Proxy --> Container["容器 (Class B: 80)"] ``` --- @@ -152,17 +144,3 @@ iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0. 这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP(如 172.17.0.1),而不是真实的外部 Client IP(除非使用 host 网络模式)。 --- - -### 本章小结 - -| 要点 | 说明 | -|------|------| -| **-p** | 指定端口映射(常用),如 `8080:80` | -| **-P** | 随机映射所有 EXPOSE 的端口 | -| **安全性** | 默认监听所有 IP,敏感服务应绑定 `127.0.0.1` | -| **查看** | 使用 `docker port` 或 `docker ps` | - -### 延伸阅读 - -- [EXPOSE 指令](../../07_dockerfile/7.9_expose.md):在 Dockerfile 中声明端口 -- [网络模式](README.md):Host 模式不需要端口映射 diff --git a/08_data_network/network/summary.md b/08_data_network/network/summary.md new file mode 100644 index 0000000..ce7cf2d --- /dev/null +++ b/08_data_network/network/summary.md @@ -0,0 +1,24 @@ +## 本章小结 + +| 场景 | DNS 行为 | 备注 | +|------|----------|------| +| **默认网络** | 继承宿主机 | 不支持容器名解析 | +| **自定义网络** | Docker 嵌入式 DNS | ✅ 支持容器名解析 | +| **手动指定** | 使用 `--dns` | 覆盖默认配置 | + +### 延伸阅读 + +- [网络模式](README.md):Docker 网络概览 +- [端口映射](port_mapping.md):外部访问 + +| 要点 | 说明 | +|------|------| +| **-p** | 指定端口映射(常用),如 `8080:80` | +| **-P** | 随机映射所有 EXPOSE 的端口 | +| **安全性** | 默认监听所有 IP,敏感服务应绑定 `127.0.0.1` | +| **查看** | 使用 `docker port` 或 `docker ps` | + +### 延伸阅读 + +- [EXPOSE 指令](../../07_dockerfile/7.9_expose.md):在 Dockerfile 中声明端口 +- [网络模式](README.md):Host 模式不需要端口映射 diff --git a/10_compose/10.6_django.md b/10_compose/10.6_django.md index f13154e..319a1b9 100644 --- a/10_compose/10.6_django.md +++ b/10_compose/10.6_django.md @@ -8,24 +8,27 @@ 在开始之前,先看整体架构(如图 10-1 所示): -``` -┌─────────────────────────────────────────────────────────────┐ -│ Docker Compose 网络 │ -│ │ -│ ┌─────────────────────┐ ┌─────────────────────┐ │ -│ │ web 服务 │ │ db 服务 │ │ -│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ -│ │ │ Django │ │──────│ │ PostgreSQL │ │ │ -│ │ │ 应用 │ │ :5432│ │ 数据库 │ │ │ -│ │ └───────────────┘ │ │ └───────────────┘ │ │ -│ │ :8000 │ │ │ │ -│ └──────────┬──────────┘ └─────────────────────┘ │ -│ │ │ -└─────────────┼───────────────────────────────────────────────┘ - │ - ▼ - localhost:8000 - (浏览器访问) +```mermaid +flowchart TD + subgraph Network ["Docker Compose 网络"] + direction LR + subgraph Web ["web 服务"] + direction TB + Django["Django
应用"] + Port8000[":8000"] + Django ~~~ Port8000 + end + + subgraph DB ["db 服务"] + direction TB + Postgres["PostgreSQL
数据库"] + end + + Django -- ":5432" --> Postgres + end + + Browser["localhost:8000
(浏览器访问)"] + Port8000 --> Browser ``` 图 10-1 Django + PostgreSQL 的 Compose 架构 diff --git a/10_compose/10.7_rails.md b/10_compose/10.7_rails.md index d97f072..da81da4 100644 --- a/10_compose/10.7_rails.md +++ b/10_compose/10.7_rails.md @@ -8,23 +8,27 @@ 如图 10-2 所示,Rails 与 PostgreSQL 在同一 Compose 网络中协同工作。 -``` -┌─────────────────────────────────────────────────────────────┐ -│ Docker Compose 网络 │ -│ │ -│ ┌─────────────────────┐ ┌─────────────────────┐ │ -│ │ web 服务 │ │ db 服务 │ │ -│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ -│ │ │ Rails │ │──────│ │ PostgreSQL │ │ │ -│ │ │ 应用 │ │ :5432│ │ 数据库 │ │ │ -│ │ └───────────────┘ │ │ └───────────────┘ │ │ -│ │ :3000 │ │ │ │ -│ └──────────┬──────────┘ └─────────────────────┘ │ -│ │ │ -└─────────────┼───────────────────────────────────────────────┘ - │ - ▼ - localhost:3000 +```mermaid +flowchart TD + subgraph Network ["Docker Compose 网络"] + direction LR + subgraph Web ["web 服务"] + direction TB + Rails["Rails
应用"] + Port3000[":3000"] + Rails ~~~ Port3000 + end + + subgraph DB ["db 服务"] + direction TB + Postgres["PostgreSQL
数据库"] + end + + Rails -- ":5432" --> Postgres + end + + Browser["localhost:3000"] + Port3000 --> Browser ``` 图 10-2 Rails + PostgreSQL 的 Compose 架构 diff --git a/11_ops/security/README.md b/11_ops/security/README.md index 948b3d1..5c7155a 100644 --- a/11_ops/security/README.md +++ b/11_ops/security/README.md @@ -6,19 +6,22 @@ > **核心问题**:容器共享宿主机内核,隔离性弱于虚拟机。如何在便利性和安全性之间取得平衡? -``` -虚拟机安全模型: 容器安全模型: -┌─────────────────┐ ┌─────────────────┐ -│ Guest OS │ │ 容器进程 │ -├─────────────────┤ │ (共享内核) │ -│ Hypervisor │◄── 隔离边界└────────┬────────┘ -├─────────────────┤ │ -│ Host OS │ ┌────────┴────────┐ -└─────────────────┘ │ Namespace │◄── 隔离边界 - │ Cgroups │ -完全隔离(性能损耗) │ Capabilities │ - └─────────────────┘ - 进程隔离(轻量但需加固) +```mermaid +flowchart LR + subgraph VM ["虚拟机安全模型:
完全隔离(性能损耗)"] + direction TB + Guest["Guest OS"] + Hyper["Hypervisor
<-- 隔离边界"] + Host["Host OS"] + Guest --> Hyper --> Host + end + + subgraph Container ["容器安全模型:
进程隔离(轻量但需加固)"] + direction TB + Proc["容器进程
(共享内核)"] + Mech["Namespace <-- 隔离边界
Cgroups
Capabilities"] + Proc --> Mech + end ``` --- diff --git a/14_implementation/14.2_namespace.md b/14_implementation/14.2_namespace.md index 80fed8c..dd011f9 100644 --- a/14_implementation/14.2_namespace.md +++ b/14_implementation/14.2_namespace.md @@ -306,21 +306,3 @@ Namespace 提供了隔离但不是安全边界: > 需要更强隔离时,可考虑 gVisor、Kata Containers 等安全容器方案。 --- - -### 本章小结 - -| Namespace | 隔离内容 | 一句话说明 | -|-----------|---------|-----------| -| PID | 进程 ID | 容器有自己的进程树 | -| NET | 网络 | 容器有自己的 IP 和端口 | -| MNT | 文件系统 | 容器有自己的根目录 | -| UTS | 主机名 | 容器有自己的 hostname | -| IPC | 进程间通信 | 容器间 IPC 隔离 | -| USER | 用户 ID | 容器 root ≠ 宿主机 root | - -### 延伸阅读 - -- [控制组(Cgroups)](14.3_cgroups.md):资源限制机制 -- [联合文件系统](14.4_ufs.md):分层存储的实现 -- [安全](../11_ops/security/README.md):容器安全实践 -- [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html) diff --git a/14_implementation/14.3_cgroups.md b/14_implementation/14.3_cgroups.md index 6e1e60b..8f9f12a 100644 --- a/14_implementation/14.3_cgroups.md +++ b/14_implementation/14.3_cgroups.md @@ -291,19 +291,3 @@ $ docker run -d --name cadvisor \ ``` --- - -### 本章小结 - -| 资源 | 限制参数 | 示例 | -|------|---------|------| -| **内存** | `-m` | `-m 512m` | -| **CPU 核心数** | `--cpus` | `--cpus=1.5` | -| **CPU 绑定** | `--cpuset-cpus` | `--cpuset-cpus="0,1"` | -| **磁盘 I/O** | `--device-write-bps` | `--device-write-bps /dev/sda:10mb` | -| **进程数** | `--pids-limit` | `--pids-limit=100` | - -### 延伸阅读 - -- [命名空间](14.2_namespace.md):资源隔离 -- [安全](../11_ops/security/README.md):容器安全概述 -- [Docker Stats](../05_container/README.md):监控容器资源 diff --git a/14_implementation/14.4_ufs.md b/14_implementation/14.4_ufs.md index 453d08a..56eb678 100644 --- a/14_implementation/14.4_ufs.md +++ b/14_implementation/14.4_ufs.md @@ -219,18 +219,3 @@ RUN apt-get update && \ - 避免创建不必要的层 --- - -### 本章小结 - -| 概念 | 说明 | -|------|------| -| **UnionFS** | 将多层目录联合挂载为一个文件系统 | -| **Copy-on-Write** | 写时复制,修改时才复制到可写层 | -| **overlay2** | Docker 默认推荐的存储驱动 | -| **分层好处** | 镜像复用、快速构建、快速启动 | - -### 延伸阅读 - -- [镜像](../02_basic_concept/2.1_image.md):理解镜像分层 -- [容器](../02_basic_concept/2.2_container.md):容器存储层 -- [构建镜像](../04_image/4.5_build.md):Dockerfile 层的创建 diff --git a/14_implementation/summary.md b/14_implementation/summary.md new file mode 100644 index 0000000..7f88018 --- /dev/null +++ b/14_implementation/summary.md @@ -0,0 +1,44 @@ +## 本章小结 + +| Namespace | 隔离内容 | 一句话说明 | +|-----------|---------|-----------| +| PID | 进程 ID | 容器有自己的进程树 | +| NET | 网络 | 容器有自己的 IP 和端口 | +| MNT | 文件系统 | 容器有自己的根目录 | +| UTS | 主机名 | 容器有自己的 hostname | +| IPC | 进程间通信 | 容器间 IPC 隔离 | +| USER | 用户 ID | 容器 root ≠ 宿主机 root | + +### 延伸阅读 + +- [控制组(Cgroups)](14.3_cgroups.md):资源限制机制 +- [联合文件系统](14.4_ufs.md):分层存储的实现 +- [安全](../11_ops/security/README.md):容器安全实践 +- [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html) + +| 资源 | 限制参数 | 示例 | +|------|---------|------| +| **内存** | `-m` | `-m 512m` | +| **CPU 核心数** | `--cpus` | `--cpus=1.5` | +| **CPU 绑定** | `--cpuset-cpus` | `--cpuset-cpus="0,1"` | +| **磁盘 I/O** | `--device-write-bps` | `--device-write-bps /dev/sda:10mb` | +| **进程数** | `--pids-limit` | `--pids-limit=100` | + +### 延伸阅读 + +- [命名空间](14.2_namespace.md):资源隔离 +- [安全](../11_ops/security/README.md):容器安全概述 +- [Docker Stats](../05_container/README.md):监控容器资源 + +| 概念 | 说明 | +|------|------| +| **UnionFS** | 将多层目录联合挂载为一个文件系统 | +| **Copy-on-Write** | 写时复制,修改时才复制到可写层 | +| **overlay2** | Docker 默认推荐的存储驱动 | +| **分层好处** | 镜像复用、快速构建、快速启动 | + +### 延伸阅读 + +- [镜像](../02_basic_concept/2.1_image.md):理解镜像分层 +- [容器](../02_basic_concept/2.2_container.md):容器存储层 +- [构建镜像](../04_image/4.5_build.md):Dockerfile 层的创建