Fix missing links

This commit is contained in:
Baohua Yang
2026-02-22 13:40:20 -08:00
parent 92ea9623b2
commit e57704271d
54 changed files with 228 additions and 224 deletions

View File

@@ -80,7 +80,7 @@ Docker 使用 [Go 语言](https://golang.google.cn/)开发,基于 Linux 内核
- **[Cgroups](https://zh.wikipedia.org/wiki/Cgroups)**:实现资源限制 (CPU、内存、I/O 等) - **[Cgroups](https://zh.wikipedia.org/wiki/Cgroups)**:实现资源限制 (CPU、内存、I/O 等)
- **[Union FS](https://en.wikipedia.org/wiki/Union_mount)**:实现分层存储 (如 OverlayFS) - **[Union FS](https://en.wikipedia.org/wiki/Union_mount)**:实现分层存储 (如 OverlayFS)
> 如果你对这些底层技术感兴趣可以阅读本书的[底层实现](../11_implementation/README.md)章节 > 如果你对这些底层技术感兴趣可以阅读本书的[底层实现](../12_implementation/README.md)章节
#### 概述 #### 概述

View File

@@ -79,7 +79,7 @@ flowchart TD
除了解决上述痛点Docker 还拥有诸多显著的技术优势包括环境一致性秒级启动高效的资源利用等 除了解决上述痛点Docker 还拥有诸多显著的技术优势包括环境一致性秒级启动高效的资源利用等
#### 1环境一致性 #### 1. 环境一致性
Docker 镜像包含了应用运行所需的 **一切**代码运行时系统工具配置这意味着 Docker 镜像包含了应用运行所需的 **一切**代码运行时系统工具配置这意味着
@@ -97,7 +97,7 @@ $ docker compose up
... ...
``` ```
#### 2秒级启动 #### 2. 秒级启动
传统虚拟机启动需要几分钟 (引导操作系统) Docker 容器启动通常只需要 **几秒甚至几百毫秒** 传统虚拟机启动需要几分钟 (引导操作系统) Docker 容器启动通常只需要 **几秒甚至几百毫秒**
@@ -115,7 +115,7 @@ $ docker compose up
- **弹性扩容**流量高峰时能快速启动更多实例 - **弹性扩容**流量高峰时能快速启动更多实例
- **开发体验**快速重启服务进行调试 - **开发体验**快速重启服务进行调试
#### 3资源效率 #### 3. 资源效率
Docker 容器共享宿主机内核无需为每个应用运行完整的操作系统 Docker 容器共享宿主机内核无需为每个应用运行完整的操作系统
@@ -146,7 +146,7 @@ flowchart TD
end end
``` ```
#### 4持续交付和部署 #### 4. 持续交付和部署
Docker 完美契合 DevOps 的工作流程 Docker 完美契合 DevOps 的工作流程
@@ -161,9 +161,9 @@ flowchart LR
- 构建过程 **可重复可追溯** - 构建过程 **可重复可追溯**
- 任何人都能从代码重建完全相同的镜像 - 任何人都能从代码重建完全相同的镜像
- 配合 [GitHub Actions](../19_cases/ci/actions/README.md) CI 系统实现自动化 - 配合 [GitHub Actions](../20_cases/ci/actions/README.md) CI 系统实现自动化
#### 5轻松迁移 #### 5. 轻松迁移
Docker 可以在几乎任何平台上运行 Docker 可以在几乎任何平台上运行
@@ -174,7 +174,7 @@ Docker 可以在几乎任何平台上运行:
**同一个镜像在任何地方运行结果都一致** 这让应用迁移变得前所未有的简单 **同一个镜像在任何地方运行结果都一致** 这让应用迁移变得前所未有的简单
#### 6微服务架构的基石 #### 6. 微服务架构的基石
现代微服务架构几乎都依赖容器技术Docker 让你可以 现代微服务架构几乎都依赖容器技术Docker 让你可以
@@ -208,19 +208,19 @@ flowchart TD
笔者认为技术选型要客观Docker 并非银弹以下场景可能不太适合 笔者认为技术选型要客观Docker 并非银弹以下场景可能不太适合
#### 1需要完全隔离的场景 #### 1. 需要完全隔离的场景
容器共享宿主机内核隔离性不如虚拟机如果你需要运行不受信任的代码虚拟机可能更安全 容器共享宿主机内核隔离性不如虚拟机如果你需要运行不受信任的代码虚拟机可能更安全
#### 2需要特殊内核的场景 #### 2. 需要特殊内核的场景
容器使用宿主机内核如果应用需要特定版本的内核或内核模块可能需要虚拟机 容器使用宿主机内核如果应用需要特定版本的内核或内核模块可能需要虚拟机
#### 3Windows 原生应用 #### 3. Windows 原生应用
虽然 Docker 支持 Windows 容器但生态不如 Linux 容器成熟传统 Windows 应用的容器化仍有挑战 虽然 Docker 支持 Windows 容器但生态不如 Linux 容器成熟传统 Windows 应用的容器化仍有挑战
#### 4桌面应用 #### 4. 桌面应用
Docker 主要面向服务端应用桌面 GUI 应用的容器化虽然可行但通常得不偿失 Docker 主要面向服务端应用桌面 GUI 应用的容器化虽然可行但通常得不偿失

View File

@@ -160,7 +160,7 @@ a6bd71f48f68 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B
Docker 镜像有多种标识方式 Docker 镜像有多种标识方式
#### 1镜像名称和标签 #### 1. 镜像名称和标签
格式`[仓库地址/]仓库名[:标签]` 格式`[仓库地址/]仓库名[:标签]`
@@ -179,7 +179,7 @@ ubuntu:24.04
nginx # 等同于 nginx:latest nginx # 等同于 nginx:latest
``` ```
#### 2镜像 ID (Content-Addressable) #### 2. 镜像 ID (Content-Addressable)
每个镜像有一个基于内容计算的唯一 ID 每个镜像有一个基于内容计算的唯一 ID
@@ -190,7 +190,7 @@ nginx latest a6bd71f48f68 2 weeks ago 187MB
ubuntu 24.04 ca2b0f26964c 3 weeks ago 78.1MB ubuntu 24.04 ca2b0f26964c 3 weeks ago 78.1MB
``` ```
#### 3镜像摘要 #### 3. 镜像摘要
更精确的标识基于镜像内容的 SHA256 哈希 更精确的标识基于镜像内容的 SHA256 哈希

View File

@@ -129,8 +129,8 @@ $ docker rm abc123
| 方式 | 说明 | 适用场景 | | 方式 | 说明 | 适用场景 |
|------|------|---------| |------|------|---------|
| **[数据卷 (Volume) ](../08_data_network/data/volume.md)** | Docker 管理的存储 | 数据库应用数据 | | **[数据卷 (Volume) ](../08_data/volume.md)** | Docker 管理的存储 | 数据库应用数据 |
| **[绑定挂载 (Bind Mount) ](../08_data_network/data/bind-mounts.md)** | 挂载宿主机目录 | 开发时共享代码 | | **[绑定挂载 (Bind Mount) ](../08_data/bind-mounts.md)** | 挂载宿主机目录 | 开发时共享代码 |
```bash ```bash
## 使用数据卷(推荐) ## 使用数据卷(推荐)
@@ -238,4 +238,4 @@ Docker 容器通过以下 Namespace 实现隔离:
| **IPC** | 进程间通信 | 独立的信号量消息队列 | | **IPC** | 进程间通信 | 独立的信号量消息队列 |
| **USER** | 用户 | 独立的用户和组 ID | | **USER** | 用户 | 独立的用户和组 ID |
> 想深入了解请阅读[底层实现 - 命名空间](../11_implementation/11.2_namespace.md) > 想深入了解请阅读[底层实现 - 命名空间](../12_implementation/12.2_namespace.md)

View File

@@ -16,7 +16,7 @@
- [获取镜像](../04_image/4.1_pull.md) Registry 下载镜像 - [获取镜像](../04_image/4.1_pull.md) Registry 下载镜像
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md)创建自己的镜像 - [使用 Dockerfile 定制镜像](../04_image/4.5_build.md)创建自己的镜像
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)构建高质量镜像的技巧 - [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)构建高质量镜像的技巧
- [底层实现 - 联合文件系统](../11_implementation/11.4_ufs.md)深入理解分层存储的技术原理 - [底层实现 - 联合文件系统](../12_implementation/12.4_ufs.md)深入理解分层存储的技术原理
| 概念 | 要点 | | 概念 | 要点 |
|------|------| |------|------|
@@ -33,7 +33,7 @@
- [启动容器](../05_container/5.1_run.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)如何操作运行中的容器 - [进入容器](../05_container/5.4_attach_exec.md)如何操作运行中的容器
- [数据管理](../08_data_network/README.md)Volume 和数据持久化详解 - [数据管理](../08_data/README.md)Volume 和数据持久化详解
| 概念 | 要点 | | 概念 | 要点 |
|------|------| |------|------|

View File

@@ -45,7 +45,7 @@ flowchart TD
这就是为什么 这就是为什么
1. **容器删除后数据会丢失**因为所有的数据修改都保存在最上层的容器层中容器销毁时这个层也就随之销毁了(除非使用了数据卷详见[数据管理](../08_data_network/README.md)) 1. **容器删除后数据会丢失**因为所有的数据修改都保存在最上层的容器层中容器销毁时这个层也就随之销毁了(除非使用了数据卷详见[数据管理](../08_data/README.md))
2. **镜像不可变**无论我们在容器里删除了多少文件基础镜像的体积并不会减小因为它们依然存在于底层的只读层中 2. **镜像不可变**无论我们在容器里删除了多少文件基础镜像的体积并不会减小因为它们依然存在于底层的只读层中
### 4.7.3 内容寻址与镜像 ID ### 4.7.3 内容寻址与镜像 ID
@@ -62,4 +62,4 @@ Docker 使用联合文件系统 (Union FS) 来实现这种分层挂载。常见
虽然实现细节不同但它们都遵循上述的 **分层 + CoW** 模型 虽然实现细节不同但它们都遵循上述的 **分层 + CoW** 模型
> 想要深入了解 Overlay2 等文件系统的具体实现原理包括 WorkDirUpperDirLowerDir 等底层细节请阅读 **[第十 底层实现](../11_implementation/README.md)** 中的 **[联合文件系统](../11_implementation/11.4_ufs.md)** 章节 > 想要深入了解 Overlay2 等文件系统的具体实现原理包括 WorkDirUpperDirLowerDir 等底层细节请阅读 **[第十 底层实现](../12_implementation/README.md)** 中的 **[联合文件系统](../12_implementation/12.4_ufs.md)** 章节

View File

@@ -16,6 +16,8 @@
- [镜像加速器](../03_install/3.9_mirror.md)加速镜像下载 - [镜像加速器](../03_install/3.9_mirror.md)加速镜像下载
- [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库 - [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库
相关信息如下表
| 操作 | 命令 | | 操作 | 命令 |
|------|------| |------|------|
| 列出所有镜像 | `docker images` | | 列出所有镜像 | `docker images` |
@@ -32,6 +34,8 @@
- [删除镜像](4.3_rm.md)清理本地镜像 - [删除镜像](4.3_rm.md)清理本地镜像
- [镜像](../02_basic_concept/2.1_image.md)理解镜像概念 - [镜像](../02_basic_concept/2.1_image.md)理解镜像概念
相关信息如下表
| 操作 | 命令 | | 操作 | 命令 |
|------|------| |------|------|
| 删除指定镜像 | `docker rmi 镜像名:标签` | | 删除指定镜像 | `docker rmi 镜像名:标签` |
@@ -45,4 +49,4 @@
- [列出镜像](4.2_list.md)查看和过滤镜像 - [列出镜像](4.2_list.md)查看和过滤镜像
- [删除容器](../05_container/5.6_rm.md)清理容器 - [删除容器](../05_container/5.6_rm.md)清理容器
- [数据卷](../08_data_network/data/volume.md)清理数据卷 - [数据卷](../08_data/volume.md)清理数据卷

View File

@@ -240,4 +240,4 @@ $ docker run -d -p 80:80 nginx
$ docker run -v mydata:/app/data myapp $ docker run -v mydata:/app/data myapp
``` ```
详见[数据管理](../08_data_network/README.md) 详见[数据管理](../08_data/README.md)

View File

@@ -143,7 +143,7 @@ $ docker container ls -a
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1长期运行的服务使用 -d #### 1. 长期运行的服务使用 -d
运行以下命令 运行以下命令
@@ -161,7 +161,7 @@ $ docker run -d -p 3306:3306 mysql:8
$ docker run -d -p 6379:6379 redis $ docker run -d -p 6379:6379 redis
``` ```
#### 2调试时先用前台模式 #### 2. 调试时先用前台模式
当容器启动有问题时**去掉 `-d` 参数** 可以直接看到输出和错误 当容器启动有问题时**去掉 `-d` 参数** 可以直接看到输出和错误
@@ -171,7 +171,7 @@ $ docker run -d -p 6379:6379 redis
$ docker run myimage:latest $ docker run myimage:latest
``` ```
#### 3使用 --rm 自动清理 #### 3. 使用 --rm 自动清理
对于一次性任务使用 `--rm` 参数让容器退出后自动删除 对于一次性任务使用 `--rm` 参数让容器退出后自动删除
@@ -183,7 +183,7 @@ Hello, World!
... ...
``` ```
#### 4配合日志查看 #### 4. 配合日志查看
运行以下命令 运行以下命令
@@ -257,4 +257,4 @@ $ docker attach mycontainer
- [进入容器](5.4_attach_exec.md)如何进入正在运行的容器执行命令 - [进入容器](5.4_attach_exec.md)如何进入正在运行的容器执行命令
- [容器日志](../appendix/20.1_best_practices.md)生产环境的日志管理最佳实践 - [容器日志](../appendix/20.1_best_practices.md)生产环境的日志管理最佳实践
- [HEALTHCHECK 健康检查](../07_dockerfile/7.12_healthcheck.md)自动检测容器内服务是否正常 - [HEALTHCHECK 健康检查](../07_dockerfile/7.12_healthcheck.md)自动检测容器内服务是否正常
- [Docker Compose](../10_compose/README.md)管理多个后台容器的更好方式 - [Docker Compose](../11_compose/README.md)管理多个后台容器的更好方式

View File

@@ -240,7 +240,7 @@ flowchart LR
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1首选 docker exec #### 1. 首选 docker exec
运行以下命令 运行以下命令
@@ -258,7 +258,7 @@ $ docker exec myapp tail -f /var/log/app.log
$ docker exec myapp python manage.py migrate $ docker exec myapp python manage.py migrate
``` ```
#### 2生产环境避免进入容器 #### 2. 生产环境避免进入容器
笔者建议生产环境应尽量避免进入容器直接操作而是通过 笔者建议生产环境应尽量避免进入容器直接操作而是通过
@@ -266,7 +266,7 @@ $ docker exec myapp python manage.py migrate
- 监控系统查看状态 - 监控系统查看状态
- 重新部署而非手动修改 - 重新部署而非手动修改
#### 3 shell 镜像的处理 #### 3. shell 镜像的处理
某些精简镜像 (如基于 `scratch` `distroless`) 没有 shell 某些精简镜像 (如基于 `scratch` `distroless`) 没有 shell

View File

@@ -13,8 +13,8 @@
- [后台运行](5.2_daemon.md)理解 `-d` 参数和容器生命周期 - [后台运行](5.2_daemon.md)理解 `-d` 参数和容器生命周期
- [进入容器](5.4_attach_exec.md)操作运行中的容器 - [进入容器](5.4_attach_exec.md)操作运行中的容器
- [网络配置](../08_data_network/network/README.md)理解端口映射的原理 - [网络配置](../09_network/README.md)理解端口映射的原理
- [数据管理](../08_data_network/README.md)数据持久化方案 - [数据管理](../08_data/README.md)数据持久化方案
| 操作 | 命令 | 说明 | | 操作 | 命令 | 说明 |
|------|------|------| |------|------|------|
@@ -54,4 +54,4 @@
- [终止容器](5.3_stop.md)优雅停止容器 - [终止容器](5.3_stop.md)优雅停止容器
- [删除镜像](../04_image/4.3_rm.md)清理镜像 - [删除镜像](../04_image/4.3_rm.md)清理镜像
- [数据卷](../08_data_network/data/volume.md)数据卷管理 - [数据卷](../08_data/volume.md)数据卷管理

View File

@@ -22,7 +22,7 @@ Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1搜索镜像 #### 1. 搜索镜像
我们可以通过 `docker search` 命令来查找官方仓库中的镜像并利用 `docker pull` 命令来将它下载到本地 我们可以通过 `docker search` 命令来查找官方仓库中的镜像并利用 `docker pull` 命令来将它下载到本地
@@ -37,7 +37,7 @@ centos The official build of CentOS. 7000+ [OK]
> **技巧**始终优先使用 `OFFICIAL` 标记为 `[OK]` 的镜像安全性更有保障 > **技巧**始终优先使用 `OFFICIAL` 标记为 `[OK]` 的镜像安全性更有保障
#### 2拉取镜像 #### 2. 拉取镜像
运行以下命令 运行以下命令
@@ -45,7 +45,7 @@ centos The official build of CentOS. 7000+ [OK]
$ docker pull nginx:alpine $ docker pull nginx:alpine
``` ```
#### 3推送镜像 #### 3. 推送镜像
需要先登录 需要先登录
@@ -99,14 +99,14 @@ $ docker push username/myapp:v1
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1启用 2FA (双因素认证) #### 1. 启用 2FA (双因素认证)
为了保护您的 Docker Hub 账号安全我们建议采取以下措施 为了保护您的 Docker Hub 账号安全我们建议采取以下措施
Account Settings -> Security 中启用 2FA保护账号安全启用后CLI 登录需要使用 **Access Token** 而非密码 Account Settings -> Security 中启用 2FA保护账号安全启用后CLI 登录需要使用 **Access Token** 而非密码
#### 2使用 Access Token #### 2. 使用 Access Token
不要在脚本或 CI/CD 中直接使用登录密码 不要在脚本或 CI/CD 中直接使用登录密码
@@ -117,7 +117,7 @@ $ docker push username/myapp:v1
$ docker login -u username -p dckr_pat_xxxxxxx $ docker login -u username -p dckr_pat_xxxxxxx
``` ```
#### 3关注镜像漏洞 #### 3. 关注镜像漏洞
Docker Hub 会对官方镜像和付费用户的镜像进行安全扫描在镜像标签页可以看到漏洞扫描结果 Docker Hub 会对官方镜像和付费用户的镜像进行安全扫描在镜像标签页可以看到漏洞扫描结果

View File

@@ -127,7 +127,7 @@ COPY --from=builder /build/dist .
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1尽早设置 WORKDIR #### 1. 尽早设置 WORKDIR
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -141,7 +141,7 @@ COPY . .
CMD ["node", "server.js"] CMD ["node", "server.js"]
``` ```
#### 2使用绝对路径 #### 2. 使用绝对路径
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -155,7 +155,7 @@ WORKDIR /app
WORKDIR app WORKDIR app
``` ```
#### 3不要用 RUN cd #### 3. 不要用 RUN cd
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -170,7 +170,7 @@ WORKDIR /app
RUN echo "hello" > world.txt RUN echo "hello" > world.txt
``` ```
#### 4适时重置 WORKDIR #### 4. 适时重置 WORKDIR
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -225,7 +225,7 @@ CMD ["node", "server.js"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1始终使用非 root 用户 #### 1. 始终使用非 root 用户
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -241,7 +241,7 @@ CMD ["myapp"]
CMD ["myapp"] # 以 root 运行 CMD ["myapp"] # 以 root 运行
``` ```
#### 2使用固定 UID/GID #### 2. 使用固定 UID/GID
便于在宿主机和容器间共享文件 便于在宿主机和容器间共享文件
@@ -253,7 +253,7 @@ RUN addgroup -g 1000 -S appgroup && \
USER 1000:1000 USER 1000:1000
``` ```
#### 3多阶段构建中的 USER #### 3. 多阶段构建中的 USER
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -191,15 +191,15 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1避免副作用 #### 1. 避免副作用
健康检查会被频繁执行不要在检查脚本中进行写操作或消耗大量资源的操作 健康检查会被频繁执行不要在检查脚本中进行写操作或消耗大量资源的操作
#### 2使用轻量级工具 #### 2. 使用轻量级工具
优先使用镜像中已有的工具 ( `wget`)避免为了健康检查安装庞大的依赖 ( `curl`) 优先使用镜像中已有的工具 ( `wget`)避免为了健康检查安装庞大的依赖 ( `curl`)
#### 3设置合理的 Start Period #### 3. 设置合理的 Start Period
应用启动可能需要时间 ( Java 应用)设置 `--start-period` 可以防止在启动阶段因检查失败而误判 应用启动可能需要时间 ( Java 应用)设置 `--start-period` 可以防止在启动阶段因检查失败而误判
@@ -209,7 +209,7 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
HEALTHCHECK --start-period=60s CMD curl -f http://localhost/ || exit 1 HEALTHCHECK --start-period=60s CMD curl -f http://localhost/ || exit 1
``` ```
#### 4只检查核心依赖 #### 4. 只检查核心依赖
健康检查应主要关注 **当前服务** 是否可用而不是检查其下游依赖 (数据库等)下游依赖的检查应由应用逻辑处理 健康检查应主要关注 **当前服务** 是否可用而不是检查其下游依赖 (数据库等)下游依赖的检查应由应用逻辑处理

View File

@@ -79,7 +79,7 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1自动处理依赖安装 #### 1. 自动处理依赖安装
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -90,7 +90,7 @@ ONBUILD COPY requirements.txt ./
ONBUILD RUN pip install -r requirements.txt ONBUILD RUN pip install -r requirements.txt
``` ```
#### 2自动编译代码 #### 2. 自动编译代码
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -101,7 +101,7 @@ ONBUILD COPY . .
ONBUILD RUN go build -o app main.go ONBUILD RUN go build -o app main.go
``` ```
#### 3处理静态资源 #### 3. 处理静态资源
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -117,7 +117,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1继承性限制 #### 1. 继承性限制
`ONBUILD` 指令 **只会继承一次** `ONBUILD` 指令 **只会继承一次**
@@ -125,15 +125,15 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
- 镜像 B (FROM A) -> 触发 ONBUILD - 镜像 B (FROM A) -> 触发 ONBUILD
- 镜像 C (FROM B) -> **不会** 再次触发 ONBUILD - 镜像 C (FROM B) -> **不会** 再次触发 ONBUILD
#### 2构建上下文 #### 2. 构建上下文
子镜像构建时`ONBUILD COPY . .` 中的 `.` 指的是 **子项目** 的构建上下文而不是基础镜像的上下文 子镜像构建时`ONBUILD COPY . .` 中的 `.` 指的是 **子项目** 的构建上下文而不是基础镜像的上下文
#### 3不允许级联 #### 3. 不允许级联
`ONBUILD ONBUILD` 是非法的你不能写 `ONBUILD ONBUILD COPY ...` `ONBUILD ONBUILD` 是非法的你不能写 `ONBUILD ONBUILD COPY ...`
#### 4可能会导致构建失败 #### 4. 可能会导致构建失败
由于 `ONBUILD` 实际上是在子镜像中执行指令如果子项目的上下文不满足要求 (例如缺少 `package.json`)会导致子镜像构建失败且错误信息可能比较隐晦 由于 `ONBUILD` 实际上是在子镜像中执行指令如果子项目的上下文不满足要求 (例如缺少 `package.json`)会导致子镜像构建失败且错误信息可能比较隐晦
@@ -143,7 +143,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1命名规范 #### 1. 命名规范
建议在镜像标签中添加 `-onbuild` 后缀明确告知使用者该镜像包含触发器 建议在镜像标签中添加 `-onbuild` 后缀明确告知使用者该镜像包含触发器
@@ -152,11 +152,11 @@ node:20-onbuild
python:3.12-onbuild python:3.12-onbuild
``` ```
#### 2避免执行耗时操作 #### 2. 避免执行耗时操作
尽量不要在 `ONBUILD` 中执行过于耗时或不确定的操作 (如更新系统软件)这会让子镜像构建变得缓慢且不可控 尽量不要在 `ONBUILD` 中执行过于耗时或不确定的操作 (如更新系统软件)这会让子镜像构建变得缓慢且不可控
#### 3清理工作 #### 3. 清理工作
如果 `ONBUILD` 指令产生了临时文件最好在同一个指令链中清理或者提供机制让子镜像清理 如果 `ONBUILD` 指令产生了临时文件最好在同一个指令链中清理或者提供机制让子镜像清理

View File

@@ -23,7 +23,7 @@ SHELL ["executable", "parameters"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 bash 特性 #### 1. 使用 bash 特性
默认的 `/bin/sh` (通常是 dash alpine ash) 功能有限如果你需要使用 bash 的特有功能 (如数组`{}` 扩展`pipefail` )可以切换 shell 默认的 `/bin/sh` (通常是 dash alpine ash) 功能有限如果你需要使用 bash 的特有功能 (如数组`{}` 扩展`pipefail` )可以切换 shell
@@ -39,7 +39,7 @@ SHELL ["/bin/bash", "-c"]
RUN echo {a..z} RUN echo {a..z}
``` ```
#### 2增强错误处理 #### 2. 增强错误处理
默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个指令就视为成功这可能掩盖构建错误 默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个指令就视为成功这可能掩盖构建错误
@@ -61,7 +61,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN wget -O - https://invalid-url | tar xz RUN wget -O - https://invalid-url | tar xz
``` ```
#### 3Windows 环境 #### 3. Windows 环境
Windows 容器中经常需要在 `cmd` `powershell` 之间切换 Windows 容器中经常需要在 `cmd` `powershell` 之间切换
@@ -127,7 +127,7 @@ RUN echo "Using sh again"
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1推荐开启 pipefail #### 1. 推荐开启 pipefail
对于使用 bash 的镜像强烈建议开启 `pipefail`以确保构建过程中的错误能被及时捕获 对于使用 bash 的镜像强烈建议开启 `pipefail`以确保构建过程中的错误能被及时捕获
@@ -135,11 +135,11 @@ RUN echo "Using sh again"
SHELL ["/bin/bash", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-o", "pipefail", "-c"]
``` ```
#### 2明确意图 #### 2. 明确意图
如果由于脚本需求必须更改 shell最好在 Dockerfile 中显式声明而不是依赖默认行为 如果由于脚本需求必须更改 shell最好在 Dockerfile 中显式声明而不是依赖默认行为
#### 3尽量保持一致 #### 3. 尽量保持一致
避免在 Dockerfile 中频繁切换 SHELL这会使构建过程难以理解和调试尽量在头部定义一次即可 避免在 Dockerfile 中频繁切换 SHELL这会使构建过程难以理解和调试尽量在头部定义一次即可

View File

@@ -19,7 +19,7 @@ RUN ["executable", "param1", "param2"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1Shell 格式 #### 1. Shell 格式
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -34,7 +34,7 @@ RUN apt-get update
RUN echo "Hello" > /test.txt RUN echo "Hello" > /test.txt
``` ```
#### 2Exec 格式 #### 2. Exec 格式
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -52,7 +52,7 @@ RUN ["apt-get", "update"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1组合命令 (减少层数) #### 1. 组合命令 (减少层数)
每一个 `RUN` 指令都会新建一层镜像为了减少镜像体积和层数应使用 `&&` 连接命令 每一个 `RUN` 指令都会新建一层镜像为了减少镜像体积和层数应使用 `&&` 连接命令
@@ -72,7 +72,7 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
``` ```
#### 2清理缓存 #### 2. 清理缓存
在安装完软件后立即清除缓存可以显著减小镜像体积 在安装完软件后立即清除缓存可以显著减小镜像体积
@@ -87,7 +87,7 @@ RUN apt-get update && \
RUN apk add --no-cache package-bar RUN apk add --no-cache package-bar
``` ```
#### 3使用 `set -e` `pipefail` #### 3. 使用 `set -e` `pipefail`
默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个 `RUN` 就视为成功 默认情况下管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功整个 `RUN` 就视为成功
@@ -150,7 +150,7 @@ RUN echo $MY_VAR
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 BuildKit 的挂载缓存 #### 1. 使用 BuildKit 的挂载缓存
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存加速构建 BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存加速构建
@@ -169,7 +169,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \
go build -o app go build -o app
``` ```
#### 2挂载密钥 #### 2. 挂载密钥
安全地使用 SSH 密钥或 Token而不将其记录在镜像中 安全地使用 SSH 密钥或 Token而不将其记录在镜像中

View File

@@ -256,7 +256,7 @@ Dockerfile
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1利用缓存先复制依赖文件 #### 1. 利用缓存先复制依赖文件
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -273,7 +273,7 @@ COPY . .
RUN npm install RUN npm install
``` ```
#### 2使用dockerignore #### 2. 使用 .dockerignore
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -286,7 +286,7 @@ COPY . .
... ...
``` ```
#### 3明确复制路径 #### 3. 明确复制路径
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -214,7 +214,7 @@ ADD app.tar.gz /app/
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1默认使用 COPY #### 1. 默认使用 COPY
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -224,7 +224,7 @@ ADD app.tar.gz /app/
COPY . /app/ COPY . /app/
``` ```
#### 2仅在需要解压时使用 ADD #### 2. 仅在需要解压时使用 ADD
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -234,7 +234,7 @@ COPY . /app/
ADD app.tar.gz /app/ ADD app.tar.gz /app/
``` ```
#### 3不要用 ADD 下载文件 #### 3. 不要用 ADD 下载文件
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -248,7 +248,7 @@ ADD https://example.com/file.tar.gz /tmp/
RUN curl -fsSL https://example.com/file.tar.gz | tar -xz -C /app RUN curl -fsSL https://example.com/file.tar.gz | tar -xz -C /app
``` ```
#### 4解压后清理 #### 4. 解压后清理
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -212,7 +212,7 @@ $ docker run myimage http://other.com # curl -s http://other.com参数覆盖
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1优先使用 exec 格式 #### 1. 优先使用 exec 格式
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -226,7 +226,7 @@ CMD ["python", "app.py"]
CMD ["sh", "-c", "echo $PATH && python app.py"] CMD ["sh", "-c", "echo $PATH && python app.py"]
``` ```
#### 2确保应用在前台运行 #### 2. 确保应用在前台运行
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -243,7 +243,7 @@ CMD service nginx start
CMD systemctl start nginx CMD systemctl start nginx
``` ```
#### 3使用双引号 #### 3. 使用双引号
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -257,7 +257,7 @@ CMD ["node", "server.js"]
CMD ['node', 'server.js'] CMD ['node', 'server.js']
``` ```
#### 4配合 ENTRYPOINT 使用 #### 4. 配合 ENTRYPOINT 使用
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -294,7 +294,7 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1使用 exec 格式 #### 1. 使用 exec 格式
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -308,7 +308,7 @@ ENTRYPOINT ["python", "app.py"]
ENTRYPOINT python app.py ENTRYPOINT python app.py
``` ```
#### 2提供有意义的默认参数 #### 2. 提供有意义的默认参数
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -317,7 +317,7 @@ ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"] CMD ["-g", "daemon off;"]
``` ```
#### 3入口脚本使用 exec #### 3. 入口脚本使用 exec
运行以下命令 运行以下命令
@@ -330,7 +330,7 @@ CMD ["-g", "daemon off;"]
exec "$@" exec "$@"
``` ```
#### 4处理信号 #### 4. 处理信号
确保 ENTRYPOINT 脚本能正确传递信号 确保 ENTRYPOINT 脚本能正确传递信号

View File

@@ -49,7 +49,7 @@ ENV NODE_VERSION=20.10.0 \
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1后续指令中使用 #### 1. 后续指令中使用
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -71,7 +71,7 @@ WORKDIR $APP_HOME
COPY . $APP_HOME COPY . $APP_HOME
``` ```
#### 2容器运行时使用 #### 2. 容器运行时使用
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -193,7 +193,7 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1统一管理版本号 #### 1. 统一管理版本号
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -211,7 +211,7 @@ RUN apt-get install nginx=${NGINX_VERSION}
RUN apt-get install nginx=1.25.0 RUN apt-get install nginx=1.25.0
``` ```
#### 2不要存储敏感信息 #### 2. 不要存储敏感信息
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -227,7 +227,7 @@ ENV DB_PASSWORD=secret123
... ...
``` ```
#### 3为应用提供合理默认值 #### 3. 为应用提供合理默认值
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -237,7 +237,7 @@ ENV APP_ENV=production \
LOG_LEVEL=info LOG_LEVEL=info
``` ```
#### 4使用有意义的变量名 #### 4. 使用有意义的变量名
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -134,7 +134,7 @@ RUN echo "Running with Node $NODE_VERSION"
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1控制基础镜像版本 #### 1. 控制基础镜像版本
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -147,7 +147,7 @@ FROM alpine:${ALPINE_VERSION}
$ docker build --build-arg ALPINE_VERSION=3.18 . $ docker build --build-arg ALPINE_VERSION=3.18 .
``` ```
#### 2设置软件版本 #### 2. 设置软件版本
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -157,7 +157,7 @@ ARG NGINX_VERSION=1.25.0
RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -xz RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -xz
``` ```
#### 3配置构建环境 #### 3. 配置构建环境
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -172,7 +172,7 @@ RUN if [ "$ENABLE_DEBUG" = "true" ]; then \
fi fi
``` ```
#### 4配置私有仓库 #### 4. 配置私有仓库
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -233,7 +233,7 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1 ARG 提供合理默认值 #### 1. ARG 提供合理默认值
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -247,7 +247,7 @@ ARG NODE_VERSION=20
ARG NODE_VERSION ARG NODE_VERSION
``` ```
#### 2不要用 ARG 存储敏感信息 #### 2. 不要用 ARG 存储敏感信息
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -262,7 +262,7 @@ RUN echo "password=$DB_PASSWORD" > /app/.env
... ...
``` ```
#### 3使用 ARG 提高构建灵活性 #### 3. 使用 ARG 提高构建灵活性
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -73,7 +73,7 @@ VOLUME ["/data", "/logs", "/config"]
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1自动创建匿名卷 #### 1. 自动创建匿名卷
如果运行时未指定挂载Docker 会自动创建匿名卷 如果运行时未指定挂载Docker 会自动创建匿名卷
@@ -84,7 +84,7 @@ DRIVER VOLUME NAME
local a1b2c3d4e5f6... # 自动创建的匿名卷 local a1b2c3d4e5f6... # 自动创建的匿名卷
``` ```
#### 2可被命名卷覆盖 #### 2. 可被命名卷覆盖
运行以下命令 运行以下命令
@@ -94,7 +94,7 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
$ docker run -v mysql_data:/var/lib/mysql mysql:8.0 $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
``` ```
#### 3可被 Bind Mount 覆盖 #### 3. 可被 Bind Mount 覆盖
运行以下命令 运行以下命令
@@ -263,7 +263,7 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1定义必须持久化的路径 #### 1. 定义必须持久化的路径
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -274,7 +274,7 @@ FROM postgres:15
VOLUME /var/lib/postgresql/data VOLUME /var/lib/postgresql/data
``` ```
#### 2不要在 VOLUME 后修改目录 #### 2. 不要在 VOLUME 后修改目录
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -290,7 +290,7 @@ RUN mkdir -p /app/data && cp init-data.json /app/data/
VOLUME /app/data VOLUME /app/data
``` ```
#### 3文档中说明 VOLUME 用途 #### 3. 文档中说明 VOLUME 用途
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -39,7 +39,7 @@ EXPOSE 53/udp
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1文档说明 #### 1. 文档说明
告诉镜像使用者容器将在哪些端口提供服务 告诉镜像使用者容器将在哪些端口提供服务
@@ -56,7 +56,7 @@ $ docker inspect nginx --format '{{.Config.ExposedPorts}}'
map[80/tcp:{}] map[80/tcp:{}]
``` ```
#### 2配合 -P 使用 #### 2. 配合 -P 使用
使用 `docker run -P` Docker 会自动映射 EXPOSE 的端口到宿主机随机端口 使用 `docker run -P` Docker 会自动映射 EXPOSE 的端口到宿主机随机端口
@@ -162,7 +162,7 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1总是声明应用使用的端口 #### 1. 总是声明应用使用的端口
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -183,7 +183,7 @@ FROM redis
EXPOSE 6379 EXPOSE 6379
``` ```
#### 2使用明确的协议 #### 2. 使用明确的协议
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -201,7 +201,7 @@ EXPOSE 53/udp
EXPOSE 53/tcp 53/udp EXPOSE 53/tcp 53/udp
``` ```
#### 3与应用实际端口保持一致 #### 3. 与应用实际端口保持一致
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例

View File

@@ -26,7 +26,7 @@
### 7.19.2 延伸阅读 ### 7.19.2 延伸阅读
- [安全](../17_security/README.md)容器安全实践 - [安全](../18_security/README.md)容器安全实践
- [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换 - [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 安全 - [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 安全
@@ -41,7 +41,7 @@
### 7.19.3 延伸阅读 ### 7.19.3 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)启动主进程 - [CMD 容器启动命令](7.4_cmd.md)启动主进程
- [Compose 模板文件](../10_compose/10.5_compose_file.md)Compose 中的健康检查 - [Compose 模板文件](../11_compose/11.5_compose_file.md)Compose 中的健康检查
- [Docker 调试](../appendix/20.2_debug.md)容器排障 - [Docker 调试](../appendix/20.2_debug.md)容器排障
| 要点 | 说明 | | 要点 | 说明 |
@@ -163,7 +163,7 @@
### 7.19.12 延伸阅读 ### 7.19.12 延伸阅读
- [ARG 构建参数](7.7_arg.md)构建时变量 - [ARG 构建参数](7.7_arg.md)构建时变量
- [Compose 环境变量](../10_compose/10.5_compose_file.md)Compose 中的环境变量 - [Compose 环境变量](../11_compose/11.5_compose_file.md)Compose 中的环境变量
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南 - [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
| 要点 | 说明 | | 要点 | 说明 |
@@ -191,9 +191,9 @@
### 7.19.14 延伸阅读 ### 7.19.14 延伸阅读
- [数据卷](../08_data_network/data/volume.md)卷的管理和使用 - [数据卷](../08_data/volume.md)卷的管理和使用
- [挂载主机目录](../08_data_network/data/bind-mounts.md)Bind Mount - [挂载主机目录](../08_data/bind-mounts.md)Bind Mount
- [Compose 数据管理](../10_compose/10.5_compose_file.md)Compose 中的卷配置 - [Compose 数据管理](../11_compose/11.5_compose_file.md)Compose 中的卷配置
| 要点 | 说明 | | 要点 | 说明 |
|------|------| |------|------|
@@ -205,6 +205,6 @@
### 7.19.15 延伸阅读 ### 7.19.15 延伸阅读
- [网络配置](../08_data_network/network/README.md)Docker 网络详解 - [网络配置](../09_network/README.md)Docker 网络详解
- [端口映射](../08_data_network/network/port_mapping.md)-p 参数详解 - [端口映射](../09_network/port_mapping.md)-p 参数详解
- [Compose 端口](../10_compose/10.5_compose_file.md)Compose 中的端口配置 - [Compose 端口](../11_compose/11.5_compose_file.md)Compose 中的端口配置

View File

@@ -291,7 +291,7 @@ $ docker run -v /host/path:/container/path:cached myapp
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1开发环境使用 Bind Mount #### 1. 开发环境使用 Bind Mount
运行以下命令 运行以下命令
@@ -301,7 +301,7 @@ $ docker run -v /host/path:/container/path:cached myapp
$ docker run -v $(pwd):/app -p 3000:3000 node npm run dev $ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
``` ```
#### 2生产环境使用 Volume #### 2. 生产环境使用 Volume
运行以下命令 运行以下命令
@@ -311,7 +311,7 @@ $ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
$ docker run -v mysql_data:/var/lib/mysql mysql $ docker run -v mysql_data:/var/lib/mysql mysql
``` ```
#### 3配置文件使用只读挂载 #### 3. 配置文件使用只读挂载
运行以下命令 运行以下命令
@@ -319,7 +319,7 @@ $ docker run -v mysql_data:/var/lib/mysql mysql
$ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx $ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx
``` ```
#### 4注意路径安全 #### 4. 注意路径安全
运行以下命令 运行以下命令

View File

@@ -14,7 +14,7 @@
- [数据卷](volume.md)Docker 管理的持久化存储 - [数据卷](volume.md)Docker 管理的持久化存储
- [tmpfs 挂载](tmpfs.md)内存临时存储 - [tmpfs 挂载](tmpfs.md)内存临时存储
- [Compose 数据管理](../../10_compose/10.5_compose_file.md)Compose 中的挂载配置 - [Compose 数据管理](../11_compose/11.5_compose_file.md)Compose 中的挂载配置
| 操作 | 命令 | | 操作 | 命令 |
|------|------| |------|------|
@@ -29,4 +29,4 @@
- [绑定挂载](bind-mounts.md)挂载宿主机目录 - [绑定挂载](bind-mounts.md)挂载宿主机目录
- [tmpfs 挂载](tmpfs.md)内存中的临时存储 - [tmpfs 挂载](tmpfs.md)内存中的临时存储
- [存储驱动](../../11_implementation/11.4_ufs.md)Docker 存储的底层原理 - [存储驱动](../12_implementation/12.4_ufs.md)Docker 存储的底层原理

View File

@@ -21,4 +21,4 @@
- [端口映射](port_mapping.md)高级端口配置 - [端口映射](port_mapping.md)高级端口配置
- [网络隔离](network_isolation.md)网络安全与隔离策略 - [网络隔离](network_isolation.md)网络安全与隔离策略
- [EXPOSE 指令](../07_dockerfile/7.9_expose.md) Dockerfile 中声明端口 - [EXPOSE 指令](../07_dockerfile/7.9_expose.md) Dockerfile 中声明端口
- [Compose 网络](../11_compose/10.5_compose_file.md)Compose 中的网络配置 - [Compose 网络](../11_compose/11.5_compose_file.md)Compose 中的网络配置

View File

@@ -14,7 +14,7 @@ $ docker buildx build .
=> ... => ...
``` ```
Buildx 使用 [BuildKit 引擎](9.1_buildkit.md)进行构建支持许多新的功能具体参考 [Buildkit](9.1_buildkit.md) 一节 Buildx 使用 [BuildKit 引擎](10.1_buildkit.md)进行构建支持许多新的功能具体参考 [Buildkit](10.1_buildkit.md) 一节
#### 使用 `bake` #### 使用 `bake`

View File

@@ -1,6 +1,6 @@
# 第十章 Docker Buildx # 第十章 Docker Buildx
Docker Buildx 是一个 docker CLI 插件其扩展了 docker 命令支持 [Moby BuildKit](9.1_buildkit.md) 提供的功能提供了与 docker build 相同的用户体验并增加了许多新功能 Docker Buildx 是一个 docker CLI 插件其扩展了 docker 命令支持 [Moby BuildKit](10.1_buildkit.md) 提供的功能提供了与 docker build 相同的用户体验并增加了许多新功能
> Buildx 需要 Docker v19.03+在较新版本中已更常用且功能更完整 > Buildx 需要 Docker v19.03+在较新版本中已更常用且功能更完整
@@ -12,6 +12,6 @@ Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持
本章将详细介绍 Docker Buildx 的使用包括 本章将详细介绍 Docker Buildx 的使用包括
* [使用 BuildKit 构建镜像](9.1_buildkit.md) * [使用 BuildKit 构建镜像](10.1_buildkit.md)
* [使用 Buildx 构建镜像](9.2_buildx.md) * [使用 Buildx 构建镜像](10.2_buildx.md)
* [构建多种系统架构支持的 Docker 镜像](9.3_multi-arch-images.md) * [构建多种系统架构支持的 Docker 镜像](10.3_multi-arch-images.md)

View File

@@ -368,7 +368,7 @@ services:
### 11.6.12 延伸阅读 ### 11.6.12 延伸阅读
- [Compose 模板文件详解](10.5_compose_file.md)深入理解 Compose 文件的所有配置项 - [Compose 模板文件详解](11.5_compose_file.md)深入理解 Compose 文件的所有配置项
- [使用 WordPress](10.8_wordpress.md)另一个 Compose 实战案例 - [使用 WordPress](11.8_wordpress.md)另一个 Compose 实战案例
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)构建更小更安全的镜像 - [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)构建更小更安全的镜像
- [数据管理](../08_data_network/README.md)Volume 和数据持久化详解 - [数据管理](../08_data/README.md)Volume 和数据持久化详解

View File

@@ -294,6 +294,6 @@ $ docker compose run --rm web bundle update
### 11.7.14 延伸阅读 ### 11.7.14 延伸阅读
- [使用 Django](10.6_django.md)Python Web 框架实战 - [使用 Django](11.6_django.md)Python Web 框架实战
- [Compose 模板文件](10.5_compose_file.md)配置详解 - [Compose 模板文件](11.5_compose_file.md)配置详解
- [数据管理](../08_data_network/README.md)数据持久化 - [数据管理](../08_data/README.md)数据持久化

View File

@@ -83,7 +83,7 @@ networks:
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1环境变量 (env) #### 1. 环境变量 (.env)
为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件 为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件
@@ -94,14 +94,14 @@ DB_PASSWORD=somestronguserpassword
Compose 会自动读取此同级目录下的文件 Compose 会自动读取此同级目录下的文件
#### 2数据持久化 #### 2. 数据持久化
我们定义了两个命名卷 我们定义了两个命名卷
- `db_data`确保 MySQL 容器重建后数据不丢失 - `db_data`确保 MySQL 容器重建后数据不丢失
- `wp_data`保存 WordPress 的核心文件插件主题和上传的媒体文件 - `wp_data`保存 WordPress 的核心文件插件主题和上传的媒体文件
#### 3PHP 配置优化 #### 3. PHP 配置优化
默认的 WordPress 镜像上传文件限制较小 (通常 2MB)创建 `uploads.ini` 默认的 WordPress 镜像上传文件限制较小 (通常 2MB)创建 `uploads.ini`
@@ -138,7 +138,7 @@ $ docker compose logs -f
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1数据库备份 #### 1. 数据库备份
不要只依赖 Volume建议定期备份数据库 不要只依赖 Volume建议定期备份数据库
@@ -168,11 +168,11 @@ $ docker exec wordpress_db mysqldump -u wordpress -pwordpress wordpress > backup
- wp_net - wp_net
``` ```
#### 2使用 Nginx 反向代理 #### 2. 使用 Nginx 反向代理
在生产环境中不要直接暴露 WordPress 端口而是通过 Nginx 进行反向代理并配置 SSL 在生产环境中不要直接暴露 WordPress 端口而是通过 Nginx 进行反向代理并配置 SSL
#### 3使用 Redis 缓存 #### 3. 使用 Redis 缓存
WordPress 支持 Redis 缓存以提高性能 WordPress 支持 Redis 缓存以提高性能
@@ -216,6 +216,6 @@ $ docker compose restart wordpress
### 11.8.7 延伸阅读 ### 11.8.7 延伸阅读
- [Compose 模板文件](10.5_compose_file.md)深入了解配置项 - [Compose 模板文件](11.5_compose_file.md)深入了解配置项
- [数据卷](../08_data_network/data/volume.md)理解数据持久化 - [数据卷](../08_data/volume.md)理解数据持久化
- [Docker Hub WordPress](https://hub.docker.com/_/wordpress):官方镜像文档 - [Docker Hub WordPress](https://hub.docker.com/_/wordpress):官方镜像文档

View File

@@ -4,12 +4,12 @@
本章将介绍 `Compose` 项目情况以及安装和使用 本章将介绍 `Compose` 项目情况以及安装和使用
* [简介](10.1_introduction.md) * [简介](11.1_introduction.md)
* [安装与卸载](10.2_install.md) * [安装与卸载](11.2_install.md)
* [使用](10.3_usage.md) * [使用](11.3_usage.md)
* [命令说明](10.4_commands.md) * [命令说明](11.4_commands.md)
* [Compose 模板文件](10.5_compose_file.md) * [Compose 模板文件](11.5_compose_file.md)
* [实战 Django](10.6_django.md) * [实战 Django](11.6_django.md)
* [实战 Rails](10.7_rails.md) * [实战 Rails](11.7_rails.md)
* [实战 WordPress](10.8_wordpress.md) * [实战 WordPress](11.8_wordpress.md)
* [实战 LNMP](10.9_lnmp.md) * [实战 LNMP](11.9_lnmp.md)

View File

@@ -15,7 +15,7 @@ Docker Compose 是管理多容器应用的利器,通过 YAML 文件声明式
### 11.10.1 延伸阅读 ### 11.10.1 延伸阅读
- [Compose 模板文件](10.5_compose_file.md)详细模板语法参考 - [Compose 模板文件](11.5_compose_file.md)详细模板语法参考
- [Compose 命令说明](10.4_commands.md)完整命令列表 - [Compose 命令说明](11.4_commands.md)完整命令列表
- [网络配置](../09_network/README.md)Docker 网络基础 - [网络配置](../09_network/README.md)Docker 网络基础
- [数据管理](../08_data/README.md)数据卷管理 - [数据管理](../08_data/README.md)数据卷管理

View File

@@ -154,6 +154,6 @@ flowchart TD
### 12.1.7 延伸阅读 ### 12.1.7 延伸阅读
- [命名空间](./11.2_namespace.md)Runc 如何隔离容器 - [命名空间](./12.2_namespace.md)Runc 如何隔离容器
- [控制组](./11.3_cgroups.md)Runc 如何限制资源 - [控制组](./12.3_cgroups.md)Runc 如何限制资源
- [联合文件系统](./11.4_ufs.md)镜像如何存储 - [联合文件系统](./12.4_ufs.md)镜像如何存储

View File

@@ -269,7 +269,7 @@ services:
在使用 Cgroups 限制资源时遵循一些最佳实践可以避免潜在的问题 在使用 Cgroups 限制资源时遵循一些最佳实践可以避免潜在的问题
#### 1始终设置内存限制 #### 1. 始终设置内存限制
运行以下命令 运行以下命令
@@ -279,7 +279,7 @@ services:
$ docker run -m 1g myapp $ docker run -m 1g myapp
``` ```
#### 2为关键应用设置 CPU 保证 #### 2. 为关键应用设置 CPU 保证
运行以下命令 运行以下命令
@@ -287,7 +287,7 @@ $ docker run -m 1g myapp
$ docker run --cpus=2 --cpu-shares=2048 critical-app $ docker run --cpus=2 --cpu-shares=2048 critical-app
``` ```
#### 3监控资源使用 #### 3. 监控资源使用
运行以下命令 运行以下命令

View File

@@ -28,7 +28,7 @@ flowchart TD
Docker 选择联合文件系统作为其存储驱动主要基于以下几个核心优势 Docker 选择联合文件系统作为其存储驱动主要基于以下几个核心优势
#### 1镜像分层复用 #### 1. 镜像分层复用
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -40,7 +40,7 @@ flowchart TD
多个镜像共享相同的底层节省磁盘空间 多个镜像共享相同的底层节省磁盘空间
#### 2快速构建 #### 2. 快速构建
每个 Dockerfile 指令创建一层只有变化的层需要重建 每个 Dockerfile 指令创建一层只有变化的层需要重建
@@ -53,7 +53,7 @@ COPY . . # 层4应用代码
代码变化时只需重建层 4 1-3 使用缓存 代码变化时只需重建层 4 1-3 使用缓存
#### 3容器启动快 #### 3. 容器启动快
容器启动时不需要复制镜像只需 容器启动时不需要复制镜像只需
@@ -202,7 +202,7 @@ $ docker inspect nginx:alpine --format '{{json .GraphDriver.Data}}' | jq
为了构建高效轻量的镜像我们在使用联合文件系统时应注意以下几点 为了构建高效轻量的镜像我们在使用联合文件系统时应注意以下几点
#### 1减少镜像层数 #### 1. 减少镜像层数
如下代码块所示展示了相关示例 如下代码块所示展示了相关示例
@@ -220,14 +220,14 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
``` ```
#### 2避免在容器中写入大量数据 #### 2. 避免在容器中写入大量数据
容器层的写入性能低于直接写入大量数据应使用 容器层的写入性能低于直接写入大量数据应使用
- 数据卷 (Volume) - 数据卷 (Volume)
- 绑定挂载 (Bind Mount) - 绑定挂载 (Bind Mount)
#### 3使用dockerignore #### 3. 使用 .dockerignore
排除不需要的文件可以 排除不需要的文件可以

View File

@@ -12,9 +12,9 @@ Docker 底层的核心技术包括 Linux 上的命名空间 (Namespaces)、控
随着 Linux 系统对于命名空间功能的完善实现程序员已经可以实现上面的所有需求让某些进程在彼此隔离的命名空间中运行大家虽然都共用一个内核和某些运行时环境 (例如一些系统命令和系统库)但是彼此却看不到都以为系统中只有自己的存在这种机制就是容器 (Container)利用命名空间来做权限的隔离控制利用 cgroups 来做资源分配 随着 Linux 系统对于命名空间功能的完善实现程序员已经可以实现上面的所有需求让某些进程在彼此隔离的命名空间中运行大家虽然都共用一个内核和某些运行时环境 (例如一些系统命令和系统库)但是彼此却看不到都以为系统中只有自己的存在这种机制就是容器 (Container)利用命名空间来做权限的隔离控制利用 cgroups 来做资源分配
* [基本架构](11.1_arch.md) * [基本架构](12.1_arch.md)
* [命名空间](11.2_namespace.md) * [命名空间](12.2_namespace.md)
* [控制组](11.3_cgroups.md) * [控制组](12.3_cgroups.md)
* [联合文件系统](11.4_ufs.md) * [联合文件系统](12.4_ufs.md)
* [容器格式](11.5_container_format.md) * [容器格式](12.5_container_format.md)
* [网络](11.6_network.md) * [网络](12.6_network.md)

View File

@@ -13,9 +13,9 @@
### 12.7.1 延伸阅读 ### 12.7.1 延伸阅读
- [控制组 (Cgroups)](11.3_cgroups.md)资源限制机制 - [控制组 (Cgroups)](12.3_cgroups.md)资源限制机制
- [联合文件系统](11.4_ufs.md)分层存储的实现 - [联合文件系统](12.4_ufs.md)分层存储的实现
- [安全](../17_security/README.md)容器安全实践 - [安全](../18_security/README.md)容器安全实践
- [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html) - [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html)
| 资源 | 限制参数 | 示例 | | 资源 | 限制参数 | 示例 |
@@ -28,8 +28,8 @@
### 12.7.2 延伸阅读 ### 12.7.2 延伸阅读
- [命名空间](11.2_namespace.md)资源隔离 - [命名空间](12.2_namespace.md)资源隔离
- [安全](../17_security/README.md)容器安全概述 - [安全](../18_security/README.md)容器安全概述
- [Docker Stats](../05_container/README.md)监控容器资源 - [Docker Stats](../05_container/README.md)监控容器资源
| 概念 | 说明 | | 概念 | 说明 |

View File

@@ -105,10 +105,10 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
为什么不在一个单一的容器里运行多个程序 为什么不在一个单一的容器里运行多个程序
* 1透明化为了使容器组中的容器保持一致的基础设施和服务比如进程管理和资源监控这样设计是为了用户的便利性 * 1. 透明化为了使容器组中的容器保持一致的基础设施和服务比如进程管理和资源监控这样设计是为了用户的便利性
* 2软件之间的依赖每个容器都可能重新构建和发布Kubernetes 必须支持热发布和热更新 (将来) * 2. 软件之间的依赖每个容器都可能重新构建和发布Kubernetes 必须支持热发布和热更新 (将来)
* 3方便使用用户不必运行独立的程序管理也不用担心每个应用程序的退出状态 * 3. 方便使用用户不必运行独立的程序管理也不用担心每个应用程序的退出状态
* 4高效考虑到基础设施有更多的职责容器必须要轻量化 * 4. 高效考虑到基础设施有更多的职责容器必须要轻量化
#### 容器组的生命状态 #### 容器组的生命状态

View File

@@ -91,5 +91,5 @@ Kubernetes 的学习曲线较陡峭。建议的学习路径:
### 13.1.7 延伸阅读 ### 13.1.7 延伸阅读
- [Minikube 安装](../setup/README.md)本地体验 K8s - [Minikube 安装](../14_kubernetes_setup/README.md)本地体验 K8s
- [Kubernetes 官网](https://kubernetes.io/):官方文档 - [Kubernetes 官网](https://kubernetes.io/):官方文档

View File

@@ -8,7 +8,7 @@
### 14.2.1 安装 Docker ### 14.2.1 安装 Docker
参考[安装 Docker](../../03_install/README.md) 一节安装 Docker 参考[安装 Docker](../03_install/README.md) 一节安装 Docker
### 14.2.2 安装 **kubelet****kubeadm****kubectl** ### 14.2.2 安装 **kubelet****kubeadm****kubectl**

View File

@@ -6,7 +6,7 @@
### 14.1.1 安装 containerd ### 14.1.1 安装 containerd
参考[安装 Docker](../../03_install/README.md) 一节添加 apt/yum 之后执行如下命令 参考[安装 Docker](../03_install/README.md) 一节添加 apt/yum 之后执行如下命令
```bash ```bash
## debian 系 ## debian 系

View File

@@ -1,6 +1,6 @@
## 15.3 etcd 集群 ## 15.3 etcd 集群
下面我们使用 [Docker Compose](../../10_compose/README.md) 模拟启动一个 3 节点的 `etcd` 集群 下面我们使用 [Docker Compose](../11_compose/README.md) 模拟启动一个 3 节点的 `etcd` 集群
编辑 `compose.yaml` ( `docker-compose.yml`) 文件 编辑 `compose.yaml` ( `docker-compose.yml`) 文件

View File

@@ -18,21 +18,21 @@
随着企业业务的扩展单一云平台可能无法满足所有需求多云部署成为趋势 随着企业业务的扩展单一云平台可能无法满足所有需求多云部署成为趋势
#### 1跨云灾备 (Active-Passive) #### 1. 跨云灾备 (Active-Passive)
主要业务运行在一个云 ( AWS)数据实时复制到另一个云 (如阿里云)当主云发生故障时流量切换到备云 主要业务运行在一个云 ( AWS)数据实时复制到另一个云 (如阿里云)当主云发生故障时流量切换到备云
* **优点**架构相对简单数据一致性好控制 * **优点**架构相对简单数据一致性好控制
* **缺点**资源闲置浪费切换可能有 RTO * **缺点**资源闲置浪费切换可能有 RTO
#### 2多活部署 (Active-Active) #### 2. 多活部署 (Active-Active)
业务同时在多个云上运行通过全局流量管理 (DNS/GSLB) 分发流量 业务同时在多个云上运行通过全局流量管理 (DNS/GSLB) 分发流量
* **优点**高可用就近接入提升用户体验 * **优点**高可用就近接入提升用户体验
* **缺点**数据同步复杂跨云网络延迟问题 * **缺点**数据同步复杂跨云网络延迟问题
#### 3混合云 #### 3. 混合云
核心数据和敏感业务保留在私有云 (IDC)弹性业务或前端业务部署在公有云 核心数据和敏感业务保留在私有云 (IDC)弹性业务或前端业务部署在公有云

View File

@@ -30,7 +30,7 @@ flowchart LR
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1命名空间 ### 1. 命名空间
提供进程网络文件系统等资源的隔离 提供进程网络文件系统等资源的隔离
@@ -43,9 +43,9 @@ flowchart LR
| IPC | 进程通信 | 隔离共享内存 | | IPC | 进程通信 | 隔离共享内存 |
| UTS | 主机名 | 独立主机名 | | UTS | 主机名 | 独立主机名 |
详见[命名空间](../../11_implementation/11.2_namespace.md)章节 详见[命名空间](../12_implementation/12.2_namespace.md)章节
### 2控制组 ### 2. 控制组
限制容器的资源使用防止资源耗尽攻击 限制容器的资源使用防止资源耗尽攻击
@@ -63,7 +63,7 @@ $ docker run --cpus=1.5 myapp
$ docker run --device-write-bps /dev/sda:10mb myapp $ docker run --device-write-bps /dev/sda:10mb myapp
``` ```
### 3能力机制 ### 3. 能力机制
Linux root 权限拆分为多个细粒度的能力Docker 默认禁用危险能力 Linux root 权限拆分为多个细粒度的能力Docker 默认禁用危险能力
@@ -155,7 +155,7 @@ $ cosign verify --key cosign.pub $IMAGE
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1 root 用户运行 ### 1. root 用户运行
> 笔者强调这是最重要的安全实践之一 > 笔者强调这是最重要的安全实践之一
@@ -185,7 +185,7 @@ CMD ["node", "server.js"]
$ docker run -u 1001:1001 myapp $ docker run -u 1001:1001 myapp
``` ```
### 2只读文件系统 ### 2. 只读文件系统
运行以下命令 运行以下命令
@@ -199,7 +199,7 @@ $ docker run --read-only myapp
$ docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp $ docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp
``` ```
### 3禁用特权模式 ### 3. 禁用特权模式
运行以下命令 运行以下命令
@@ -213,7 +213,7 @@ $ docker run --privileged myapp
$ docker run --cap-add=SYS_TIME myapp $ docker run --cap-add=SYS_TIME myapp
``` ```
### 4限制资源 ### 4. 限制资源
运行以下命令 运行以下命令
@@ -226,7 +226,7 @@ $ docker run \
myapp myapp
``` ```
### 5网络隔离 ### 5. 网络隔离
运行以下命令 运行以下命令
@@ -247,7 +247,7 @@ $ docker run --network=isolated_net myapp
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1使用精简基础镜像 ### 1. 使用精简基础镜像
Dockerfile 内容如下 Dockerfile 内容如下
@@ -263,7 +263,7 @@ FROM node:22 # ~1GB
FROM ubuntu:24.04 # ~78MB FROM ubuntu:24.04 # ~78MB
``` ```
### 2多阶段构建 ### 2. 多阶段构建
Dockerfile 内容如下 Dockerfile 内容如下
@@ -283,7 +283,7 @@ USER node
CMD ["node", "/app/server.js"] CMD ["node", "/app/server.js"]
``` ```
### 3不存储敏感信息 ### 3. 不存储敏感信息
Dockerfile 内容如下 Dockerfile 内容如下
@@ -300,7 +300,7 @@ COPY .env /app/
... ...
``` ```
### 4固定依赖版本 ### 4. 固定依赖版本
Dockerfile 内容如下 Dockerfile 内容如下
@@ -371,14 +371,14 @@ $ docker run --runtime=runsc myapp
随着软件供应链攻击日益频繁仅保障运行时安全已不足够 随着软件供应链攻击日益频繁仅保障运行时安全已不足够
### 1SBOM (软件物料清单) ### 1. SBOM (软件物料清单)
SBOM 类似于食品的配料表列出了容器镜像中包含的所有软件包及其版本 SBOM 类似于食品的配料表列出了容器镜像中包含的所有软件包及其版本
- **生成 SBOM**使用 `docker buildx build --sbom` `docker scout sbom` - **生成 SBOM**使用 `docker buildx build --sbom` `docker scout sbom`
- **管理 SBOM**确保持续监控 SBOM 中的组件是否存在新披露的漏洞 - **管理 SBOM**确保持续监控 SBOM 中的组件是否存在新披露的漏洞
### 2镜像签名 (Sigstore / Notary v2) ### 2. 镜像签名 (Sigstore / Notary v2)
确保镜像在构建后未被篡改且确实来自可信的发布者 确保镜像在构建后未被篡改且确实来自可信的发布者
@@ -419,6 +419,6 @@ $ cosign verify --key cosign.pub $IMAGE
## 延伸阅读 ## 延伸阅读
- [命名空间](../../11_implementation/11.2_namespace.md)隔离机制详解 - [命名空间](../12_implementation/12.2_namespace.md)隔离机制详解
- [控制组](../../11_implementation/11.3_cgroups.md)资源限制详解 - [控制组](../12_implementation/12.3_cgroups.md)资源限制详解
- [最佳实践](../../appendix/20.1_best_practices.md)Dockerfile 安全配置 - [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 安全配置

View File

@@ -15,7 +15,7 @@ ELK (ElasticsearchLogstashKibana) 是目前业界最流行的开源日志
我们将使用 Docker Compose 来一键部署整个日志堆栈 我们将使用 Docker Compose 来一键部署整个日志堆栈
#### 1编写 Compose 文件 #### 1. 编写 Compose 文件
1. 编写 `compose.yaml` ( `docker-compose.yml`) 配置如下 1. 编写 `compose.yaml` ( `docker-compose.yml`) 配置如下
@@ -71,7 +71,7 @@ networks:
logging: logging:
``` ```
#### 2配置 Fluentd #### 2. 配置 Fluentd
创建 `fluentd/conf/fluent.conf` 创建 `fluentd/conf/fluent.conf`
@@ -102,7 +102,7 @@ networks:
</match> </match>
``` ```
#### 3配置应用容器使用 fluentd 驱动 #### 3. 配置应用容器使用 fluentd 驱动
启动一个测试容器指定日志驱动为 `fluentd` 启动一个测试容器指定日志驱动为 `fluentd`
@@ -117,7 +117,7 @@ docker run -d \
**注意**确保 `fluentd` 容器已经启动并监听在 `localhost:24224`在生产环境中如果你是在不同机器上需要将 `localhost` 替换为运行 fluentd 的主机 IP **注意**确保 `fluentd` 容器已经启动并监听在 `localhost:24224`在生产环境中如果你是在不同机器上需要将 `localhost` 替换为运行 fluentd 的主机 IP
#### 4 Kibana 中查看日志 #### 4. Kibana 中查看日志
1. 访问 `http://localhost:5601` 1. 访问 `http://localhost:5601`
2. 进入 **Management**->**Kibana**->**Index Patterns** 2. 进入 **Management**->**Kibana**->**Index Patterns**

View File

@@ -17,7 +17,7 @@ Prometheus 的主要组件包括:
我们可以使用 Docker Compose 快速部署一套 Prometheus + Grafana 监控环境 我们可以使用 Docker Compose 快速部署一套 Prometheus + Grafana 监控环境
#### 1准备配置文件 #### 1. 准备配置文件
创建 `prometheus.yml` 创建 `prometheus.yml`
@@ -39,7 +39,7 @@ scrape_configs:
- targets: ['cadvisor:8080'] - targets: ['cadvisor:8080']
``` ```
#### 2编写 Docker Compose 文件 #### 2. 编写 Docker Compose 文件
创建 `compose.yaml` ( `docker-compose.yml`) 创建 `compose.yaml` ( `docker-compose.yml`)
@@ -88,7 +88,7 @@ networks:
monitoring: monitoring:
``` ```
#### 3启动服务 #### 3. 启动服务
运行以下命令 运行以下命令

View File

@@ -16,7 +16,7 @@
本节涵盖了相关内容与详细描述主要探讨以下几个方面 本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1Dockerfile 多阶段构建 #### 1. Dockerfile 多阶段构建
使用 Docker 多阶段构建可以有效减小镜像体积 使用 Docker 多阶段构建可以有效减小镜像体积
@@ -39,7 +39,7 @@ COPY --from=builder /app/main .
CMD ["./main"] CMD ["./main"]
``` ```
#### 2GitLab CI 配置 #### 2. GitLab CI 配置
GitLab CI (gitlab-ci.yml) 配置如下 GitLab CI (gitlab-ci.yml) 配置如下

View File

@@ -26,7 +26,7 @@
应该保证在一个容器中只运行一个进程将多个应用解耦到不同容器中保证了容器的横向扩展和复用例如 web 应用应该包含三个容器web 应用数据库缓存 应该保证在一个容器中只运行一个进程将多个应用解耦到不同容器中保证了容器的横向扩展和复用例如 web 应用应该包含三个容器web 应用数据库缓存
如果容器互相依赖你可以使用 [Docker 自定义网络](../08_data_network/network/README.md)来把这些容器连接起来 如果容器互相依赖你可以使用 [Docker 自定义网络](../09_network/custom_network.md)来把这些容器连接起来
#### 镜像层数尽可能少 #### 镜像层数尽可能少

View File

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