mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 20:04:36 +00:00
Reduce image size
This commit is contained in:
@@ -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 虚拟机:核心区别
|
||||
|
||||
|
||||
@@ -27,13 +27,13 @@ $ brew install --cask docker
|
||||
|
||||
如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://www.docker.com/blog/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可 (其间需要输入用户密码)。
|
||||
|
||||

|
||||

|
||||
|
||||
### 3.7.3 运行
|
||||
|
||||
从应用中找到 Docker 图标并点击运行。
|
||||
|
||||

|
||||

|
||||
|
||||
运行之后,会在右上角菜单栏看到多了一个鲸鱼图标,这个图标表明了 Docker 的运行状态。
|
||||
|
||||
|
||||
@@ -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` 这一层的修改,构成新的镜像。
|
||||
|
||||
|
||||
@@ -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 格式 (推荐)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
| 格式 | 语法 | 推荐程度 |
|
||||
|------|------|---------|
|
||||
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | ✅**推荐** |
|
||||
| **exec 格式**| `ENTRYPOINT [“可执行文件”, “参数1”]` | ✅**推荐** |
|
||||
| **shell 格式** | `ENTRYPOINT 命令 参数` | ⚠️ 不推荐 |
|
||||
|
||||
```docker
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 指定容器启动时的默认命令 |
|
||||
| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` |
|
||||
| **推荐格式** | exec 格式 `CMD [“程序”, “参数”]` |
|
||||
| **覆盖方式** | `docker run image 新命令` |
|
||||
| **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
|
||||
| **核心原则** | 应用必须在前台运行 |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,3 +4,8 @@
|
||||
|
||||
- **Fedora CoreOS**:专为容器化工作负载设计的操作系统。
|
||||
- **Podman**:兼容 Docker CLI 的下一代无守护进程容器引擎。
|
||||
- **Buildah**:无需守护进程的 OCI 容器镜像构建工具。
|
||||
- **Skopeo**:远程检查和管理容器镜像的利器。
|
||||
- **containerd**:作为现代容器生态基石的核心容器运行时。
|
||||
- **安全容器运行时**:通过提供更强隔离性来保证安全的技术方案(如 Kata Containers、gVisor)。
|
||||
- **WebAssembly**:一种极具潜力的轻量级跨平台二进制指令格式。
|
||||
|
||||
@@ -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):容器安全实践
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 本章小结
|
||||
## 本章小结
|
||||
|
||||
本章从两个维度介绍了容器可观测性:
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 21.2 GitHub Actions
|
||||
## 21.2 GitHub Actions
|
||||
|
||||
GitHub [Actions](https://github.com/features/actions) 是 GitHub 推出的一款 CI/CD 工具。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 21.3 Drone
|
||||
## 21.3 Drone
|
||||
|
||||
基于 `Docker` 的 `CI/CD` 工具 `Drone`,所有编译、测试的流程都在容器中进行。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 21.4 Drone Demo
|
||||
## 21.4 Drone Demo
|
||||
|
||||
## 21.4.1 Demo 项目说明
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 21.5 在 IDE 中使用 Docker
|
||||
## 21.5 在 IDE 中使用 Docker
|
||||
|
||||
使用 IDE 进行开发,往往要求本地安装好工具链。一些 IDE 支持 Docker 容器中的工具链,这样充分利用了 Docker 的优点,而无需在本地安装。
|
||||
|
||||
|
||||
@@ -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
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 |
BIN
_images/install-mac-apps.jpg
Normal file
BIN
_images/install-mac-apps.jpg
Normal file
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
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 |
@@ -10,5 +10,4 @@
|
||||
* [**Dockerfile 最佳实践**](best_practices.md):提供编写高效、安全 Dockerfile 的指导原则。
|
||||
* [**如何调试 Docker**](debug.md):介绍 Docker 调试技巧和工具。
|
||||
* [**资源链接**](resources.md):推荐更多 Docker 相关的学习资源。
|
||||
* **术语词表 (出版统一版)**:统一全书中英文术语、缩写与命令写法。(本仓库暂未收录对应文件)
|
||||
* **出版清稿规范 (图号与章节风格)**:统一图号命名、图题写法与章节风格。(本仓库暂未收录对应文件)
|
||||
* [**术语词表**](glossary.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
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
如图 16-1 所示,Docker 常用客户端命令可按功能分组理解。
|
||||
|
||||

|
||||

|
||||
|
||||
图 16-1 Docker 客户端命令分类示意图
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Total issues found: 0
|
||||
Reference in New Issue
Block a user