Reduce image size

This commit is contained in:
Baohua Yang
2026-02-27 19:23:28 -08:00
parent bbfc9d34ff
commit 19aaad591c
25 changed files with 52 additions and 28 deletions

View File

@@ -18,16 +18,20 @@
flowchart TD
subgraph NormalProcess ["普通进程"]
direction TB
N1["• 与其他进程共享系统资源<br/>• 可以看到其他进程<br/>• 共享网络和文件系统"]
N1["• 共享系统资源<br/>• 共享网络<br/>• 共享文件系统"]
end
subgraph ContainerProcess ["容器进程 (运行在宿主机内核上)"]
direction TB
C1["• 有自己的进程空间(看不到宿主机上的其他进程)<br/>• 有自己的网络(独立 IP、端口<br/>• 有自己的文件系统(独立的 root 目录)<br/>• 有自己的用户(容器内的 root ≠ 宿主机的 root"]
C1["• 独立进程空间<br/>• 独立网络环境<br/>• 独立文件系统<br/>• 独立用户空间"]
end
```
这种隔离是通过 Linux 内核的 **Namespace** 技术实现的
这种隔离是通过 Linux 内核的 **Namespace** 技术实现的具体表现为
- **进程空间**容器看不到宿主机上的其他进程
- **网络**容器拥有独立的 IP端口等网络资源
- **文件系统**容器拥有独立的 root 目录
- **用户**容器内的 root 用户不等于宿主机的 root 用户
### 2.2.3 容器 vs 虚拟机核心区别

View File

@@ -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 的运行状态

View File

@@ -64,7 +64,7 @@ FROM scratch
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
* *exec* 格式`RUN ["可执行文件", "参数1", "参数2"]`这更像是函数调用中的格式
* *exec* 格式`RUN [可执行文件, 参数1, 参数2]`这更像是函数调用中的格式
Dockerfile 中每一个指令都会建立一层`RUN` 也不例外每一个 `RUN` 的行为就和刚才我们手工建立镜像的过程一样新建立一层在其上执行这些命令执行结束后`commit` 这一层的修改构成新的镜像

View File

@@ -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 格式 (推荐)

View File

@@ -12,7 +12,7 @@
| 格式 | 语法 | 推荐程度 |
|------|------|---------|
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | **推荐** |
| **exec 格式**| `ENTRYPOINT [可执行文件, 参数1]` | **推荐** |
| **shell 格式** | `ENTRYPOINT 命令 参数` | 不推荐 |
```docker

View File

@@ -127,7 +127,7 @@
| 要点 | 说明 |
|------|------|
| **作用** | 指定容器启动时的默认命令 |
| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` |
| **推荐格式** | exec 格式 `CMD [程序, 参数]` |
| **覆盖方式** | `docker run image 新命令` |
| ** ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
| **核心原则** | 应用必须在前台运行 |

View File

@@ -7,18 +7,24 @@ Bind Mount (绑定挂载) 将 **宿主机的目录或文件** 直接挂载到容
```mermaid
flowchart LR
subgraph Host ["宿主机"]
direction TB
Dir1["/home/user/code/<br/>├── index.html<br/>├── style.css<br/>└── app.js"]
Dir1["/home/user/code/"]
end
subgraph Container ["容器"]
direction TB
Dir2["/usr/share/nginx/html/<br/>(同一份文件)"]
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

View File

@@ -4,3 +4,8 @@
- **Fedora CoreOS**专为容器化工作负载设计的操作系统
- **Podman**兼容 Docker CLI 的下一代无守护进程容器引擎
- **Buildah**无需守护进程的 OCI 容器镜像构建工具
- **Skopeo**远程检查和管理容器镜像的利器
- **containerd**作为现代容器生态基石的核心容器运行时
- **安全容器运行时**通过提供更强隔离性来保证安全的技术方案 Kata ContainersgVisor
- **WebAssembly**一种极具潜力的轻量级跨平台二进制指令格式

View File

@@ -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)容器安全实践

View File

@@ -1,4 +1,4 @@
# 本章小结
## 本章小结
本章从两个维度介绍了容器可观测性

View File

@@ -1,4 +1,4 @@
# 21.2 GitHub Actions
## 21.2 GitHub Actions
GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。

View File

@@ -1,4 +1,4 @@
# 21.3 Drone
## 21.3 Drone
基于 `Docker` `CI/CD` 工具 `Drone`所有编译测试的流程都在容器中进行

View File

@@ -1,4 +1,4 @@
# 21.4 Drone Demo
## 21.4 Drone Demo
## 21.4.1 Demo 项目说明

View File

@@ -1,4 +1,4 @@
# 21.5 IDE 中使用 Docker
## 21.5 IDE 中使用 Docker
使用 IDE 进行开发往往要求本地安装好工具链一些 IDE 支持 Docker 容器中的工具链这样充分利用了 Docker 的优点而无需在本地安装

View File

@@ -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)

BIN
_images/cmd_logic.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 660 KiB

BIN
_images/install-mac-dmg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 KiB

View File

@@ -10,5 +10,4 @@
* [**Dockerfile 最佳实践**](best_practices.md)提供编写高效安全 Dockerfile 的指导原则
* [**如何调试 Docker**](debug.md)介绍 Docker 调试技巧和工具
* [**资源链接**](resources.md)推荐更多 Docker 相关的学习资源
* **术语词表 (出版统一版)**统一全书中英文术语缩写与命令写法(本仓库暂未收录对应文件)
* **出版清稿规范 (图号与章节风格)**统一图号命名图题写法与章节风格(本仓库暂未收录对应文件)
* [**术语词表**](glossary.md)统一全书中英文术语缩写与命令写法

View File

@@ -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` (bashPythonperl )例如 `CMD ["perl", "-de0"]`或者 `CMD ["PHP", "-a"]`使用这种形式意味着当你执行类似 `docker run -it python` 你会进入一个准备好的 `shell` `CMD` 应该在极少的情况下才能以 `CMD ["param", "param"]` 的形式与 `ENTRYPOINT` 协同使用除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉
多数情况下`CMD` 都需要一个交互式的 `shell` (bashPythonperl )例如 `CMD ['perl', '-de0']`或者 `CMD ['PHP', '-a']`使用这种形式意味着当你执行类似 `docker run -it python` 你会进入一个准备好的 `shell` `CMD` 应该在极少的情况下才能以 `CMD ['param', 'param']` 的形式与 `ENTRYPOINT` 协同使用除非你和你的镜像使用者都对 `ENTRYPOINT` 的工作方式十分熟悉
#### EXPOSE

View File

@@ -66,7 +66,7 @@
如图 16-1 所示Docker 常用客户端命令可按功能分组理解
![Docker 命令总结](../../_images/cmd_logic.png)
![Docker 命令总结](../../_images/cmd_logic.jpg)
16-1 Docker 客户端命令分类示意图

View File

@@ -1 +0,0 @@
Total issues found: 0