mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
Fix missing links
This commit is contained in:
@@ -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)章节。
|
||||||
|
|
||||||
#### 概述
|
#### 概述
|
||||||
|
|
||||||
|
|||||||
@@ -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. 需要特殊内核的场景
|
||||||
|
|
||||||
容器使用宿主机内核。如果应用需要特定版本的内核或内核模块,可能需要虚拟机。
|
容器使用宿主机内核。如果应用需要特定版本的内核或内核模块,可能需要虚拟机。
|
||||||
|
|
||||||
#### 3。Windows 原生应用
|
#### 3. Windows 原生应用
|
||||||
|
|
||||||
虽然 Docker 支持 Windows 容器,但生态不如 Linux 容器成熟。传统 Windows 应用的容器化仍有挑战。
|
虽然 Docker 支持 Windows 容器,但生态不如 Linux 容器成熟。传统 Windows 应用的容器化仍有挑战。
|
||||||
|
|
||||||
#### 4。桌面应用
|
#### 4. 桌面应用
|
||||||
|
|
||||||
Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行,但通常得不偿失。
|
Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行,但通常得不偿失。
|
||||||
|
|
||||||
|
|||||||
@@ -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 哈希:
|
||||||
|
|
||||||
|
|||||||
@@ -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)。
|
||||||
|
|||||||
@@ -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 和数据持久化详解
|
||||||
|
|
||||||
| 概念 | 要点 |
|
| 概念 | 要点 |
|
||||||
|------|------|
|
|------|------|
|
||||||
|
|||||||
@@ -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 等文件系统的具体实现原理,包括 WorkDir、UpperDir、LowerDir 等底层细节,请阅读 **[第十一章 底层实现](../11_implementation/README.md)** 中的 **[联合文件系统](../11_implementation/11.4_ufs.md)** 章节。
|
> 想要深入了解 Overlay2 等文件系统的具体实现原理,包括 WorkDir、UpperDir、LowerDir 等底层细节,请阅读 **[第十二章 底层实现](../12_implementation/README.md)** 中的 **[联合文件系统](../12_implementation/12.4_ufs.md)** 章节。
|
||||||
|
|||||||
@@ -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):清理数据卷
|
||||||
|
|||||||
@@ -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)。
|
||||||
|
|||||||
@@ -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):管理多个后台容器的更好方式
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|
||||||
|
|||||||
@@ -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):数据卷管理
|
||||||
|
|||||||
@@ -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 会对官方镜像和付费用户的镜像进行安全扫描。在镜像标签页可以看到漏洞扫描结果。
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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. 只检查核心依赖
|
||||||
|
|
||||||
健康检查应主要关注 **当前服务** 是否可用,而不是检查其下游依赖 (数据库等)。下游依赖的检查应由应用逻辑处理。
|
健康检查应主要关注 **当前服务** 是否可用,而不是检查其下游依赖 (数据库等)。下游依赖的检查应由应用逻辑处理。
|
||||||
|
|
||||||
|
|||||||
@@ -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` 指令产生了临时文件,最好在同一个指令链中清理,或者提供机制让子镜像清理。
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 3。Windows 环境
|
#### 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,这会使构建过程难以理解和调试。尽量在头部定义一次即可。
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ RUN ["executable", "param1", "param2"]
|
|||||||
|
|
||||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||||
|
|
||||||
#### 1。Shell 格式
|
#### 1. Shell 格式
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ RUN apt-get update
|
|||||||
RUN echo "Hello" > /test.txt
|
RUN echo "Hello" > /test.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 2。Exec 格式
|
#### 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,而不将其记录在镜像中。
|
||||||
|
|
||||||
|
|||||||
@@ -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. 明确复制路径
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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. 解压后清理
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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 使用
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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 脚本能正确传递信号:
|
||||||
|
|
||||||
|
|||||||
@@ -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. 使用有意义的变量名
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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 提高构建灵活性
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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 用途
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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. 与应用实际端口保持一致
|
||||||
|
|
||||||
如下代码块所示,展示了相关示例:
|
如下代码块所示,展示了相关示例:
|
||||||
|
|
||||||
|
|||||||
@@ -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 中的端口配置
|
||||||
|
|||||||
@@ -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. 注意路径安全
|
||||||
|
|
||||||
运行以下命令:
|
运行以下命令:
|
||||||
|
|
||||||
|
|||||||
@@ -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 存储的底层原理
|
||||||
|
|||||||
@@ -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 中的网络配置
|
||||||
|
|||||||
@@ -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`
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 和数据持久化详解
|
||||||
|
|||||||
@@ -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):数据持久化
|
||||||
|
|||||||
@@ -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 的核心文件、插件、主题和上传的媒体文件
|
||||||
|
|
||||||
#### 3。PHP 配置优化
|
#### 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):官方镜像文档
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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):数据卷管理
|
||||||
|
|||||||
@@ -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):镜像如何存储
|
||||||
|
|||||||
@@ -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. 监控资源使用
|
||||||
|
|
||||||
运行以下命令:
|
运行以下命令:
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
排除不需要的文件可以:
|
排除不需要的文件可以:
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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):监控容器资源
|
||||||
|
|
||||||
| 概念 | 说明 |
|
| 概念 | 说明 |
|
||||||
|
|||||||
@@ -105,10 +105,10 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中,有两个接
|
|||||||
|
|
||||||
为什么不在一个单一的容器里运行多个程序?
|
为什么不在一个单一的容器里运行多个程序?
|
||||||
|
|
||||||
* 1。透明化。为了使容器组中的容器保持一致的基础设施和服务,比如进程管理和资源监控。这样设计是为了用户的便利性。
|
* 1. 透明化。为了使容器组中的容器保持一致的基础设施和服务,比如进程管理和资源监控。这样设计是为了用户的便利性。
|
||||||
* 2。解偶软件之间的依赖。每个容器都可能重新构建和发布,Kubernetes 必须支持热发布和热更新 (将来)。
|
* 2. 解耦软件之间的依赖。每个容器都可能重新构建和发布,Kubernetes 必须支持热发布和热更新 (将来)。
|
||||||
* 3。方便使用。用户不必运行独立的程序管理,也不用担心每个应用程序的退出状态。
|
* 3. 方便使用。用户不必运行独立的程序管理,也不用担心每个应用程序的退出状态。
|
||||||
* 4。高效。考虑到基础设施有更多的职责,容器必须要轻量化。
|
* 4. 高效。考虑到基础设施有更多的职责,容器必须要轻量化。
|
||||||
|
|
||||||
#### 容器组的生命状态
|
#### 容器组的生命状态
|
||||||
|
|
||||||
|
|||||||
@@ -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/):官方文档
|
||||||
|
|||||||
@@ -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**
|
||||||
|
|
||||||
|
|||||||
@@ -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 系
|
||||||
|
|||||||
@@ -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`) 文件
|
||||||
|
|
||||||
|
|||||||
@@ -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),弹性业务或前端业务部署在公有云。
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|||||||
|
|
||||||
随着软件供应链攻击日益频繁,仅保障运行时安全已不足够。
|
随着软件供应链攻击日益频繁,仅保障运行时安全已不足够。
|
||||||
|
|
||||||
### 1。SBOM (软件物料清单)
|
### 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 安全配置
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ ELK (Elasticsearch,Logstash,Kibana) 是目前业界最流行的开源日志
|
|||||||
|
|
||||||
我们将使用 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**。
|
||||||
|
|||||||
@@ -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. 启动服务
|
||||||
|
|
||||||
运行以下命令:
|
运行以下命令:
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||||
|
|
||||||
#### 1。Dockerfile 多阶段构建
|
#### 1. Dockerfile 多阶段构建
|
||||||
|
|
||||||
使用 Docker 多阶段构建可以有效减小镜像体积。
|
使用 Docker 多阶段构建可以有效减小镜像体积。
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ COPY --from=builder /app/main .
|
|||||||
CMD ["./main"]
|
CMD ["./main"]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 2。GitLab CI 配置
|
#### 2. GitLab CI 配置
|
||||||
|
|
||||||
GitLab CI (。gitlab-ci.yml) 配置如下:
|
GitLab CI (。gitlab-ci.yml) 配置如下:
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web 应用、数据库、缓存。
|
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web 应用、数据库、缓存。
|
||||||
|
|
||||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../08_data_network/network/README.md)来把这些容器连接起来。
|
如果容器互相依赖,你可以使用 [Docker 自定义网络](../09_network/custom_network.md)来把这些容器连接起来。
|
||||||
|
|
||||||
#### 镜像层数尽可能少
|
#### 镜像层数尽可能少
|
||||||
|
|
||||||
|
|||||||
@@ -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):统一图号命名、图题写法与章节风格。
|
* **出版清稿规范 (图号与章节风格)**:统一图号命名、图题写法与章节风格。(本仓库暂未收录对应文件)
|
||||||
|
|||||||
Reference in New Issue
Block a user