Continue to fix format issues

This commit is contained in:
Baohua Yang
2026-02-21 10:47:37 -08:00
parent b5ce572b42
commit 1203dee81e
48 changed files with 667 additions and 727 deletions
-9
View File
@@ -118,12 +118,3 @@ Docker 的发展历程:
- **至今**[GitHub 项目](https://github.com/moby/moby) 超过 7 万星标
Docker 的成功推动了整个容器生态的发展催生了 KubernetesPodman 等众多相关项目笔者认为Docker 最大的贡献不仅是技术本身更是它**让容器技术从系统管理员的工具变成了每个开发者都能使用的标准工具**
### 本章小结
- Docker 是一种轻量级虚拟化技术核心价值是**环境一致性**
- 与虚拟机相比Docker 更轻量更快速资源利用率更高
- Docker 基于 Linux 内核的 NamespaceCgroups Union FS 技术
- Docker 推动了容器技术的标准化OCI和生态发展
接下来让我们了解[为什么要使用 Docker](1.3_why.md)
-6
View File
@@ -226,9 +226,3 @@ Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行
| 单机支持量 | 上千个容器 | 几十个虚拟机 |
| 隔离性 | 进程级别 | 完全隔离 |
| 最佳场景 | 微服务CI/CD开发环境 | 多租户高安全需求 |
### 本章小结
Docker 的核心价值可以用一句话概括**让应用的开发测试部署保持一致同时极大提高资源利用效率**笔者认为对于现代软件开发者来说Docker 已经不是"要不要学"的问题而是**必备技能**无论你是前端后端运维还是全栈开发者掌握 Docker 都能让你的工作更高效
接下来让我们学习 Docker [基本概念](../02_basic_concept/README.md)
+8
View File
@@ -0,0 +1,8 @@
## 本章小结
- Docker 是一种轻量级虚拟化技术核心价值是**环境一致性**
- 与虚拟机相比Docker 更轻量更快速资源利用率更高
- Docker 基于 Linux 内核的 NamespaceCgroups Union FS 技术
- Docker 推动了容器技术的标准化OCI和生态发展
Docker 的核心价值可以用一句话概括**让应用的开发测试部署保持一致同时极大提高资源利用效率**笔者认为对于现代软件开发者来说Docker 已经不是"要不要学"的问题而是**必备技能**无论你是前端后端运维还是全栈开发者掌握 Docker 都能让你的工作更高效
-18
View File
@@ -211,21 +211,3 @@ Docker 镜像可以通过以下方式获取:
| ** Dockerfile 构建** | 自定义镜像 | `docker build -t myapp .` |
| **从容器提交** | 保存容器状态不推荐 | `docker commit` |
| **从文件导入** | 离线传输 | `docker load < image.tar` |
### 本章小结
| 概念 | 要点 |
|------|------|
| **镜像是什么** | 只读的应用模板包含运行所需的一切 |
| **分层存储** | 多层叠加共享基础层节省空间 |
| **只读特性** | 构建后不可修改保证一致性 |
| **层的陷阱** | 删除操作只是标记不减小体积 |
理解了镜像接下来让我们学习[容器](2.2_container.md)镜像的运行实例
### 延伸阅读
- [获取镜像](../04_image/4.1_pull.md) Registry 下载镜像
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md)创建自己的镜像
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)构建高质量镜像的技巧
- [底层实现 - 联合文件系统](../14_implementation/14.4_ufs.md)深入理解分层存储的技术原理
-19
View File
@@ -235,22 +235,3 @@ Docker 容器通过以下 Namespace 实现隔离:
| **USER** | 用户 | 独立的用户和组 ID |
> 想深入了解请阅读[底层实现 - 命名空间](../14_implementation/14.2_namespace.md)
### 本章小结
| 概念 | 要点 |
|------|------|
| **容器是什么** | 镜像的运行实例本质是隔离的进程 |
| **容器 vs 虚拟机** | 共享内核更轻量但隔离性较弱 |
| **存储层** | 可写层随容器删除而消失 |
| **数据持久化** | 使用 Volume Bind Mount |
| **生命周期** | 与主进程PID 1绑定 |
理解了镜像和容器接下来让我们学习[仓库](2.3_repository.md)存储和分发镜像的服务
### 延伸阅读
- [启动容器](../05_container/5.1_run.md)详细的容器启动选项
- [后台运行](../05_container/5.2_daemon.md)理解容器为什么会"立即退出"
- [进入容器](../05_container/5.4_attach_exec.md)如何操作运行中的容器
- [数据管理](../08_data_network/README.md)Volume 和数据持久化详解
-19
View File
@@ -280,22 +280,3 @@ $ docker scout cves nginx:latest
$ trivy image nginx:latest
```
### 本章小结
| 概念 | 要点 |
|------|------|
| **Registry** | 存储和分发镜像的服务 |
| **仓库Repository** | 同一软件的镜像集合 |
| **标签Tag** | 版本标识默认为 latest |
| **Docker Hub** | 默认的公共 Registry |
| **私有 Registry** | 企业内部使用推荐 Harbor |
现在你已经了解了 Docker 的三个核心概念[镜像](2.1_image.md)[容器](2.2_container.md)和仓库接下来让我们开始[安装 Docker](../03_install/README.md)动手实践
### 延伸阅读
- [Docker Hub](../06_repository/6.1_dockerhub.md)Docker Hub 的详细使用
- [私有仓库](../06_repository/6.2_registry.md)搭建私有 Registry
- [私有仓库高级配置](../06_repository/6.3_registry_auth.md)认证TLS 配置
- [镜像加速器](../03_install/3.9_mirror.md)配置镜像加速
+51
View File
@@ -0,0 +1,51 @@
## 本章小结
| 概念 | 要点 |
|------|------|
| **镜像是什么** | 只读的应用模板包含运行所需的一切 |
| **分层存储** | 多层叠加共享基础层节省空间 |
| **只读特性** | 构建后不可修改保证一致性 |
| **层的陷阱** | 删除操作只是标记不减小体积 |
理解了镜像接下来让我们学习[容器](2.2_container.md)镜像的运行实例
### 延伸阅读
- [获取镜像](../04_image/4.1_pull.md) Registry 下载镜像
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md)创建自己的镜像
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)构建高质量镜像的技巧
- [底层实现 - 联合文件系统](../14_implementation/14.4_ufs.md)深入理解分层存储的技术原理
| 概念 | 要点 |
|------|------|
| **容器是什么** | 镜像的运行实例本质是隔离的进程 |
| **容器 vs 虚拟机** | 共享内核更轻量但隔离性较弱 |
| **存储层** | 可写层随容器删除而消失 |
| **数据持久化** | 使用 Volume Bind Mount |
| **生命周期** | 与主进程PID 1绑定 |
理解了镜像和容器接下来让我们学习[仓库](2.3_repository.md)存储和分发镜像的服务
### 延伸阅读
- [启动容器](../05_container/5.1_run.md)详细的容器启动选项
- [后台运行](../05_container/5.2_daemon.md)理解容器为什么会"立即退出"
- [进入容器](../05_container/5.4_attach_exec.md)如何操作运行中的容器
- [数据管理](../08_data_network/README.md)Volume 和数据持久化详解
| 概念 | 要点 |
|------|------|
| **Registry** | 存储和分发镜像的服务 |
| **仓库Repository** | 同一软件的镜像集合 |
| **标签Tag** | 版本标识默认为 latest |
| **Docker Hub** | 默认的公共 Registry |
| **私有 Registry** | 企业内部使用推荐 Harbor |
现在你已经了解了 Docker 的三个核心概念[镜像](2.1_image.md)[容器](2.2_container.md)和仓库接下来让我们开始[安装 Docker](../03_install/README.md)动手实践
### 延伸阅读
- [Docker Hub](../06_repository/6.1_dockerhub.md)Docker Hub 的详细使用
- [私有仓库](../06_repository/6.2_registry.md)搭建私有 Registry
- [私有仓库高级配置](../06_repository/6.3_registry_auth.md)认证TLS 配置
- [镜像加速器](../03_install/3.9_mirror.md)配置镜像加速
-16
View File
@@ -249,19 +249,3 @@ $ docker system prune
```
---
### 本章小结
| 操作 | 命令 |
|------|------|
| 拉取镜像 | `docker pull 镜像名:标签` |
| 拉取所有标签 | `docker pull -a 镜像名` |
| 指定平台 | `docker pull --platform linux/amd64 镜像名` |
| 用摘要拉取 | `docker pull 镜像名@sha256:...` |
### 延伸阅读
- [列出镜像](4.2_list.md)查看本地镜像
- [删除镜像](4.3_rm.md)清理本地镜像
- [镜像加速器](../03_install/3.9_mirror.md)加速镜像下载
- [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库
-18
View File
@@ -283,21 +283,3 @@ $ docker images --format "{{.Repository}}:{{.Tag}}" > images.txt
```
---
### 本章小结
| 操作 | 命令 |
|------|------|
| 列出所有镜像 | `docker images` |
| 按仓库名过滤 | `docker images nginx` |
| 列出虚悬镜像 | `docker images -f dangling=true` |
| 只输出 ID | `docker images -q` |
| 显示摘要 | `docker images --digests` |
| 自定义格式 | `docker images --format "..."` |
| 查看空间占用 | `docker system df` |
### 延伸阅读
- [获取镜像](4.1_pull.md) Registry 拉取镜像
- [删除镜像](4.3_rm.md)清理本地镜像
- [镜像](../02_basic_concept/2.1_image.md)理解镜像概念
-17
View File
@@ -287,20 +287,3 @@ Build Cache 0 0 0B 0B
```
---
### 本章小结
| 操作 | 命令 |
|------|------|
| 删除指定镜像 | `docker rmi 镜像名:标签` |
| 强制删除 | `docker rmi -f 镜像名` |
| 删除虚悬镜像 | `docker image prune` |
| 删除未使用镜像 | `docker image prune -a` |
| 批量删除 | `docker rmi $(docker images -q -f ...)` |
| 查看空间占用 | `docker system df` |
### 延伸阅读
- [列出镜像](4.2_list.md)查看和过滤镜像
- [删除容器](../05_container/5.6_rm.md)清理容器
- [数据卷](../08_data_network/data/volume.md)清理数据卷
+46
View File
@@ -0,0 +1,46 @@
## 本章小结
| 操作 | 命令 |
|------|------|
| 拉取镜像 | `docker pull 镜像名:标签` |
| 拉取所有标签 | `docker pull -a 镜像名` |
| 指定平台 | `docker pull --platform linux/amd64 镜像名` |
| 用摘要拉取 | `docker pull 镜像名@sha256:...` |
### 延伸阅读
- [列出镜像](4.2_list.md)查看本地镜像
- [删除镜像](4.3_rm.md)清理本地镜像
- [镜像加速器](../03_install/3.9_mirror.md)加速镜像下载
- [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库
| 操作 | 命令 |
|------|------|
| 列出所有镜像 | `docker images` |
| 按仓库名过滤 | `docker images nginx` |
| 列出虚悬镜像 | `docker images -f dangling=true` |
| 只输出 ID | `docker images -q` |
| 显示摘要 | `docker images --digests` |
| 自定义格式 | `docker images --format "..."` |
| 查看空间占用 | `docker system df` |
### 延伸阅读
- [获取镜像](4.1_pull.md) Registry 拉取镜像
- [删除镜像](4.3_rm.md)清理本地镜像
- [镜像](../02_basic_concept/2.1_image.md)理解镜像概念
| 操作 | 命令 |
|------|------|
| 删除指定镜像 | `docker rmi 镜像名:标签` |
| 强制删除 | `docker rmi -f 镜像名` |
| 删除虚悬镜像 | `docker image prune` |
| 删除未使用镜像 | `docker image prune -a` |
| 批量删除 | `docker rmi $(docker images -q -f ...)` |
| 查看空间占用 | `docker system df` |
### 延伸阅读
- [列出镜像](4.2_list.md)查看和过滤镜像
- [删除容器](../05_container/5.6_rm.md)清理容器
- [数据卷](../08_data_network/data/volume.md)清理数据卷
+15 -40
View File
@@ -62,30 +62,21 @@ root@af8bae53bdd3:/# exit # 退出容器
执行 `docker run` Docker 在后台完成以下操作
```
┌─────────────────────────────────────────────────────────────────────┐
docker run ubuntu:24.04 /bin/echo "Hello" │
└───────────────────────────────┬─────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 1. 检查本地是否有 ubuntu:24.04 镜像 │
│ ├── 有 → 使用本地镜像 │
│ └── 无 → 从 Registry 下载 │
├─────────────────────────────────────────────────────────────────────┤
│ 2. 创建容器 │
│ • 基于镜像的只读层 │
│ • 添加一层可读写层(容器存储层) │
├─────────────────────────────────────────────────────────────────────┤
│ 3. 配置网络 │
│ • 创建虚拟网卡 │
│ • 分配 IP 地址 │
│ • 连接到 Docker 网桥 │
├─────────────────────────────────────────────────────────────────────┤
│ 4. 启动容器,执行指定命令 │
├─────────────────────────────────────────────────────────────────────┤
│ 5. 命令执行完毕,容器停止 │
└─────────────────────────────────────────────────────────────────────┘
```mermaid
flowchart TD
Cmd["docker run ubuntu:24.04 /bin/echo 'Hello'"] --> Step1
Step1{"1. 检查本地是否有 ubuntu:24.04 镜像"}
Step1 -- 有 --> Step1_Yes["使用本地镜像"]
Step1 -- 无 --> Step1_No["从 Registry 下载"]
Step1_Yes --> Step2
Step1_No --> Step2
Step2["2. 创建容器<br/>• 基于镜像的只读层<br/>• 添加一层可读写层(容器存储层)"] --> Step3
Step3["3. 配置网络<br/>• 创建虚拟网卡<br/>• 分配 IP 地址<br/>• 连接到 Docker 网桥"] --> Step4
Step4["4. 启动容器,执行指定命令"] --> Step5
Step5["5. 命令执行完毕,容器停止"]
```
### 常用启动选项
@@ -241,19 +232,3 @@ $ docker run -v mydata:/app/data myapp
```
详见[数据管理](../08_data_network/README.md)
### 本章小结
| 操作 | 命令 | 说明 |
|------|------|------|
| 新建并运行 | `docker run` | 最常用的启动方式 |
| 交互式启动 | `docker run -it` | 用于调试或临时操作 |
| 后台运行 | `docker run -d` | 用于服务类应用 |
| 启动已停止的容器 | `docker start` | 重用已有容器 |
### 延伸阅读
- [后台运行](5.2_daemon.md)理解 `-d` 参数和容器生命周期
- [进入容器](5.4_attach_exec.md)操作运行中的容器
- [网络配置](../08_data_network/network/README.md)理解端口映射的原理
- [数据管理](../08_data_network/README.md)数据持久化方案
-16
View File
@@ -258,19 +258,3 @@ $ docker inspect 容器名
```
---
### 本章小结
| 操作 | 命令 | 说明 |
|------|------|------|
| 优雅停止 | `docker stop` | SIGTERM超时后 SIGKILL |
| 强制停止 | `docker kill` | 直接 SIGKILL |
| 重新启动 | `docker start` | 启动已停止的容器 |
| 重启 | `docker restart` | 停止后立即启动 |
| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 |
### 延伸阅读
- [启动容器](../05_container/5.1_run.md)容器启动详解
- [删除容器](5.6_rm.md)清理容器
- [容器日志](5.2_daemon.md)排查停止原因
+23 -25
View File
@@ -198,17 +198,29 @@ CONTAINER ID IMAGE STATUS NAMES
| **适用场景** | 调试临时操作 | 查看主进程输出 |
| **推荐程度** | 推荐 | 特殊场景使用 |
```
docker exec docker attach
容器 容器
PID 1: nginx PID 1: bash 附加到主进程
PID 50: bash 新进程
退出 bash 不影响 nginx 退出 bash 容器停止
```mermaid
flowchart LR
subgraph Exec ["docker exec"]
direction TB
subgraph Container1 ["容器"]
E_PID1["PID 1: nginx"]
E_PID50["PID 50: bash"]
end
NewProc["新进程"] -- 附加到 --> E_PID50
end
subgraph Attach ["docker attach"]
direction TB
subgraph Container2 ["容器"]
A_PID1["PID 1: bash"]
end
MainProc["附加到主进程"] --> A_PID1
end
note1["退出 bash 不影响 nginx"]
note2["退出 bash 容器停止"]
Container1 -.-> note1
Container2 -.-> note2
```
---
@@ -280,17 +292,3 @@ $ docker exec -u root -it myapp bash
```
---
### 本章小结
| 需求 | 推荐命令 |
|------|---------|
| 进入容器调试 | `docker exec -it 容器名 bash` |
| 执行单条命令 | `docker exec 容器名 命令` |
| 查看主进程输出 | `docker attach 容器名`慎用 |
### 延伸阅读
- [后台运行](5.2_daemon.md)理解容器主进程
- [查看容器](5.1_run.md)列出和过滤容器
- [容器日志](5.2_daemon.md)查看容器输出
-16
View File
@@ -265,19 +265,3 @@ $ docker system prune -a --volumes
```
---
### 本章小结
| 操作 | 命令 |
|------|------|
| 删除已停止容器 | `docker rm 容器名` |
| 强制删除运行中容器 | `docker rm -f 容器名` |
| 删除容器及匿名卷 | `docker rm -v 容器名` |
| 清理所有已停止容器 | `docker container prune` |
| 删除所有容器 | `docker rm -f $(docker ps -aq)` |
### 延伸阅读
- [终止容器](5.3_stop.md)优雅停止容器
- [删除镜像](../04_image/4.3_rm.md)清理镜像
- [数据卷](../08_data_network/data/volume.md)数据卷管理
+55
View File
@@ -0,0 +1,55 @@
## 本章小结
| 操作 | 命令 | 说明 |
|------|------|------|
| 新建并运行 | `docker run` | 最常用的启动方式 |
| 交互式启动 | `docker run -it` | 用于调试或临时操作 |
| 后台运行 | `docker run -d` | 用于服务类应用 |
| 启动已停止的容器 | `docker start` | 重用已有容器 |
### 延伸阅读
- [后台运行](5.2_daemon.md)理解 `-d` 参数和容器生命周期
- [进入容器](5.4_attach_exec.md)操作运行中的容器
- [网络配置](../08_data_network/network/README.md)理解端口映射的原理
- [数据管理](../08_data_network/README.md)数据持久化方案
| 操作 | 命令 | 说明 |
|------|------|------|
| 优雅停止 | `docker stop` | SIGTERM超时后 SIGKILL |
| 强制停止 | `docker kill` | 直接 SIGKILL |
| 重新启动 | `docker start` | 启动已停止的容器 |
| 重启 | `docker restart` | 停止后立即启动 |
| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 |
### 延伸阅读
- [启动容器](../05_container/5.1_run.md)容器启动详解
- [删除容器](5.6_rm.md)清理容器
- [容器日志](5.2_daemon.md)排查停止原因
| 需求 | 推荐命令 |
|------|---------|
| 进入容器调试 | `docker exec -it 容器名 bash` |
| 执行单条命令 | `docker exec 容器名 命令` |
| 查看主进程输出 | `docker attach 容器名`慎用 |
### 延伸阅读
- [后台运行](5.2_daemon.md)理解容器主进程
- [查看容器](5.1_run.md)列出和过滤容器
- [容器日志](5.2_daemon.md)查看容器输出
| 操作 | 命令 |
|------|------|
| 删除已停止容器 | `docker rm 容器名` |
| 强制删除运行中容器 | `docker rm -f 容器名` |
| 删除容器及匿名卷 | `docker rm -v 容器名` |
| 清理所有已停止容器 | `docker container prune` |
| 删除所有容器 | `docker rm -f $(docker ps -aq)` |
### 延伸阅读
- [终止容器](5.3_stop.md)优雅停止容器
- [删除镜像](../04_image/4.3_rm.md)清理镜像
- [数据卷](../08_data_network/data/volume.md)数据卷管理
-14
View File
@@ -125,17 +125,3 @@ Docker Hub 会对官方镜像和付费用户的镜像进行安全扫描。在镜
链接 GitHub/Bitbucket 仓库后当代码有提交或打标签时Docker Hub 会自动运行构建这保证了镜像总是与代码同步且由可信的官方环境构建
---
### 本章小结
| 功能 | 说明 |
|------|------|
| **官方镜像** | 优先使用的基础镜像 |
| **拉取限制** | 匿名 100/6h登录 200/6h |
| **安全** | 推荐开启 2FA 并使用 Access Token |
| **自动化** | 支持 Webhooks 和自动构建 |
### 延伸阅读
- [私有仓库](6.2_registry.md)搭建自己的 Registry
- [镜像加速器](../03_install/3.9_mirror.md)加速下载
+13
View File
@@ -0,0 +1,13 @@
## 本章小结
| 功能 | 说明 |
|------|------|
| **官方镜像** | 优先使用的基础镜像 |
| **拉取限制** | 匿名 100/6h登录 200/6h |
| **安全** | 推荐开启 2FA 并使用 Access Token |
| **自动化** | 支持 Webhooks 和自动构建 |
### 延伸阅读
- [私有仓库](6.2_registry.md)搭建自己的 Registry
- [镜像加速器](../03_install/3.9_mirror.md)加速下载
-16
View File
@@ -188,19 +188,3 @@ $ docker run -w /tmp myimage pwd
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 设置后续指令的工作目录 |
| **语法** | `WORKDIR /path` |
| **自动创建** | 目录不存在会自动创建 |
| **持久性** | 影响后续所有指令直到下次 WORKDIR |
| **不要用** | `RUN cd /path`无效 |
### 延伸阅读
- [COPY 复制文件](7.2_copy.md)文件复制
- [RUN 执行命令](../04_image/4.5_build.md)执行构建命令
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
+12 -29
View File
@@ -15,20 +15,19 @@ USER <UID>[:<GID>]
> 笔者强调以非 root 用户运行容器是最重要的安全实践之一
```
root 用户运行的风险
容器内 root 可能逃逸 宿主机 root
漏洞利用 完全控制宿主机
```mermaid
flowchart LR
subgraph Root ["root 用户运行的风险:"]
direction TB
R_C["容器内 root"] -- 可能逃逸 --> R_H["宿主机 root"]
R_C -- 漏洞利用 --> R_Control["完全控制宿主机"]
end
root 用户运行
容器内普通用户 逃逸后 宿主机普通用户
权限受限危害降低 无法控制系统
subgraph NonRoot ["非 root 用户运行:"]
direction TB
NR_C["容器内普通用户"] -- 逃逸后 --> NR_H["宿主机普通用户"]
NR_C -- 权限受限危害降低 --> NR_Safe["无法控制系统"]
end
```
---
@@ -279,19 +278,3 @@ RUN mkdir -p /app/data && chown appuser:appuser /app/data
2. 在运行时映射端口`docker run -p 80:8080`
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 切换后续指令的执行用户 |
| **语法** | `USER username` `USER UID:GID` |
| **前提** | 用户必须已存在 |
| **运行时覆盖** | `docker run -u` |
| **切换工具** | 使用 gosu不用 su/sudo |
### 延伸阅读
- [安全](../11_ops/security/README.md)容器安全实践
- [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 安全
-16
View File
@@ -195,19 +195,3 @@ HEALTHCHECK --start-period=60s CMD curl -f http://localhost/ || exit 1
健康检查应主要关注**当前服务**是否可用而不是检查其下游依赖数据库等下游依赖的检查应由应用逻辑处理
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 检测容器应用是否真实可用 |
| **命令** | `HEALTHCHECK [选项] CMD command` |
| **状态** | starting, healthy, unhealthy |
| **Compose** | 支持 `condition: service_healthy` 依赖 |
| **注意** | 避免副作用节省资源 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)启动主进程
- [Compose 模板文件](../10_compose/10.5_compose_file.md)Compose 中的健康检查
- [Docker 调试](../16_appendix/16.2_debug.md)容器排障
-15
View File
@@ -141,18 +141,3 @@ python:3.12-onbuild
如果 `ONBUILD` 指令产生了临时文件最好在同一个指令链中清理或者提供机制让子镜像清理
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 定义在子镜像构建时执行的指令 |
| **语法** | `ONBUILD INSTRUCTION` |
| **适用** | 基础架构镜像Node, Python, Go |
| **限制** | 只继承一次不可级联 |
| **规范** | 建议使用 `-onbuild` 标签后缀 |
### 延伸阅读
- [COPY 指令](7.2_copy.md)文件复制
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)基础镜像设计
-15
View File
@@ -142,18 +142,3 @@ $ docker rmi $(docker images -q --filter "label=stage=builder")
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 添加 key-value 元数据 |
| **语法** | `LABEL k=v k=v ...` |
| **规范** | 推荐使用 OCI 标准标签 |
| **弃用** | 不要再使用 `MAINTAINER` |
| **查看** | `docker inspect` |
### 延伸阅读
- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md)
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)
-15
View File
@@ -135,18 +135,3 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
避免在 Dockerfile 中频繁切换 SHELL这会使构建过程难以理解和调试尽量在头部定义一次即可
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell |
| **Linux 默认** | `["/bin/sh", "-c"]` |
| **Windows 默认** | `["cmd", "/S", "/C"]` |
| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` |
| **影响范围** | 后续所有使用 shell 格式的指令 |
### 延伸阅读
- [RUN 指令](../04_image/4.5_build.md)执行命令
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)错误处理与调试
-16
View File
@@ -158,19 +158,3 @@ RUN --mount=type=secret,id=mysecret \
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 在新层执行命令 |
| **原则** | 合并命令清理缓存 |
| **格式** | Shell (常用) vs Exec |
| **陷阱** | `cd` 不持久环境变量不持久 |
| **进阶** | 使用 Cache Mount 加速构建 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)容器启动时的命令
- [WORKDIR 指定工作目录](7.10_workdir.md)改变目录
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)
-17
View File
@@ -265,20 +265,3 @@ COPY . .
```
---
### 本章小结
| 操作 | 示例 |
|------|------|
| 复制文件 | `COPY app.js /app/` |
| 复制多个文件 | `COPY *.json /app/` |
| 复制目录内容 | `COPY src/ /app/src/` |
| 修改所有者 | `COPY --chown=node:node . /app/` |
| 从构建阶段复制 | `COPY --from=builder /app/dist ./` |
### 延伸阅读
- [ADD 指令](7.3_add.md)复制和解压
- [WORKDIR 指令](7.10_workdir.md)设置工作目录
- [多阶段构建](7.17_multistage_builds.md)优化镜像大小
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
-16
View File
@@ -220,19 +220,3 @@ RUN tar -xzf /tmp/app.tar.gz -C /app && \
```
---
### 本章小结
| 场景 | 推荐指令 |
|------|---------|
| 复制普通文件 | `COPY` |
| 复制目录 | `COPY` |
| 自动解压 tar | `ADD` |
| URL 下载 | `RUN curl` |
| 保持 tar 不解压 | `COPY` |
### 延伸阅读
- [COPY 复制文件](7.2_copy.md)基本复制操作
- [多阶段构建](7.17_multistage_builds.md)减少镜像体积
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
-16
View File
@@ -275,19 +275,3 @@ CMD ["python", "app.py"]
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 指定容器启动时的默认命令 |
| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` |
| **覆盖方式** | `docker run image 新命令` |
| ** ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
| **核心原则** | 应用必须在前台运行 |
### 延伸阅读
- [ENTRYPOINT 入口点](7.5_entrypoint.md)固定的启动命令
- [后台运行](../05_container/5.2_daemon.md)容器前台/后台概念
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
-14
View File
@@ -315,17 +315,3 @@ wait $PID
```
---
### 本章小结
| ENTRYPOINT | CMD | 适用场景 |
|------------|-----|---------|
| | | 镜像作为固定命令使用 |
| | | 简单的默认命令 |
| | | **推荐**固定命令 + 可配置参数 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)默认命令
- [最佳实践](../16_appendix/16.1_best_practices.md)启动命令设计
- [后台运行](../05_container/5.2_daemon.md)前台/后台概念
-16
View File
@@ -259,19 +259,3 @@ ENV VAR3=value3
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **语法** | `ENV KEY=value` |
| **作用范围** | 构建时 + 运行时 |
| **覆盖方式** | `docker run -e KEY=value` |
| ** ARG** | ARG 仅构建时ENV 持久化到运行时 |
| **安全** | 不要存储敏感信息 |
### 延伸阅读
- [ARG 构建参数](7.7_arg.md)构建时变量
- [Compose 环境变量](../10_compose/10.5_compose_file.md)Compose 中的环境变量
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
-17
View File
@@ -242,20 +242,3 @@ FROM ${BASE_IMAGE}
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 定义构建时变量 |
| **语法** | `ARG NAME=value` |
| **覆盖** | `docker build --build-arg NAME=value` |
| **作用域** | FROM 之后需要重新声明 |
| **vs ENV** | ARG 仅构建时ENV 构建+运行时 |
| **安全** | 不要存储敏感信息 |
### 延伸阅读
- [ENV 设置环境变量](7.6_env.md)运行时环境变量
- [FROM 指令](../04_image/4.5_build.md)基础镜像指定
- [多阶段构建](7.17_multistage_builds.md)复杂构建场景
+22 -31
View File
@@ -15,21 +15,28 @@ VOLUME /路径
> **核心原则**容器存储层应该保持无状态任何运行时数据都应该存储在卷中
```
没有 VOLUME 使用 VOLUME
容器存储层 容器存储层
只读/无状态
数据库文件 问题
日志文件
上传文件
数据卷
容器删除 = 数据丢失
持久化数据 安全
容器删除数据保留
```mermaid
flowchart LR
subgraph NoVolume ["没有 VOLUME"]
direction TB
subgraph Container1 ["容器存储层"]
direction TB
Files["数据库文件 (问题)<br/>日志文件<br/>上传文件"]
end
Result1["容器删除 = 数据丢失"]
Container1 ~~~ Result1
end
subgraph UseVolume ["使用 VOLUME"]
direction TB
Container2["容器存储层<br/>(只读/无状态)"]
subgraph Volume ["数据卷"]
Data["持久化数据 (安全)"]
end
Container2 --> Volume
Result2["容器删除,数据保留"]
Volume ~~~ Result2
end
```
---
@@ -256,19 +263,3 @@ VOLUME /var/lib/mysql
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 创建挂载点标记为外部卷 |
| **语法** | `VOLUME /path` |
| **默认行为** | 自动创建匿名卷 |
| **覆盖方式** | `docker run -v name:/path` |
| **注意** | VOLUME 之后的修改会丢失 |
### 延伸阅读
- [数据卷](../08_data_network/data/volume.md)卷的管理和使用
- [挂载主机目录](../08_data_network/data/bind-mounts.md)Bind Mount
- [Compose 数据管理](../10_compose/10.5_compose_file.md)Compose 中的卷配置
+5 -30
View File
@@ -75,20 +75,11 @@ $ docker port $(docker ps -q)
| **是否必需** | | 外部访问时 |
| **映射发生时** | 不发生 | 运行时发生 |
```
EXPOSE 80
仅声明意图
docker run -p
实际端口映射
宿主机 容器
```mermaid
flowchart TD
Expose["EXPOSE 80<br/>仅声明意图"]
Run["docker run -p<br/>实际端口映射<br/>宿主机 ←→ 容器"]
Expose ~~~ Run
```
#### 没有 EXPOSE 也能 -p
@@ -224,19 +215,3 @@ services:
`expose` Compose 中仅用于容器间通信的文档说明不进行端口映射
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 声明容器提供服务的端口文档 |
| **不会** | 自动映射端口或开放外部访问 |
| **配合** | `docker run -P` 自动映射 |
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
| **语法** | `EXPOSE 80` `EXPOSE 80/tcp` |
### 延伸阅读
- [网络配置](../08_data_network/network/README.md)Docker 网络详解
- [端口映射](../08_data_network/network/port_mapping.md)-p 参数详解
- [Compose 端口](../10_compose/10.5_compose_file.md)Compose 中的端口配置
+208
View File
@@ -0,0 +1,208 @@
## 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 设置后续指令的工作目录 |
| **语法** | `WORKDIR /path` |
| **自动创建** | 目录不存在会自动创建 |
| **持久性** | 影响后续所有指令直到下次 WORKDIR |
| **不要用** | `RUN cd /path`无效 |
### 延伸阅读
- [COPY 复制文件](7.2_copy.md)文件复制
- [RUN 执行命令](../04_image/4.5_build.md)执行构建命令
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|
| **作用** | 切换后续指令的执行用户 |
| **语法** | `USER username` `USER UID:GID` |
| **前提** | 用户必须已存在 |
| **运行时覆盖** | `docker run -u` |
| **切换工具** | 使用 gosu不用 su/sudo |
### 延伸阅读
- [安全](../11_ops/security/README.md)容器安全实践
- [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 安全
| 要点 | 说明 |
|------|------|
| **作用** | 检测容器应用是否真实可用 |
| **命令** | `HEALTHCHECK [选项] CMD command` |
| **状态** | starting, healthy, unhealthy |
| **Compose** | 支持 `condition: service_healthy` 依赖 |
| **注意** | 避免副作用节省资源 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)启动主进程
- [Compose 模板文件](../10_compose/10.5_compose_file.md)Compose 中的健康检查
- [Docker 调试](../16_appendix/16.2_debug.md)容器排障
| 要点 | 说明 |
|------|------|
| **作用** | 定义在子镜像构建时执行的指令 |
| **语法** | `ONBUILD INSTRUCTION` |
| **适用** | 基础架构镜像Node, Python, Go |
| **限制** | 只继承一次不可级联 |
| **规范** | 建议使用 `-onbuild` 标签后缀 |
### 延伸阅读
- [COPY 指令](7.2_copy.md)文件复制
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)基础镜像设计
| 要点 | 说明 |
|------|------|
| **作用** | 添加 key-value 元数据 |
| **语法** | `LABEL k=v k=v ...` |
| **规范** | 推荐使用 OCI 标准标签 |
| **弃用** | 不要再使用 `MAINTAINER` |
| **查看** | `docker inspect` |
### 延伸阅读
- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md)
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)
| 要点 | 说明 |
|------|------|
| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell |
| **Linux 默认** | `["/bin/sh", "-c"]` |
| **Windows 默认** | `["cmd", "/S", "/C"]` |
| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` |
| **影响范围** | 后续所有使用 shell 格式的指令 |
### 延伸阅读
- [RUN 指令](../04_image/4.5_build.md)执行命令
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)错误处理与调试
| 要点 | 说明 |
|------|------|
| **作用** | 在新层执行命令 |
| **原则** | 合并命令清理缓存 |
| **格式** | Shell (常用) vs Exec |
| **陷阱** | `cd` 不持久环境变量不持久 |
| **进阶** | 使用 Cache Mount 加速构建 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)容器启动时的命令
- [WORKDIR 指定工作目录](7.10_workdir.md)改变目录
- [Dockerfile 最佳实践](../16_appendix/16.1_best_practices.md)
| 操作 | 示例 |
|------|------|
| 复制文件 | `COPY app.js /app/` |
| 复制多个文件 | `COPY *.json /app/` |
| 复制目录内容 | `COPY src/ /app/src/` |
| 修改所有者 | `COPY --chown=node:node . /app/` |
| 从构建阶段复制 | `COPY --from=builder /app/dist ./` |
### 延伸阅读
- [ADD 指令](7.3_add.md)复制和解压
- [WORKDIR 指令](7.10_workdir.md)设置工作目录
- [多阶段构建](7.17_multistage_builds.md)优化镜像大小
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
| 场景 | 推荐指令 |
|------|---------|
| 复制普通文件 | `COPY` |
| 复制目录 | `COPY` |
| 自动解压 tar | `ADD` |
| URL 下载 | `RUN curl` |
| 保持 tar 不解压 | `COPY` |
### 延伸阅读
- [COPY 复制文件](7.2_copy.md)基本复制操作
- [多阶段构建](7.17_multistage_builds.md)减少镜像体积
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|
| **作用** | 指定容器启动时的默认命令 |
| **推荐格式** | exec 格式 `CMD ["程序", "参数"]` |
| **覆盖方式** | `docker run image 新命令` |
| ** ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
| **核心原则** | 应用必须在前台运行 |
### 延伸阅读
- [ENTRYPOINT 入口点](7.5_entrypoint.md)固定的启动命令
- [后台运行](../05_container/5.2_daemon.md)容器前台/后台概念
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
| ENTRYPOINT | CMD | 适用场景 |
|------------|-----|---------|
| | | 镜像作为固定命令使用 |
| | | 简单的默认命令 |
| | | **推荐**固定命令 + 可配置参数 |
### 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)默认命令
- [最佳实践](../16_appendix/16.1_best_practices.md)启动命令设计
- [后台运行](../05_container/5.2_daemon.md)前台/后台概念
| 要点 | 说明 |
|------|------|
| **语法** | `ENV KEY=value` |
| **作用范围** | 构建时 + 运行时 |
| **覆盖方式** | `docker run -e KEY=value` |
| ** ARG** | ARG 仅构建时ENV 持久化到运行时 |
| **安全** | 不要存储敏感信息 |
### 延伸阅读
- [ARG 构建参数](7.7_arg.md)构建时变量
- [Compose 环境变量](../10_compose/10.5_compose_file.md)Compose 中的环境变量
- [最佳实践](../16_appendix/16.1_best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|
| **作用** | 定义构建时变量 |
| **语法** | `ARG NAME=value` |
| **覆盖** | `docker build --build-arg NAME=value` |
| **作用域** | FROM 之后需要重新声明 |
| **vs ENV** | ARG 仅构建时ENV 构建+运行时 |
| **安全** | 不要存储敏感信息 |
### 延伸阅读
- [ENV 设置环境变量](7.6_env.md)运行时环境变量
- [FROM 指令](../04_image/4.5_build.md)基础镜像指定
- [多阶段构建](7.17_multistage_builds.md)复杂构建场景
| 要点 | 说明 |
|------|------|
| **作用** | 创建挂载点标记为外部卷 |
| **语法** | `VOLUME /path` |
| **默认行为** | 自动创建匿名卷 |
| **覆盖方式** | `docker run -v name:/path` |
| **注意** | VOLUME 之后的修改会丢失 |
### 延伸阅读
- [数据卷](../08_data_network/data/volume.md)卷的管理和使用
- [挂载主机目录](../08_data_network/data/bind-mounts.md)Bind Mount
- [Compose 数据管理](../10_compose/10.5_compose_file.md)Compose 中的卷配置
| 要点 | 说明 |
|------|------|
| **作用** | 声明容器提供服务的端口文档 |
| **不会** | 自动映射端口或开放外部访问 |
| **配合** | `docker run -P` 自动映射 |
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
| **语法** | `EXPOSE 80` `EXPOSE 80/tcp` |
### 延伸阅读
- [网络配置](../08_data_network/network/README.md)Docker 网络详解
- [端口映射](../08_data_network/network/port_mapping.md)-p 参数详解
- [Compose 端口](../10_compose/10.5_compose_file.md)Compose 中的端口配置
+21 -34
View File
@@ -4,14 +4,19 @@
Bind Mount绑定挂载**宿主机的目录或文件**直接挂载到容器中容器可以读写宿主机的文件系统
```
宿主机 容器
/home/user/code/
index.html /usr/share/nginx/
style.css Bind html/
app.js Mount (同一份文件)
```mermaid
flowchart LR
subgraph Host ["宿主机"]
direction TB
Dir1["/home/user/code/<br/>├── index.html<br/>├── style.css<br/>└── app.js"]
end
subgraph Container ["容器"]
direction TB
Dir2["/usr/share/nginx/html/<br/>(同一份文件)"]
end
Dir1 <-->|Bind Mount| Dir2
```
---
@@ -29,16 +34,14 @@ Bind Mount(绑定挂载)将**宿主机的目录或文件**直接挂载到容
#### 选择建议
```
需求 推荐方案
开发时同步代码 Bind Mount
持久化数据库数据 Volume
共享配置文件 Bind Mount
容器间共享数据 Volume
备份方便 Bind Mount直接访问
生产环境 Volume
```
| 需求 | 推荐方案 |
|------|----------|
| 开发时同步代码 | Bind Mount |
| 持久化数据库数据 | Volume |
| 共享配置文件 | Bind Mount |
| 容器间共享数据 | Volume |
| 备份方便 | Bind Mount直接访问 |
| 生产环境 | Volume |
---
@@ -311,19 +314,3 @@ $ docker run -v /app/data:/data ...
```
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 将宿主机目录挂载到容器 |
| **语法** | `-v /宿主机:/容器` `--mount type=bind,...` |
| **只读** | 添加 `readonly` `:ro` |
| **适用场景** | 开发环境配置文件日志 |
| **vs Volume** | Bind 更灵活Volume 更适合生产 |
### 延伸阅读
- [数据卷](volume.md)Docker 管理的持久化存储
- [tmpfs 挂载](tmpfs.md)内存临时存储
- [Compose 数据管理](../../10_compose/10.5_compose_file.md)Compose 中的挂载配置
+30
View File
@@ -0,0 +1,30 @@
## 本章小结
| 要点 | 说明 |
|------|------|
| **作用** | 将宿主机目录挂载到容器 |
| **语法** | `-v /宿主机:/容器` `--mount type=bind,...` |
| **只读** | 添加 `readonly` `:ro` |
| **适用场景** | 开发环境配置文件日志 |
| **vs Volume** | Bind 更灵活Volume 更适合生产 |
### 延伸阅读
- [数据卷](volume.md)Docker 管理的持久化存储
- [tmpfs 挂载](tmpfs.md)内存临时存储
- [Compose 数据管理](../../10_compose/10.5_compose_file.md)Compose 中的挂载配置
| 操作 | 命令 |
|------|------|
| 创建数据卷 | `docker volume create name` |
| 列出数据卷 | `docker volume ls` |
| 查看详情 | `docker volume inspect name` |
| 删除数据卷 | `docker volume rm name` |
| 清理未用 | `docker volume prune` |
| 挂载数据卷 | `-v name:/path` `--mount source=name,target=/path` |
### 延伸阅读
- [绑定挂载](bind-mounts.md)挂载宿主机目录
- [tmpfs 挂载](tmpfs.md)内存中的临时存储
- [存储驱动](../../14_implementation/14.4_ufs.md)Docker 存储的底层原理
-17
View File
@@ -397,20 +397,3 @@ $ docker volume inspect my-vol
3. 在目标机器恢复
---
### 本章小结
| 操作 | 命令 |
|------|------|
| 创建数据卷 | `docker volume create name` |
| 列出数据卷 | `docker volume ls` |
| 查看详情 | `docker volume inspect name` |
| 删除数据卷 | `docker volume rm name` |
| 清理未用 | `docker volume prune` |
| 挂载数据卷 | `-v name:/path` `--mount source=name,target=/path` |
### 延伸阅读
- [绑定挂载](bind-mounts.md)挂载宿主机目录
- [tmpfs 挂载](tmpfs.md)内存中的临时存储
- [存储驱动](../../14_implementation/14.4_ufs.md)Docker 存储的底层原理
+26 -26
View File
@@ -47,10 +47,22 @@ graph TD
### 数据流向
```
容器 A (172.17.0.2) docker0 容器 B (172.17.0.3) (容器间通信)
容器 A (172.17.0.2) docker0 eth0 互联网 (访问外网)
外部请求 eth0 docker0 容器 A (被外部访问需端口映射)
```mermaid
flowchart LR
subgraph Comm1 ["容器间通信"]
direction LR
C1A["容器 A (172.17.0.2)"] --> D0A["docker0"] --> C1B["容器 B (172.17.0.3)"]
end
subgraph Comm2 ["访问外网"]
direction LR
C2A["容器 A (172.17.0.2)"] --> D0B["docker0"] --> Eth0A["eth0"] --> InternetA["互联网"]
end
subgraph Comm3 ["被外部访问,需端口映射"]
direction LR
Req["外部请求"] --> Eth0B["eth0"] --> D0C["docker0"] --> C3A["容器 A"]
end
```
---
@@ -124,17 +136,12 @@ PING db (172.18.0.3): 56 data bytes
自定义网络自动提供 DNS 服务
```
mynet 网络
DNS
web "db" 172.18.0.3 db
172.18.0.2 172.18.0.3
web 容器可以用 "db" 作为主机名访问 db 容器
```mermaid
flowchart LR
subgraph MyNet ["mynet 网络 : web 容器可以用 'db' 作为主机名访问 db 容器"]
direction LR
Web["web<br/>172.18.0.2"] -- "DNS: 'db' → 172.18.0.3" --> DB["db<br/>172.18.0.3"]
end
```
---
@@ -231,17 +238,10 @@ $ docker port mycontainer
### 端口映射示意图
```
外部请求 http://宿主机IP:8080
宿主机:8080 iptables NAT
容器 nginx:80
```mermaid
flowchart TD
Req["外部请求 http://宿主机IP:8080"] --> Host["宿主机:8080"]
Host -- "iptables NAT" --> Container["容器 nginx:80"]
```
---
-13
View File
@@ -98,16 +98,3 @@ $ docker run -h myweb nginx
- **解决**使用自定义网络 (`docker network create ...`)
---
### 本章小结
| 场景 | DNS 行为 | 备注 |
|------|----------|------|
| **默认网络** | 继承宿主机 | 不支持容器名解析 |
| **自定义网络** | Docker 嵌入式 DNS | 支持容器名解析 |
| **手动指定** | 使用 `--dns` | 覆盖默认配置 |
### 延伸阅读
- [网络模式](README.md)Docker 网络概览
- [端口映射](port_mapping.md)外部访问
+5 -27
View File
@@ -9,19 +9,11 @@
为了让外部如你的浏览器其他局域网机器访问容器内的服务我们需要将容器的端口**映射**到宿主机的端口
```
外部用户 (Browser)
宿主机 (localhost:8080)
端口映射
Docker (8080 -> 80)
Proxy
容器 (Class B: 80)
```mermaid
flowchart TD
User["外部用户 (Browser)"] --> Host["宿主机 (localhost:8080)"]
Host --> Proxy["Docker Proxy<br/>端口映射 (8080 -> 80)"]
Proxy --> Container["容器 (Class B: 80)"]
```
---
@@ -152,17 +144,3 @@ iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.
这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP 172.17.0.1而不是真实的外部 Client IP除非使用 host 网络模式
---
### 本章小结
| 要点 | 说明 |
|------|------|
| **-p** | 指定端口映射常用 `8080:80` |
| **-P** | 随机映射所有 EXPOSE 的端口 |
| **安全性** | 默认监听所有 IP敏感服务应绑定 `127.0.0.1` |
| **查看** | 使用 `docker port` `docker ps` |
### 延伸阅读
- [EXPOSE 指令](../../07_dockerfile/7.9_expose.md) Dockerfile 中声明端口
- [网络模式](README.md)Host 模式不需要端口映射
+24
View File
@@ -0,0 +1,24 @@
## 本章小结
| 场景 | DNS 行为 | 备注 |
|------|----------|------|
| **默认网络** | 继承宿主机 | 不支持容器名解析 |
| **自定义网络** | Docker 嵌入式 DNS | 支持容器名解析 |
| **手动指定** | 使用 `--dns` | 覆盖默认配置 |
### 延伸阅读
- [网络模式](README.md)Docker 网络概览
- [端口映射](port_mapping.md)外部访问
| 要点 | 说明 |
|------|------|
| **-p** | 指定端口映射常用 `8080:80` |
| **-P** | 随机映射所有 EXPOSE 的端口 |
| **安全性** | 默认监听所有 IP敏感服务应绑定 `127.0.0.1` |
| **查看** | 使用 `docker port` `docker ps` |
### 延伸阅读
- [EXPOSE 指令](../../07_dockerfile/7.9_expose.md) Dockerfile 中声明端口
- [网络模式](README.md)Host 模式不需要端口映射
+21 -18
View File
@@ -8,24 +8,27 @@
在开始之前先看整体架构如图 10-1 所示
```
Docker Compose 网络
web 服务 db 服务
Django PostgreSQL
应用 :5432 数据库
:8000
localhost:8000
浏览器访问
```mermaid
flowchart TD
subgraph Network ["Docker Compose 网络"]
direction LR
subgraph Web ["web 服务"]
direction TB
Django["Django<br/>应用"]
Port8000[":8000"]
Django ~~~ Port8000
end
subgraph DB ["db 服务"]
direction TB
Postgres["PostgreSQL<br/>数据库"]
end
Django -- ":5432" --> Postgres
end
Browser["localhost:8000<br/>(浏览器访问)"]
Port8000 --> Browser
```
10-1 Django + PostgreSQL Compose 架构
+21 -17
View File
@@ -8,23 +8,27 @@
如图 10-2 所示Rails PostgreSQL 在同一 Compose 网络中协同工作
```
Docker Compose 网络
web 服务 db 服务
Rails PostgreSQL
应用 :5432 数据库
:3000
localhost:3000
```mermaid
flowchart TD
subgraph Network ["Docker Compose 网络"]
direction LR
subgraph Web ["web 服务"]
direction TB
Rails["Rails<br/>应用"]
Port3000[":3000"]
Rails ~~~ Port3000
end
subgraph DB ["db 服务"]
direction TB
Postgres["PostgreSQL<br/>数据库"]
end
Rails -- ":5432" --> Postgres
end
Browser["localhost:3000"]
Port3000 --> Browser
```
10-2 Rails + PostgreSQL Compose 架构
+16 -13
View File
@@ -6,19 +6,22 @@
> **核心问题**容器共享宿主机内核隔离性弱于虚拟机如何在便利性和安全性之间取得平衡
```
虚拟机安全模型 容器安全模型
Guest OS 容器进程
(共享内核)
Hypervisor 隔离边界
Host OS
Namespace 隔离边界
Cgroups
完全隔离性能损耗 Capabilities
进程隔离轻量但需加固
```mermaid
flowchart LR
subgraph VM ["虚拟机安全模型:<br/>完全隔离(性能损耗)"]
direction TB
Guest["Guest OS"]
Hyper["Hypervisor<br/>&lt;-- 隔离边界"]
Host["Host OS"]
Guest --> Hyper --> Host
end
subgraph Container ["容器安全模型:<br/>进程隔离(轻量但需加固)"]
direction TB
Proc["容器进程<br/>(共享内核)"]
Mech["Namespace &lt;-- 隔离边界<br/>Cgroups<br/>Capabilities"]
Proc --> Mech
end
```
---
-18
View File
@@ -306,21 +306,3 @@ Namespace 提供了隔离但不是安全边界:
> 需要更强隔离时可考虑 gVisorKata Containers 等安全容器方案
---
### 本章小结
| Namespace | 隔离内容 | 一句话说明 |
|-----------|---------|-----------|
| PID | 进程 ID | 容器有自己的进程树 |
| NET | 网络 | 容器有自己的 IP 和端口 |
| MNT | 文件系统 | 容器有自己的根目录 |
| UTS | 主机名 | 容器有自己的 hostname |
| IPC | 进程间通信 | 容器间 IPC 隔离 |
| USER | 用户 ID | 容器 root 宿主机 root |
### 延伸阅读
- [控制组Cgroups](14.3_cgroups.md)资源限制机制
- [联合文件系统](14.4_ufs.md)分层存储的实现
- [安全](../11_ops/security/README.md)容器安全实践
- [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html)
-16
View File
@@ -291,19 +291,3 @@ $ docker run -d --name cadvisor \
```
---
### 本章小结
| 资源 | 限制参数 | 示例 |
|------|---------|------|
| **内存** | `-m` | `-m 512m` |
| **CPU 核心数** | `--cpus` | `--cpus=1.5` |
| **CPU 绑定** | `--cpuset-cpus` | `--cpuset-cpus="0,1"` |
| **磁盘 I/O** | `--device-write-bps` | `--device-write-bps /dev/sda:10mb` |
| **进程数** | `--pids-limit` | `--pids-limit=100` |
### 延伸阅读
- [命名空间](14.2_namespace.md)资源隔离
- [安全](../11_ops/security/README.md)容器安全概述
- [Docker Stats](../05_container/README.md)监控容器资源
-15
View File
@@ -219,18 +219,3 @@ RUN apt-get update && \
- 避免创建不必要的层
---
### 本章小结
| 概念 | 说明 |
|------|------|
| **UnionFS** | 将多层目录联合挂载为一个文件系统 |
| **Copy-on-Write** | 写时复制修改时才复制到可写层 |
| **overlay2** | Docker 默认推荐的存储驱动 |
| **分层好处** | 镜像复用快速构建快速启动 |
### 延伸阅读
- [镜像](../02_basic_concept/2.1_image.md)理解镜像分层
- [容器](../02_basic_concept/2.2_container.md)容器存储层
- [构建镜像](../04_image/4.5_build.md)Dockerfile 层的创建
+44
View File
@@ -0,0 +1,44 @@
## 本章小结
| Namespace | 隔离内容 | 一句话说明 |
|-----------|---------|-----------|
| PID | 进程 ID | 容器有自己的进程树 |
| NET | 网络 | 容器有自己的 IP 和端口 |
| MNT | 文件系统 | 容器有自己的根目录 |
| UTS | 主机名 | 容器有自己的 hostname |
| IPC | 进程间通信 | 容器间 IPC 隔离 |
| USER | 用户 ID | 容器 root 宿主机 root |
### 延伸阅读
- [控制组Cgroups](14.3_cgroups.md)资源限制机制
- [联合文件系统](14.4_ufs.md)分层存储的实现
- [安全](../11_ops/security/README.md)容器安全实践
- [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html)
| 资源 | 限制参数 | 示例 |
|------|---------|------|
| **内存** | `-m` | `-m 512m` |
| **CPU 核心数** | `--cpus` | `--cpus=1.5` |
| **CPU 绑定** | `--cpuset-cpus` | `--cpuset-cpus="0,1"` |
| **磁盘 I/O** | `--device-write-bps` | `--device-write-bps /dev/sda:10mb` |
| **进程数** | `--pids-limit` | `--pids-limit=100` |
### 延伸阅读
- [命名空间](14.2_namespace.md)资源隔离
- [安全](../11_ops/security/README.md)容器安全概述
- [Docker Stats](../05_container/README.md)监控容器资源
| 概念 | 说明 |
|------|------|
| **UnionFS** | 将多层目录联合挂载为一个文件系统 |
| **Copy-on-Write** | 写时复制修改时才复制到可写层 |
| **overlay2** | Docker 默认推荐的存储驱动 |
| **分层好处** | 镜像复用快速构建快速启动 |
### 延伸阅读
- [镜像](../02_basic_concept/2.1_image.md)理解镜像分层
- [容器](../02_basic_concept/2.2_container.md)容器存储层
- [构建镜像](../04_image/4.5_build.md)Dockerfile 层的创建