From 48c8b50cf701b79417e31c2f7e479947af7da1f9 Mon Sep 17 00:00:00 2001 From: baohua Date: Thu, 5 Mar 2026 23:15:06 -0800 Subject: [PATCH] Fix typography --- 01_introduction/1.3_why.md | 2 +- 02_basic_concept/2.3_repository.md | 2 +- 02_basic_concept/summary.md | 2 +- 03_install/3.8_windows.md | 2 +- 03_install/3.9_mirror.md | Bin 4446 -> 4418 bytes 04_image/4.5_build.md | Bin 13074 -> 13080 bytes 06_repository/6.1_dockerhub.md | 5 ++-- 06_repository/6.2_registry.md | Bin 4666 -> 4646 bytes 06_repository/6.4_nexus3_registry.md | Bin 5137 -> 5115 bytes 06_repository/summary.md | 2 +- 07_dockerfile/7.16_references.md | 35 ++++++++++++++++++++++--- 08_data/8.1_volume.md | 4 +-- 08_data/8.2_bind-mounts.md | 4 +-- 09_network/9.1_dns.md | 2 +- 10_buildx/10.2_buildx.md | 4 +-- 17_ecosystem/17.1_coreos_intro.md | 1 - 17_ecosystem/17.3_podman.md | Bin 2514 -> 2513 bytes 18_security/18.1_kernel_ns.md | 2 +- 18_security/18.2_control_group.md | 4 +-- 18_security/18.3_daemon_sec.md | 2 +- 18_security/18.4_kernel_capability.md | 8 +++--- 18_security/18.5_other_feature.md | 2 +- 19_observability/summary.md | 4 +-- 21_case_devops/21.1_devops_workflow.md | 2 +- README.md | 2 +- appendix/example_guidelines.md | 4 +-- 26 files changed, 62 insertions(+), 33 deletions(-) diff --git a/01_introduction/1.3_why.md b/01_introduction/1.3_why.md index 54aadf2..38c1ff3 100644 --- a/01_introduction/1.3_why.md +++ b/01_introduction/1.3_why.md @@ -102,7 +102,7 @@ $ docker compose up Docker 容器共享宿主机内核,无需为每个应用运行完整的操作系统。以一台 64GB 内存的物理服务器为例: - **传统虚拟机方案**:每个虚拟机都需要运行完整的操作系统(每个额外占用如 2GB 内存),产生大量资源开销,实际可用于应用的内存可能只有约 18GB。 -- **Docker 方案**:容器直接共享宿主机系统,只需付出很少的基础开销(OS及引擎约 4GB),即可将约 60GB 的内存全部用于实际应用。 +- **Docker 方案**:容器直接共享宿主机系统,只需付出很少的基础开销(OS 及引擎约 4GB),即可将约 60GB 的内存全部用于实际应用。 ```mermaid flowchart TD diff --git a/02_basic_concept/2.3_repository.md b/02_basic_concept/2.3_repository.md index c5faf32..4bf83cb 100644 --- a/02_basic_concept/2.3_repository.md +++ b/02_basic_concept/2.3_repository.md @@ -56,7 +56,7 @@ flowchart TB 一个完整的 Docker 镜像名称由 Registry 地址、用户名/组织名、仓库名和标签组成。了解其结构有助于我们更准确地定位镜像。基本格式如下: ```bash -[registry地址/][用户名/]仓库名[:标签] +[registry 地址/][用户名/]仓库名[:标签] ``` 示例: diff --git a/02_basic_concept/summary.md b/02_basic_concept/summary.md index 0fdfc06..3ad3c15 100644 --- a/02_basic_concept/summary.md +++ b/02_basic_concept/summary.md @@ -28,7 +28,7 @@ - [Dockerfile 最佳实践](../appendix/best_practices.md):构建高质量镜像的技巧 - [底层实现 - 联合文件系统](../12_implementation/12.4_ufs.md):深入理解分层存储的技术原理 - [启动容器](../05_container/5.1_run.md):详细的容器启动选项 -- [后台运行](../05_container/5.2_daemon.md):理解容器为什么会"立即退出" +- [后台运行](../05_container/5.2_daemon.md):理解容器为什么会“立即退出” - [进入容器](../05_container/5.4_attach_exec.md):如何操作运行中的容器 - [数据管理](../08_data/README.md):Volume 和数据持久化详解 - [Docker Hub](../06_repository/6.1_dockerhub.md):Docker Hub 的详细使用 diff --git a/03_install/3.8_windows.md b/03_install/3.8_windows.md index 61f1b0e..46bb8f2 100644 --- a/03_install/3.8_windows.md +++ b/03_install/3.8_windows.md @@ -17,7 +17,7 @@ 下载好之后双击 `Docker Desktop Installer.exe` 开始安装。 -**使用** [**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/) **安装** +**使用**[**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/)**安装** ```powershell $ winget install Docker.DockerDesktop diff --git a/03_install/3.9_mirror.md b/03_install/3.9_mirror.md index 373b9d084873dfbae21f2a21cf821fc920a6d148..60b54cc846a0819edf4217b9a3114b30948767e4 100644 GIT binary patch delta 19 acmcbobVzB#RRMMeXMY!0Lx#ye1kwOWRR+!g delta 47 zcmX@4bWdr+RRQIMjFOUqVk>?9+{~h){35;Nypqb&JiX-n+=R(@1kwP? C4HEYN diff --git a/04_image/4.5_build.md b/04_image/4.5_build.md index cffe6864a38917e8673d8650b75be719d5426999..c3daca23a97cca309c49a2892623081438b64ee1 100644 GIT binary patch delta 344 zcmbP~HY06=A_oV9v%ib0p%KI64V*GU>6v*I`kId$8lxe?#vozo$pswTP<18{fw^!2 zQ;5JRxPTd0KsckMq#y;^D08s5U_nL!vZw__yB}u^)B;P8fC_|TWB`%h314N9e!Ujq|C%TByosig_BeB dO7e@5#39ZVPD@S6FG@rb2fJE&vop_mH30vsWkdh~ delta 331 zcmXw!J#xY@5JoFNF>YW&MMc9*s+=PiNCU;nNd5tPS26Mo?vex0;D(YTWF`mT25<(T z<_=)3(!K9V-)gmwck%B;^Z=6#H_%+fcY1z|!?HwV%0K~b;2 za?YnVr`8(P=4l5^YTU`-3BGQrSV+tFKVRluKvLSpVN3ip8I4P|a(d*0@0;4Dgj`_$ zU$=^C9t%MrAfa4h!eSd-1yoUmwsPW?*%y_LGRYI0V?PwI&}fN&-rQReYel8xS>y02 OWNtF#t^Yp4^Yj6b Security 中启用 2FA,保护账号安全。启用后,CLI 登录需要使用 **Access Token** 而非密码。 #### 2. 使用 Access Token + > **⚠️ 警告**:绝不要在脚本或 CI/CD 系统中,直接使用 `-p` 参数传递密码或 Token (类似 `docker login -p xxx`)!这会导致凭证直接暴露在系统的命令历史、进程列表和终端输出中。 1. 在 Docker Hub -> Account Settings -> Security -> Access Tokens 创建 Token (PAT)。 diff --git a/06_repository/6.2_registry.md b/06_repository/6.2_registry.md index 4c5717d56ba8ea7e675ff4b62becbf6b6bc9cca3..32f7dbb4666301ef552d563f439038fff7f8855b 100644 GIT binary patch delta 30 hcmdm`vP@;dPId-oe-~FHhKZ-@AWUP1&5?``1pt~r3331c delta 50 qcmZ3cvP)&cPQiqf{N(J^BHg0Y^vvRtqRNDc2kI~dH@h-E6aWAbloW{o diff --git a/06_repository/6.4_nexus3_registry.md b/06_repository/6.4_nexus3_registry.md index 29e65d796752b4680d721066555ba8d39fcd83f6..ceed15bfc43e84911dd706c47bd35c6eb6dbc3e5 100644 GIT binary patch delta 33 kcmbQJ@mqaEF(W&Jv%ib0CBx=g#wJb($B<#OB=-*v0I0MHK>z>% delta 55 zcmV-70LcIQCy^+ya{&rqPGxv?b2Bb@V6%Dwf(aU6=cj?@oQdSSljXXT>8qIMx~J)d Njpx0tV6y`Y_z2JV97zBG diff --git a/06_repository/summary.md b/06_repository/summary.md index 02f7374..45c72c8 100644 --- a/06_repository/summary.md +++ b/06_repository/summary.md @@ -5,7 +5,7 @@ | 功能 | 说明 | |------|------| | **官方镜像** | 优先使用的基础镜像 | -| **拉取限制** | 匿名 100次/6h,登录 200次/6h | +| **拉取限制** | 匿名 100 次/6h,登录 200 次/6h | | **安全** | 推荐开启 2FA 并使用 Access Token | | **自动化** | 支持 Webhooks 和自动构建 | diff --git a/07_dockerfile/7.16_references.md b/07_dockerfile/7.16_references.md index a1dfa75..8974492 100644 --- a/07_dockerfile/7.16_references.md +++ b/07_dockerfile/7.16_references.md @@ -1,7 +1,36 @@ ## 7.16 参考文档 -* `Dockerfile` 官方文档:https://docs.docker.com/engine/reference/builder/ +### 官方文档 -* `Dockerfile` 最佳实践文档:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ +* `Dockerfile` 官方参考手册:https://docs.docker.com/engine/reference/builder/ -* `Docker` 官方镜像 `Dockerfile`:https://github.com/docker-library/docs +* `Dockerfile` 最佳实践指南:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ + +* `Docker` 官方镜像 `Dockerfile` 库:https://github.com/docker-library/docs + +### 常用指令总结 + +Dockerfile 中的常用指令包括: + +- **FROM**: 指定基础镜像,必须是第一条指令 +- **RUN**: 在镜像中执行命令,用于安装软件包等 +- **WORKDIR**: 设置工作目录 +- **COPY/ADD**: 复制文件到镜像中 +- **EXPOSE**: 声明容器监听的端口 +- **ENV**: 设置环境变量 +- **ENTRYPOINT**: 容器启动时的入口点 +- **CMD**: 容器默认执行的命令 + +### 最佳实践建议 + +1. 使用具体的基础镜像版本标签而非 latest +2. 最小化镜像层数,合并 RUN 指令 +3. 使用 .dockerignore 文件排除不必要的文件 +4. 安装必要的软件包后清理缓存 +5. 使用多阶段构建减小最终镜像体积 +6. 避免以 root 身份运行容器应用 + +### 相关资源 + +- Docker 官方镜像库:https://hub.docker.com/ +- Docker 镜像构建最佳实践:https://docs.docker.com/build/building/best-practices/ diff --git a/08_data/8.1_volume.md b/08_data/8.1_volume.md index 430d4d2..597c2a0 100644 --- a/08_data/8.1_volume.md +++ b/08_data/8.1_volume.md @@ -139,10 +139,10 @@ $ docker run -d \ |------|---------|-----| | 语法 | 键值对,更清晰 | 冒号分隔,更简洁 | | **数据卷 (Volume)** 挂载行为 | 卷不存在会自动创建,与 `-v` 结果一致 | 卷不存在会自动创建 | -| **绑定挂载 (Bind Mount)** 行为 | ⭐ **宿主机路径不存在会报错**,不会自动创建 | 宿主机路径不存在会**自动创建为目录** | +| **绑定挂载 (Bind Mount)** 行为 | ⭐**宿主机路径不存在会报错**,不会自动创建 | 宿主机路径不存在会 **自动创建为目录** | | 推荐程度 | ✅ 推荐 (更明确安全,避免误创建)| 常用 (更简洁)| -> **提示**:官方更推荐使用 `--mount`。除了语法格式可读性更好之外,最重要的行为差异发生在 **绑定挂载 (Bind Mount)** 时:如果挂载的宿主机源路径尚未存在,`-v` 会擅自将其自动创建为一个空目录;而 `--mount` 则会严格检查并直接报错。这能有效避免因路径拼写错误而在宿主机上留下垃圾目录(以及导致的容器访问空目录问题)。而对于本节的**数据卷 (Volume)** 挂载而言,两者在目标指定的卷不存在时皆会自动创建卷,产生的结果是**完全一致**的。 +> **提示**:官方更推荐使用 `--mount`。除了语法格式可读性更好之外,最重要的行为差异发生在 **绑定挂载 (Bind Mount)** 时:如果挂载的宿主机源路径尚未存在,`-v` 会擅自将其自动创建为一个空目录;而 `--mount` 则会严格检查并直接报错。这能有效避免因路径拼写错误而在宿主机上留下垃圾目录(以及导致的容器访问空目录问题)。而对于本节的 **数据卷 (Volume)** 挂载而言,两者在目标指定的卷不存在时皆会自动创建卷,产生的结果是 **完全一致** 的。 #### 只读挂载 diff --git a/08_data/8.2_bind-mounts.md b/08_data/8.2_bind-mounts.md index 257560c..137201e 100644 --- a/08_data/8.2_bind-mounts.md +++ b/08_data/8.2_bind-mounts.md @@ -74,10 +74,10 @@ $ docker run -d \ | 特性 | --mount | -v | |------|---------|-----| | 语法 | 键值对,更清晰 | 冒号分隔,更简洁 | -| 路径不存在时 | 直接报错 (Fail Fast) | 静默自动创建**目录** | +| 路径不存在时 | 直接报错 (Fail Fast) | 静默自动创建 **目录** | | 推荐程度 | ✅ 推荐 | 常用 | -> **⚠️ 陷阱**:如果不小心挂载了一个不存在的宿主机路径,使用 `-v` 会在宿主机上静默创建一个**空目录**(即使你本来想挂载的是一个文件),这常常会导致权限错误或应用无法正常读取。这也正是为什么 Docker 官方更推荐使用 `--mount` 的原因:它会遵循“Fail Fast”原则直接报错,避免弄巧成拙。 +> **⚠️ 陷阱**:如果不小心挂载了一个不存在的宿主机路径,使用 `-v` 会在宿主机上静默创建一个 **空目录**(即使你本来想挂载的是一个文件),这常常会导致权限错误或应用无法正常读取。这也正是为什么 Docker 官方更推荐使用 `--mount` 的原因:它会遵循“Fail Fast”原则直接报错,避免弄巧成拙。 --- diff --git a/09_network/9.1_dns.md b/09_network/9.1_dns.md index 38357a1..04bba74 100644 --- a/09_network/9.1_dns.md +++ b/09_network/9.1_dns.md @@ -9,7 +9,7 @@ Docker 1.10.0 以后,内建了一个 DNS 服务器,使得容器可以直接 Docker 容器的 DNS 配置有两种情况: 1. **默认 Bridge 网络**:继承宿主机的 DNS 配置 (`/etc/resolv.conf`)。 -2. **自定义网络** (推荐):使用 Docker 嵌入式 DNS 服务器 (Embedded DNS),支持通过 **容器名** 进行服务发现。 +2. **自定义网络**(推荐):使用 Docker 嵌入式 DNS 服务器 (Embedded DNS),支持通过 **容器名** 进行服务发现。 --- diff --git a/10_buildx/10.2_buildx.md b/10_buildx/10.2_buildx.md index f231ac2..9b94d34 100644 --- a/10_buildx/10.2_buildx.md +++ b/10_buildx/10.2_buildx.md @@ -41,11 +41,11 @@ $ docker buildx build --sbom=true -t myimage . > **⚠️ 注意与失败模式**: > 要使 SBOM (或其它 attestation 元数据) 成功附着并可见,对底层的存储格式有前置要求:默认的 classic image store 不支持 manifest list/index 这种存放 attestation 的结构。 > -> 如果只简单运行上述命令,你可能会面临**“命令成功执行,但本地镜像中看不到 SBOM”**的体会落差。 +> 如果只简单运行上述命令,你可能会面临 **“命令成功执行,但本地镜像中看不到 SBOM”** 的体会落差。 > > **正确的解决路径有两条**: > 1. 在 Docker 守护进程中启用 `containerd image store` 特性(现代 Docker Desktop 默认推荐)。 -> 2. 或者使用 `docker-container` driver 的构建器,并直接**加上 `--push` 参数**将产物推送到远端支持 OCI 的镜像仓库,仓库会正确保存这些元数据。 +> 2. 或者使用 `docker-container` driver 的构建器,并直接 **加上 `--push` 参数** 将产物推送到远端支持 OCI 的镜像仓库,仓库会正确保存这些元数据。 ### 10.2.2 官方文档 diff --git a/17_ecosystem/17.1_coreos_intro.md b/17_ecosystem/17.1_coreos_intro.md index 20a2fad..00309b0 100644 --- a/17_ecosystem/17.1_coreos_intro.md +++ b/17_ecosystem/17.1_coreos_intro.md @@ -21,4 +21,3 @@ FCOS 使用 rpm-ostree 系统进行事务性升级。无需像 yum 升级那样 #### 容器工具 对于诸如构建,复制和其他管理容器的任务,FCOS 用一组容器工具代替了 **Docker CLI**。**podman CLI** 工具支持许多容器运行时功能,例如运行,启动,停止,列出和删除容器和镜像。**skopeo CLI** 工具可以复制,认证和签名镜像。您还可以使用 **crictl CLI** 工具来处理 CRI-O 容器引擎中的容器和镜像。 - diff --git a/17_ecosystem/17.3_podman.md b/17_ecosystem/17.3_podman.md index 057e0b6f036ae7595be8cebbef5c79cb243cdf33..e0f3c9c66b7cde25c8eacf90ded4cc73fcf23df3 100644 GIT binary patch delta 18 Zcmca4d{KCU0Xu`Uzl*CO!$yl)oB%i>1!({P delta 19 acmca8d`WnM0Y^eXeoAg)UcyH6S)2e%*#}$z diff --git a/18_security/18.1_kernel_ns.md b/18_security/18.1_kernel_ns.md index 25ed1d2..e6e6ccd 100644 --- a/18_security/18.1_kernel_ns.md +++ b/18_security/18.1_kernel_ns.md @@ -1,6 +1,6 @@ ## 18.1 内核命名空间 -命名空间 (Namespace) 是 Linux 容器隔离的基础,它确保了容器内的进程无法直接干扰主机或其他容器。虽然在本书第 12 章中我们已经从底层实现的角度介绍了 Namespace,但在本节中,我们将重点探讨其**安全意义**及相关配置。 +命名空间 (Namespace) 是 Linux 容器隔离的基础,它确保了容器内的进程无法直接干扰主机或其他容器。虽然在本书第 12 章中我们已经从底层实现的角度介绍了 Namespace,但在本节中,我们将重点探讨其 **安全意义** 及相关配置。 ### 18.1.1 隔离的安全本质 diff --git a/18_security/18.2_control_group.md b/18_security/18.2_control_group.md index fb00435..17eda8a 100644 --- a/18_security/18.2_control_group.md +++ b/18_security/18.2_control_group.md @@ -1,6 +1,6 @@ ## 18.2 控制组 -控制组 (Cgroups) 是 Linux 容器机制的另外一个关键组件。如果说命名空间 (Namespace) 决定了容器能**看到**什么,那么控制组就决定了容器能**使用**多少资源。 +控制组 (Cgroups) 是 Linux 容器机制的另外一个关键组件。如果说命名空间 (Namespace) 决定了容器能 **看到** 什么,那么控制组就决定了容器能 **使用** 多少资源。 在安全领域中,资源的不可用性本身就是一种安全威胁。控制组负责实现资源的审计和限制,这对于抵御资源耗尽型攻击(如拒绝服务攻击 DoS)至关重要。 @@ -17,7 +17,7 @@ ### 18.2.2 核心资源限制实战 -为了确保多租户平台(如公有或私有的 PaaS 平台)的稳定性,或者在生产环境防止服务级联故障,我们要养成在启动容器时**显式声明资源上限**的习惯。 +为了确保多租户平台(如公有或私有的 PaaS 平台)的稳定性,或者在生产环境防止服务级联故障,我们要养成在启动容器时 **显式声明资源上限** 的习惯。 #### 1. 内存限制 diff --git a/18_security/18.3_daemon_sec.md b/18_security/18.3_daemon_sec.md index 4aed401..6b76bec 100644 --- a/18_security/18.3_daemon_sec.md +++ b/18_security/18.3_daemon_sec.md @@ -83,4 +83,4 @@ $ docker version ### 18.3.4 结语 -保障 Docker 服务端的安全主要是做减法:关闭不必要的网络监听点,严管 Socket 访问权限。而一旦基础系统条件允许,**毫不犹豫地在生产环境启用 Rootless 模式**将是一项划算的安全加固选择。 +保障 Docker 服务端的安全主要是做减法:关闭不必要的网络监听点,严管 Socket 访问权限。而一旦基础系统条件允许,**毫不犹豫地在生产环境启用 Rootless 模式** 将是一项划算的安全加固选择。 diff --git a/18_security/18.4_kernel_capability.md b/18_security/18.4_kernel_capability.md index 1448053..52f76ae 100644 --- a/18_security/18.4_kernel_capability.md +++ b/18_security/18.4_kernel_capability.md @@ -6,7 +6,7 @@ ### 18.4.1 容器内置的 Capability 白名单 -在默认情况下,即便一个容器是在以 `root` 用户运行,Docker 也只为其内核授予了所有可用能力中的**一小部分“白名单”能力**。 +在默认情况下,即便一个容器是在以 `root` 用户运行,Docker 也只为其内核授予了所有可用能力中的 **一小部分“白名单”能力**。 常见的 Linux Capabilities 包含: - `CAP_CHOWN`: 修改文件所有者。 @@ -14,7 +14,7 @@ - `CAP_NET_ADMIN`: 网络管理的最高权限(例如调整路由配置,设置防火墙规则等)。 - `CAP_SYS_ADMIN`: 被誉为“Linux 内核的特权网管”,允许各种高危操作(挂载磁盘、访问敏感设备等)。 -为了在**“最小特权原则”**的指导下加强安全,Docker 默认**移除了**大量可能导致容器大范围破坏宿主机的能力,例如: +为了在 **“最小特权原则”** 的指导下加强安全,Docker 默认 **移除了** 大量可能导致容器大范围破坏宿主机的能力,例如: * 完全禁止了任何通过 `CAP_SYS_ADMIN` 进行的核心挂载或设备操作。 * 禁止修改内核模块。 * 禁止直接访问硬件套接字。 @@ -27,7 +27,7 @@ #### 实战场景一:构建极限安全的 Web 靶机 -假设你正在提供一个公共的 Web 容器。你不希望里面的任何恶意脚本修改进程权限或者创建设备节点,你可以通过命令先移除**所有**默认能力,然后再按需授权该守护进程一个仅仅能绑端口的能力。 +假设你正在提供一个公共的 Web 容器。你不希望里面的任何恶意脚本修改进程权限或者创建设备节点,你可以通过命令先移除 **所有** 默认能力,然后再按需授权该守护进程一个仅仅能绑端口的能力。 ```bash $ docker run -d \ @@ -56,7 +56,7 @@ $ docker run -it --rm \ 我们只授予了所需的网络管理控制(NET_ADMIN)和侦听底层套接字的权限(NET_RAW),而免去了赋予整个容器终极杀器 `--privileged` 参数。 > [!WARNING] -> 大量开发人员遇到了“权限遭到拒绝”的错误时,往往习惯性图省事添加 `--privileged` 这个核选项。但这将把**宿主机上一切特权和所有访问设备完全投射给容器内的根用户**,其危险性等价于根本没有做隔离!请务必查明进程出错的实际原因,精准施加必要的隔离 `CAP_*` 能力。 +> 大量开发人员遇到了“权限遭到拒绝”的错误时,往往习惯性图省事添加 `--privileged` 这个核选项。但这将把 **宿主机上一切特权和所有访问设备完全投射给容器内的根用户**,其危险性等价于根本没有做隔离!请务必查明进程出错的实际原因,精准施加必要的隔离 `CAP_*` 能力。 ### 18.4.3 总结 diff --git a/18_security/18.5_other_feature.md b/18_security/18.5_other_feature.md index 4abf7a7..472b6c6 100644 --- a/18_security/18.5_other_feature.md +++ b/18_security/18.5_other_feature.md @@ -85,4 +85,4 @@ Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0) ### 18.5.4 容器核心层基石结语 -到这里,Docker 为保障宿主和容器界限安全的几个护城河:从**资源剥离限制** (`Cgroups`) 到**进程/网络/身份蒙蔽** (`Namespace`)、到**特权能力回收** (`Capabilities`) 再到**内核强制策略拦截管制** (`Seccomp`/`AppArmor`) 已悉数交代完毕。虽然绝没有“100% 免疫网络穿刺的防线”,只要开发者牢记 **权限最小化原则** ,容器的堡垒就可以做到令攻击者望洋兴叹。 +到这里,Docker 为保障宿主和容器界限安全的几个护城河:从 **资源剥离限制**(`Cgroups`) 到 **进程/网络/身份蒙蔽**(`Namespace`)、到 **特权能力回收**(`Capabilities`) 再到 **内核强制策略拦截管制**(`Seccomp`/`AppArmor`) 已悉数交代完毕。虽然绝没有“100% 免疫网络穿刺的防线”,只要开发者牢记 **权限最小化原则** ,容器的堡垒就可以做到令攻击者望洋兴叹。 diff --git a/19_observability/summary.md b/19_observability/summary.md index 202a999..0ee6032 100644 --- a/19_observability/summary.md +++ b/19_observability/summary.md @@ -5,9 +5,9 @@ * **指标监控**:以 Prometheus + Grafana 为主,完成指标采集、存储与可视化。 * **日志管理**:以 EFK/ELK 为例,完成容器日志的集中采集、检索与分析。 -生产环境中,建议将“可观测性”当成一个完整闭环:**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**。 +生产环境中,建议将”可观测性”当成一个完整闭环:**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**。 -## 19.3 Docker 日志驱动 +## 扩展阅读:Docker 日志驱动 Docker 提供了多种日志驱动 (Log Driver),用于将容器标准输出的日志转发到不同后端。 diff --git a/21_case_devops/21.1_devops_workflow.md b/21_case_devops/21.1_devops_workflow.md index f893ac9..e167044 100644 --- a/21_case_devops/21.1_devops_workflow.md +++ b/21_case_devops/21.1_devops_workflow.md @@ -81,7 +81,7 @@ deploy_staging: 1. **不可变基础设施**:一旦镜像构建完成,在各个环境(Dev、Staging、Prod)中都应该使用同一个镜像 tag(通常是 commit hash),而不是重新构建。 2. **配置分离**:使用 ConfigMap 和 Secret 管理环境特定的配置,不要打包进镜像。 3. **应对 Docker Hub 限额 (Rate Limits)**: - - Docker Hub 对匿名拉取实施了严格的限制 (6小时内约100次)。若在 CI/CD 中频繁构建,极易触发 `toomanyrequests` 错误。 + - Docker Hub 对匿名拉取实施了严格的限制 (6 小时内约 100 次)。若在 CI/CD 中频繁构建,极易触发 `toomanyrequests` 错误。 - **最佳策略**: - 在流水线开头始终执行安全的身份认证 (使用 PAT,而非密码)。 - 将常用的基础镜像缓存到自建的 Harbor/Nexus,使用 Pull-Through Cache。 diff --git a/README.md b/README.md index 1d707a2..445f078 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ npx honkit serve

-

欢迎鼓励项目一杯 coffee~

+

欢迎鼓励项目一杯 coffee~

## Star History diff --git a/appendix/example_guidelines.md b/appendix/example_guidelines.md index 6ba443f..2767703 100644 --- a/appendix/example_guidelines.md +++ b/appendix/example_guidelines.md @@ -4,7 +4,7 @@ ## 1. 安全与凭据处理 -任何示例文档中都**严禁出现将凭据以明文形式直接传递给命令参数**的做法。 +任何示例文档中都 **严禁出现将凭据以明文形式直接传递给命令参数** 的做法。 * **错误示例**:`docker login -u myuser -p mysecretpassword` (这会导致密码泄露到历史记录及进程列表中) * **正确示例(交互式)**:推荐读者直接使用 `docker login` (优先使用官方 Device Code Flow)。 @@ -17,7 +17,7 @@ * **明确声明前置条件**:例如,“此功能需要开启 containerd image store” 或 “需要额外配置 `--push`”。 * **描述失败现象**:明确告诉读者,“如果你不这么配置,命令仍会提示成功,但产物将不可见/被丢弃”。 -## 3. 统一使用 "docker compose" 命令 +## 3. 统一使用 “docker compose” 命令 早期 Python 编写的 `docker-compose` (V1) 已停止支持。