diff --git a/02_basic_concept/2.2_container.md b/02_basic_concept/2.2_container.md index b10e505..6f422fc 100644 --- a/02_basic_concept/2.2_container.md +++ b/02_basic_concept/2.2_container.md @@ -18,16 +18,20 @@ flowchart TD subgraph NormalProcess ["普通进程"] direction TB - N1["• 与其他进程共享系统资源
• 可以看到其他进程
• 共享网络和文件系统"] + N1["• 共享系统资源
• 共享网络
• 共享文件系统"] end subgraph ContainerProcess ["容器进程 (运行在宿主机内核上)"] direction TB - C1["• 有自己的进程空间(看不到宿主机上的其他进程)
• 有自己的网络(独立 IP、端口)
• 有自己的文件系统(独立的 root 目录)
• 有自己的用户(容器内的 root ≠ 宿主机的 root)"] + C1["• 独立进程空间
• 独立网络环境
• 独立文件系统
• 独立用户空间"] end ``` -这种隔离是通过 Linux 内核的 **Namespace** 技术实现的。 +这种隔离是通过 Linux 内核的 **Namespace** 技术实现的。具体表现为: +- **进程空间**:容器看不到宿主机上的其他进程。 +- **网络**:容器拥有独立的 IP、端口等网络资源。 +- **文件系统**:容器拥有独立的 root 目录。 +- **用户**:容器内的 root 用户不等于宿主机的 root 用户。 ### 2.2.3 容器 vs 虚拟机:核心区别 diff --git a/03_install/3.7_mac.md b/03_install/3.7_mac.md index 090429b..6ce5832 100644 --- a/03_install/3.7_mac.md +++ b/03_install/3.7_mac.md @@ -27,13 +27,13 @@ $ brew install --cask docker 如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://www.docker.com/blog/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可 (其间需要输入用户密码)。 -![图](../_images/install-mac-dmg.png) +![图](../_images/install-mac-dmg.jpg) ### 3.7.3 运行 从应用中找到 Docker 图标并点击运行。 -![图](../_images/install-mac-apps.png) +![图](../_images/install-mac-apps.jpg) 运行之后,会在右上角菜单栏看到多了一个鲸鱼图标,这个图标表明了 Docker 的运行状态。 diff --git a/04_image/4.5_build.md b/04_image/4.5_build.md index f10fa94..2f8dd6b 100644 --- a/04_image/4.5_build.md +++ b/04_image/4.5_build.md @@ -64,7 +64,7 @@ FROM scratch RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html ``` -* *exec* 格式:`RUN ["可执行文件", "参数1", "参数2"]`,这更像是函数调用中的格式。 +* *exec* 格式:`RUN [“可执行文件”, “参数1”, “参数2”]`,这更像是函数调用中的格式。 Dockerfile 中每一个指令都会建立一层,`RUN` 也不例外。每一个 `RUN` 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,`commit` 这一层的修改,构成新的镜像。 diff --git a/07_dockerfile/7.4_cmd.md b/07_dockerfile/7.4_cmd.md index f5070a4..83588ef 100644 --- a/07_dockerfile/7.4_cmd.md +++ b/07_dockerfile/7.4_cmd.md @@ -14,9 +14,9 @@ CMD 有三种格式: | 格式 | 语法 | 推荐程度 | |------|------|---------| -| **exec 格式**| `CMD ["可执行文件", "参数1", "参数2"]` | ✅**推荐** | +| **exec 格式**| `CMD [“可执行文件”, “参数1”, “参数2”]` | ✅**推荐** | | **shell 格式** | `CMD 命令 参数1 参数2` | ⚠️ 简单场景 | -| **参数格式** | `CMD ["参数1", "参数2"]` | 配合 ENTRYPOINT | +| **参数格式** | `CMD [“参数1”, “参数2”]` | 配合 ENTRYPOINT | #### exec 格式 (推荐) diff --git a/07_dockerfile/7.5_entrypoint.md b/07_dockerfile/7.5_entrypoint.md index 9daabfd..f93a86a 100644 --- a/07_dockerfile/7.5_entrypoint.md +++ b/07_dockerfile/7.5_entrypoint.md @@ -12,7 +12,7 @@ | 格式 | 语法 | 推荐程度 | |------|------|---------| -| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | ✅**推荐** | +| **exec 格式**| `ENTRYPOINT [“可执行文件”, “参数1”]` | ✅**推荐** | | **shell 格式** | `ENTRYPOINT 命令 参数` | ⚠️ 不推荐 | ```docker diff --git a/07_dockerfile/summary.md b/07_dockerfile/summary.md index 68ba6f5..ad17158 100644 --- a/07_dockerfile/summary.md +++ b/07_dockerfile/summary.md @@ -127,7 +127,7 @@ | 要点 | 说明 | |------|------| | **作用** | 指定容器启动时的默认命令 | -| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` | +| **推荐格式** | exec 格式 `CMD [“程序”, “参数”]` | | **覆盖方式** | `docker run image 新命令` | | **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 | | **核心原则** | 应用必须在前台运行 | diff --git a/08_data/8.2_bind-mounts.md b/08_data/8.2_bind-mounts.md index 94ead63..dcbe234 100644 --- a/08_data/8.2_bind-mounts.md +++ b/08_data/8.2_bind-mounts.md @@ -7,18 +7,24 @@ Bind Mount (绑定挂载) 将 **宿主机的目录或文件** 直接挂载到容 ```mermaid flowchart LR subgraph Host ["宿主机"] - direction TB - Dir1["/home/user/code/
├── index.html
├── style.css
└── app.js"] + Dir1["/home/user/code/"] end subgraph Container ["容器"] - direction TB - Dir2["/usr/share/nginx/html/
(同一份文件)"] + Dir2["/usr/share/nginx/html/"] end Dir1 <-->|Bind Mount| Dir2 ``` +目录结构(同一份文件): +```text +/home/user/code/ (或 /usr/share/nginx/html/) +├── index.html +├── style.css +└── app.js +``` + --- ### 8.2.2 Bind Mount vs Volume diff --git a/17_ecosystem/README.md b/17_ecosystem/README.md index dd7079d..783bfc2 100644 --- a/17_ecosystem/README.md +++ b/17_ecosystem/README.md @@ -4,3 +4,8 @@ - **Fedora CoreOS**:专为容器化工作负载设计的操作系统。 - **Podman**:兼容 Docker CLI 的下一代无守护进程容器引擎。 +- **Buildah**:无需守护进程的 OCI 容器镜像构建工具。 +- **Skopeo**:远程检查和管理容器镜像的利器。 +- **containerd**:作为现代容器生态基石的核心容器运行时。 +- **安全容器运行时**:通过提供更强隔离性来保证安全的技术方案(如 Kata Containers、gVisor)。 +- **WebAssembly**:一种极具潜力的轻量级跨平台二进制指令格式。 diff --git a/17_ecosystem/summary.md b/17_ecosystem/summary.md index de1bcb3..d9e8405 100644 --- a/17_ecosystem/summary.md +++ b/17_ecosystem/summary.md @@ -5,9 +5,14 @@ Docker 并非容器生态的唯一选择,了解其他工具有助于根据场 | 项目 | 定位 | 特点 | |------|------|------| | **Fedora CoreOS** | 容器化操作系统 | 自动更新、不可变基础设施、专为运行容器设计 | -| **Podman** | 容器引擎 | 无守护进程、兼容 Docker CLI、支持 Rootless 模式 | +| **Podman** | 容器管理引擎 | 无守护进程、兼容 Docker CLI、支持 Rootless 模式、支持原生 Pod | +| **Buildah** | 镜像构建工具 | Daemonless 工作模式、灵活的脚本化构建能力 | +| **Skopeo** | 镜像仓库管理 | 无需拉取即可检查远端镜像、跨仓库/格式无缝迁移镜像 | +| **containerd** | 核心底层运行时 | 稳定高效、符合 CRI 规范、是 Docker 的基石之一 | +| **安全容器** | 强隔离沙箱运行 | 利用轻量级虚拟机 (Kata) 或用户态内核 (gVisor) 防止越狱,极其安全 | +| **Wasm** | 新型工作负载 | 体积极小、冷启动超快且具备跨平台及高度特征化沙盒能力的后端架构新方向 | -### 17.4.1 Podman vs Docker +### Podman vs Docker 两者的主要区别: @@ -19,7 +24,7 @@ Docker 并非容器生态的唯一选择,了解其他工具有助于根据场 | **Pod 支持** | 不支持 | 原生支持 Pod 概念 | | **Compose** | docker compose | podman-compose 或兼容模式 | -### 17.4.2 延伸阅读 +### 延伸阅读 - [底层实现](../12_implementation/README.md):容器技术的内核基础 - [安全](../18_security/README.md):容器安全实践 diff --git a/19_observability/summary.md b/19_observability/summary.md index 3415d26..202a999 100644 --- a/19_observability/summary.md +++ b/19_observability/summary.md @@ -1,4 +1,4 @@ -# 本章小结 +## 本章小结 本章从两个维度介绍了容器可观测性: diff --git a/21_case_devops/21.2_github_actions.md b/21_case_devops/21.2_github_actions.md index 273aea1..c99dfa3 100644 --- a/21_case_devops/21.2_github_actions.md +++ b/21_case_devops/21.2_github_actions.md @@ -1,4 +1,4 @@ -# 21.2 GitHub Actions +## 21.2 GitHub Actions GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。 diff --git a/21_case_devops/21.3_drone.md b/21_case_devops/21.3_drone.md index cb00eee..51d53ce 100644 --- a/21_case_devops/21.3_drone.md +++ b/21_case_devops/21.3_drone.md @@ -1,4 +1,4 @@ -# 21.3 Drone +## 21.3 Drone 基于 `Docker` 的 `CI/CD` 工具 `Drone`,所有编译、测试的流程都在容器中进行。 diff --git a/21_case_devops/21.4_drone_demo.md b/21_case_devops/21.4_drone_demo.md index 5efe2ac..b31f799 100644 --- a/21_case_devops/21.4_drone_demo.md +++ b/21_case_devops/21.4_drone_demo.md @@ -1,4 +1,4 @@ -# 21.4 Drone Demo +## 21.4 Drone Demo ## 21.4.1 Demo 项目说明 diff --git a/21_case_devops/21.5_ide.md b/21_case_devops/21.5_ide.md index b217ff0..972d5e1 100644 --- a/21_case_devops/21.5_ide.md +++ b/21_case_devops/21.5_ide.md @@ -1,4 +1,4 @@ -# 21.5 在 IDE 中使用 Docker +## 21.5 在 IDE 中使用 Docker 使用 IDE 进行开发,往往要求本地安装好工具链。一些 IDE 支持 Docker 容器中的工具链,这样充分利用了 Docker 的优点,而无需在本地安装。 diff --git a/SUMMARY.md b/SUMMARY.md index c14ff91..b53f774 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -148,6 +148,11 @@ * [17.1 Fedora CoreOS 简介](17_ecosystem/17.1_coreos_intro.md) * [17.2 Fedora CoreOS 安装](17_ecosystem/17.2_coreos_install.md) * [17.3 podman - 下一代 Linux 容器工具](17_ecosystem/17.3_podman.md) + * [17.4 Buildah - 容器镜像构建工具](17_ecosystem/17.4_buildah.md) + * [17.5 Skopeo - 容器镜像管理工具](17_ecosystem/17.5_skopeo.md) + * [17.6 containerd - 核心容器运行时](17_ecosystem/17.6_containerd.md) + * [17.7 安全容器运行时](17_ecosystem/17.7_secure_runtime.md) + * [17.8 WebAssembly 与容器](17_ecosystem/17.8_wasm.md) * [本章小结](17_ecosystem/summary.md) ## 第四部分:实战篇 @@ -199,3 +204,4 @@ * [附录四:Dockerfile 最佳实践](appendix/best_practices.md) * [附录五:如何调试 Docker](appendix/debug.md) * [附录六:资源链接](appendix/resources.md) + * [附录七:术语表](appendix/glossary.md) diff --git a/_images/cmd_logic.jpg b/_images/cmd_logic.jpg new file mode 100644 index 0000000..d686f28 Binary files /dev/null and b/_images/cmd_logic.jpg differ diff --git a/_images/cmd_logic.png b/_images/cmd_logic.png deleted file mode 100644 index d8deeb2..0000000 Binary files a/_images/cmd_logic.png and /dev/null differ diff --git a/_images/install-mac-apps.jpg b/_images/install-mac-apps.jpg new file mode 100644 index 0000000..4388f41 Binary files /dev/null and b/_images/install-mac-apps.jpg differ diff --git a/_images/install-mac-apps.png b/_images/install-mac-apps.png deleted file mode 100644 index 206ecd1..0000000 Binary files a/_images/install-mac-apps.png and /dev/null differ diff --git a/_images/install-mac-dmg.jpg b/_images/install-mac-dmg.jpg new file mode 100644 index 0000000..d7839ce Binary files /dev/null and b/_images/install-mac-dmg.jpg differ diff --git a/_images/install-mac-dmg.png b/_images/install-mac-dmg.png deleted file mode 100644 index 5c251db..0000000 Binary files a/_images/install-mac-dmg.png and /dev/null differ diff --git a/appendix/README.md b/appendix/README.md index 7159aff..a0c0fce 100644 --- a/appendix/README.md +++ b/appendix/README.md @@ -10,5 +10,4 @@ * [**Dockerfile 最佳实践**](best_practices.md):提供编写高效、安全 Dockerfile 的指导原则。 * [**如何调试 Docker**](debug.md):介绍 Docker 调试技巧和工具。 * [**资源链接**](resources.md):推荐更多 Docker 相关的学习资源。 -* **术语词表 (出版统一版)**:统一全书中英文术语、缩写与命令写法。(本仓库暂未收录对应文件) -* **出版清稿规范 (图号与章节风格)**:统一图号命名、图题写法与章节风格。(本仓库暂未收录对应文件) +* [**术语词表**](glossary.md):统一全书中英文术语、缩写与命令写法。 diff --git a/appendix/best_practices.md b/appendix/best_practices.md index 9a79822..b20c007 100644 --- a/appendix/best_practices.md +++ b/appendix/best_practices.md @@ -174,9 +174,9 @@ RUN apt-get update && apt-get install -y \ #### CMD -`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ["executable", "param1", "param2"...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务 (比如 `Apache`),你可能会执行类似于 `CMD ["apache2", "-DFOREGROUND"]` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。 +`CMD` 指令用于执行目标镜像中包含的软件,可以包含参数。`CMD` 大多数情况下都应该以 `CMD ['executable', 'param1', 'param2'...]` 的形式使用。因此,如果创建镜像的目的是为了部署某个服务 (比如 `Apache`),你可能会执行类似于 `CMD ['apache2', '-DFOREGROUND']` 形式的命令。我们建议任何服务镜像都使用这种形式的命令。 -多数情况下,`CMD` 都需要一个交互式的 `shell` (bash,Python,perl 等),例如 `CMD ["perl", "-de0"]`,或者 `CMD ["PHP", "-a"]`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。 +多数情况下,`CMD` 都需要一个交互式的 `shell` (bash,Python,perl 等),例如 `CMD ['perl', '-de0']`,或者 `CMD ['PHP', '-a']`。使用这种形式意味着,当你执行类似 `docker run -it python` 时,你会进入一个准备好的 `shell` 中。`CMD` 应该在极少的情况下才能以 `CMD ['param', 'param']` 的形式与 `ENTRYPOINT` 协同使用,除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉。 #### EXPOSE diff --git a/appendix/command/docker.md b/appendix/command/docker.md index 397c5c1..44ace71 100644 --- a/appendix/command/docker.md +++ b/appendix/command/docker.md @@ -66,7 +66,7 @@ 如图 16-1 所示,Docker 常用客户端命令可按功能分组理解。 -![Docker 命令总结](../../_images/cmd_logic.png) +![Docker 命令总结](../../_images/cmd_logic.jpg) 图 16-1 Docker 客户端命令分类示意图 diff --git a/format_report.txt b/format_report.txt deleted file mode 100644 index 6e41aff..0000000 --- a/format_report.txt +++ /dev/null @@ -1 +0,0 @@ -Total issues found: 0