diff --git a/01_introduction/1.2_what.md b/01_introduction/1.2_what.md index 322b212..10f85c6 100644 --- a/01_introduction/1.2_what.md +++ b/01_introduction/1.2_what.md @@ -80,7 +80,7 @@ Docker 使用 [Go 语言](https://golang.google.cn/)开发,基于 Linux 内核 - **[Cgroups](https://zh.wikipedia.org/wiki/Cgroups)**:实现资源限制 (CPU、内存、I/O 等) - **[Union FS](https://en.wikipedia.org/wiki/Union_mount)**:实现分层存储 (如 OverlayFS) -> 如果你对这些底层技术感兴趣,可以阅读本书的[底层实现](../11_implementation/README.md)章节。 +> 如果你对这些底层技术感兴趣,可以阅读本书的[底层实现](../12_implementation/README.md)章节。 #### 概述 diff --git a/01_introduction/1.3_why.md b/01_introduction/1.3_why.md index abd2b9d..a0c9679 100644 --- a/01_introduction/1.3_why.md +++ b/01_introduction/1.3_why.md @@ -79,7 +79,7 @@ flowchart TD 除了解决上述痛点,Docker 还拥有诸多显著的技术优势,包括环境一致性、秒级启动、高效的资源利用等。 -#### 1。环境一致性 +#### 1. 环境一致性 Docker 镜像包含了应用运行所需的 **一切**:代码、运行时、系统工具、库、配置。这意味着: @@ -97,7 +97,7 @@ $ docker compose up ... ``` -#### 2。秒级启动 +#### 2. 秒级启动 传统虚拟机启动需要几分钟 (引导操作系统),而 Docker 容器启动通常只需要 **几秒甚至几百毫秒**。 @@ -115,7 +115,7 @@ $ docker compose up - **弹性扩容**:流量高峰时能快速启动更多实例 - **开发体验**:快速重启服务进行调试 -#### 3。资源效率 +#### 3. 资源效率 Docker 容器共享宿主机内核,无需为每个应用运行完整的操作系统。 @@ -146,7 +146,7 @@ flowchart TD end ``` -#### 4。持续交付和部署 +#### 4. 持续交付和部署 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 可以在几乎任何平台上运行: @@ -174,7 +174,7 @@ Docker 可以在几乎任何平台上运行: **同一个镜像,在任何地方运行结果都一致。** 这让应用迁移变得前所未有的简单。 -#### 6。微服务架构的基石 +#### 6. 微服务架构的基石 现代微服务架构几乎都依赖容器技术。Docker 让你可以: @@ -208,19 +208,19 @@ flowchart TD 笔者认为,技术选型要客观。Docker 并非银弹,以下场景可能不太适合: -#### 1。需要完全隔离的场景 +#### 1. 需要完全隔离的场景 容器共享宿主机内核,隔离性不如虚拟机。如果你需要运行不受信任的代码,虚拟机可能更安全。 -#### 2。需要特殊内核的场景 +#### 2. 需要特殊内核的场景 容器使用宿主机内核。如果应用需要特定版本的内核或内核模块,可能需要虚拟机。 -#### 3。Windows 原生应用 +#### 3. Windows 原生应用 虽然 Docker 支持 Windows 容器,但生态不如 Linux 容器成熟。传统 Windows 应用的容器化仍有挑战。 -#### 4。桌面应用 +#### 4. 桌面应用 Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行,但通常得不偿失。 diff --git a/02_basic_concept/2.1_image.md b/02_basic_concept/2.1_image.md index 6d71285..75c0ffe 100644 --- a/02_basic_concept/2.1_image.md +++ b/02_basic_concept/2.1_image.md @@ -160,7 +160,7 @@ a6bd71f48f68 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B Docker 镜像有多种标识方式: -#### 1。镜像名称和标签 +#### 1. 镜像名称和标签 格式:`[仓库地址/]仓库名[:标签]` @@ -179,7 +179,7 @@ ubuntu:24.04 nginx # 等同于 nginx:latest ``` -#### 2。镜像 ID (Content-Addressable) +#### 2. 镜像 ID (Content-Addressable) 每个镜像有一个基于内容计算的唯一 ID: @@ -190,7 +190,7 @@ nginx latest a6bd71f48f68 2 weeks ago 187MB ubuntu 24.04 ca2b0f26964c 3 weeks ago 78.1MB ``` -#### 3。镜像摘要 +#### 3. 镜像摘要 更精确的标识,基于镜像内容的 SHA256 哈希: diff --git a/02_basic_concept/2.2_container.md b/02_basic_concept/2.2_container.md index cba4edf..157b400 100644 --- a/02_basic_concept/2.2_container.md +++ b/02_basic_concept/2.2_container.md @@ -129,8 +129,8 @@ $ docker rm abc123 | 方式 | 说明 | 适用场景 | |------|------|---------| -| **[数据卷 (Volume) ](../08_data_network/data/volume.md)** | Docker 管理的存储 | 数据库、应用数据 | -| **[绑定挂载 (Bind Mount) ](../08_data_network/data/bind-mounts.md)** | 挂载宿主机目录 | 开发时共享代码 | +| **[数据卷 (Volume) ](../08_data/volume.md)** | Docker 管理的存储 | 数据库、应用数据 | +| **[绑定挂载 (Bind Mount) ](../08_data/bind-mounts.md)** | 挂载宿主机目录 | 开发时共享代码 | ```bash ## 使用数据卷(推荐) @@ -238,4 +238,4 @@ Docker 容器通过以下 Namespace 实现隔离: | **IPC** | 进程间通信 | 独立的信号量、消息队列 | | **USER** | 用户 | 独立的用户和组 ID | -> 想深入了解?请阅读[底层实现 - 命名空间](../11_implementation/11.2_namespace.md)。 +> 想深入了解?请阅读[底层实现 - 命名空间](../12_implementation/12.2_namespace.md)。 diff --git a/02_basic_concept/summary.md b/02_basic_concept/summary.md index 22f8f3b..bdcbeef 100644 --- a/02_basic_concept/summary.md +++ b/02_basic_concept/summary.md @@ -16,7 +16,7 @@ - [获取镜像](../04_image/4.1_pull.md):从 Registry 下载镜像 - [使用 Dockerfile 定制镜像](../04_image/4.5_build.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.2_daemon.md):理解容器为什么会 “立即退出” - [进入容器](../05_container/5.4_attach_exec.md):如何操作运行中的容器 -- [数据管理](../08_data_network/README.md):Volume 和数据持久化详解 +- [数据管理](../08_data/README.md):Volume 和数据持久化详解 | 概念 | 要点 | |------|------| diff --git a/04_image/4.7_internal.md b/04_image/4.7_internal.md index d08a282..aac0d83 100644 --- a/04_image/4.7_internal.md +++ b/04_image/4.7_internal.md @@ -45,7 +45,7 @@ flowchart TD 这就是为什么: -1. **容器删除后数据会丢失**:因为所有的数据修改都保存在最上层的容器层中,容器销毁时,这个层也就随之销毁了。(除非使用了数据卷,详见[数据管理](../08_data_network/README.md))。 +1. **容器删除后数据会丢失**:因为所有的数据修改都保存在最上层的容器层中,容器销毁时,这个层也就随之销毁了。(除非使用了数据卷,详见[数据管理](../08_data/README.md))。 2. **镜像不可变**:无论我们在容器里删除了多少文件,基础镜像的体积并不会减小,因为它们依然存在于底层的只读层中。 ### 4.7.3 内容寻址与镜像 ID @@ -62,4 +62,4 @@ Docker 使用联合文件系统 (Union FS) 来实现这种分层挂载。常见 虽然实现细节不同,但它们都遵循上述的 **分层 + 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)** 章节。 diff --git a/04_image/summary.md b/04_image/summary.md index 4987283..5caeeb7 100644 --- a/04_image/summary.md +++ b/04_image/summary.md @@ -16,6 +16,8 @@ - [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载 - [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库 +相关信息如下表: + | 操作 | 命令 | |------|------| | 列出所有镜像 | `docker images` | @@ -32,6 +34,8 @@ - [删除镜像](4.3_rm.md):清理本地镜像 - [镜像](../02_basic_concept/2.1_image.md):理解镜像概念 +相关信息如下表: + | 操作 | 命令 | |------|------| | 删除指定镜像 | `docker rmi 镜像名:标签` | @@ -45,4 +49,4 @@ - [列出镜像](4.2_list.md):查看和过滤镜像 - [删除容器](../05_container/5.6_rm.md):清理容器 -- [数据卷](../08_data_network/data/volume.md):清理数据卷 +- [数据卷](../08_data/volume.md):清理数据卷 diff --git a/05_container/5.1_run.md b/05_container/5.1_run.md index ded0bd8..6753c6e 100644 --- a/05_container/5.1_run.md +++ b/05_container/5.1_run.md @@ -240,4 +240,4 @@ $ docker run -d -p 80:80 nginx $ docker run -v mydata:/app/data myapp ``` -详见[数据管理](../08_data_network/README.md)。 +详见[数据管理](../08_data/README.md)。 diff --git a/05_container/5.2_daemon.md b/05_container/5.2_daemon.md index 8871735..bf25cfa 100644 --- a/05_container/5.2_daemon.md +++ b/05_container/5.2_daemon.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 ``` -#### 2。调试时先用前台模式 +#### 2. 调试时先用前台模式 当容器启动有问题时,**去掉 `-d` 参数** 可以直接看到输出和错误: @@ -171,7 +171,7 @@ $ docker run -d -p 6379:6379 redis $ docker run myimage:latest ``` -#### 3。使用 --rm 自动清理 +#### 3. 使用 --rm 自动清理 对于一次性任务,使用 `--rm` 参数让容器退出后自动删除: @@ -183,7 +183,7 @@ Hello, World! ... ``` -#### 4。配合日志查看 +#### 4. 配合日志查看 运行以下命令: @@ -257,4 +257,4 @@ $ docker attach mycontainer - [进入容器](5.4_attach_exec.md):如何进入正在运行的容器执行命令 - [容器日志](../appendix/20.1_best_practices.md):生产环境的日志管理最佳实践 - [HEALTHCHECK 健康检查](../07_dockerfile/7.12_healthcheck.md):自动检测容器内服务是否正常 -- [Docker Compose](../10_compose/README.md):管理多个后台容器的更好方式 +- [Docker Compose](../11_compose/README.md):管理多个后台容器的更好方式 diff --git a/05_container/5.4_attach_exec.md b/05_container/5.4_attach_exec.md index 40edbda..061745a 100644 --- a/05_container/5.4_attach_exec.md +++ b/05_container/5.4_attach_exec.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 ``` -#### 2。生产环境避免进入容器 +#### 2. 生产环境避免进入容器 笔者建议:生产环境应尽量避免进入容器直接操作,而是通过: @@ -266,7 +266,7 @@ $ docker exec myapp python manage.py migrate - 监控系统查看状态 - 重新部署而非手动修改 -#### 3。无 shell 镜像的处理 +#### 3. 无 shell 镜像的处理 某些精简镜像 (如基于 `scratch` 或 `distroless`) 没有 shell: diff --git a/05_container/summary.md b/05_container/summary.md index bba3de8..5e2db37 100644 --- a/05_container/summary.md +++ b/05_container/summary.md @@ -13,8 +13,8 @@ - [后台运行](5.2_daemon.md):理解 `-d` 参数和容器生命周期 - [进入容器](5.4_attach_exec.md):操作运行中的容器 -- [网络配置](../08_data_network/network/README.md):理解端口映射的原理 -- [数据管理](../08_data_network/README.md):数据持久化方案 +- [网络配置](../09_network/README.md):理解端口映射的原理 +- [数据管理](../08_data/README.md):数据持久化方案 | 操作 | 命令 | 说明 | |------|------|------| @@ -54,4 +54,4 @@ - [终止容器](5.3_stop.md):优雅停止容器 - [删除镜像](../04_image/4.3_rm.md):清理镜像 -- [数据卷](../08_data_network/data/volume.md):数据卷管理 +- [数据卷](../08_data/volume.md):数据卷管理 diff --git a/06_repository/6.1_dockerhub.md b/06_repository/6.1_dockerhub.md index e6d6adc..de199c1 100644 --- a/06_repository/6.1_dockerhub.md +++ b/06_repository/6.1_dockerhub.md @@ -22,7 +22,7 @@ Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。搜索镜像 +#### 1. 搜索镜像 我们可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。 @@ -37,7 +37,7 @@ centos The official build of CentOS. 7000+ [OK] > **技巧**:始终优先使用 `OFFICIAL` 标记为 `[OK]` 的镜像,安全性更有保障。 -#### 2。拉取镜像 +#### 2. 拉取镜像 运行以下命令: @@ -45,7 +45,7 @@ centos The official build of CentOS. 7000+ [OK] $ docker pull nginx:alpine ``` -#### 3。推送镜像 +#### 3. 推送镜像 需要先登录: @@ -99,14 +99,14 @@ $ docker push username/myapp:v1 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。启用 2FA (双因素认证) +#### 1. 启用 2FA (双因素认证) 为了保护您的 Docker Hub 账号安全,我们建议采取以下措施。 在 Account Settings -> Security 中启用 2FA,保护账号安全。启用后,CLI 登录需要使用 **Access Token** 而非密码。 -#### 2。使用 Access Token +#### 2. 使用 Access Token 不要在脚本或 CI/CD 中直接使用登录密码。 @@ -117,7 +117,7 @@ $ docker push username/myapp:v1 $ docker login -u username -p dckr_pat_xxxxxxx ``` -#### 3。关注镜像漏洞 +#### 3. 关注镜像漏洞 Docker Hub 会对官方镜像和付费用户的镜像进行安全扫描。在镜像标签页可以看到漏洞扫描结果。 diff --git a/07_dockerfile/7.10_workdir.md b/07_dockerfile/7.10_workdir.md index 4e96557..78381dc 100644 --- a/07_dockerfile/7.10_workdir.md +++ b/07_dockerfile/7.10_workdir.md @@ -127,7 +127,7 @@ COPY --from=builder /build/dist . 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。尽早设置 WORKDIR +#### 1. 尽早设置 WORKDIR 如下代码块所示,展示了相关示例: @@ -141,7 +141,7 @@ COPY . . CMD ["node", "server.js"] ``` -#### 2。使用绝对路径 +#### 2. 使用绝对路径 如下代码块所示,展示了相关示例: @@ -155,7 +155,7 @@ WORKDIR /app WORKDIR app ``` -#### 3。不要用 RUN cd +#### 3. 不要用 RUN cd 如下代码块所示,展示了相关示例: @@ -170,7 +170,7 @@ WORKDIR /app RUN echo "hello" > world.txt ``` -#### 4。适时重置 WORKDIR +#### 4. 适时重置 WORKDIR 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.11_user.md b/07_dockerfile/7.11_user.md index a58fce3..0efa976 100644 --- a/07_dockerfile/7.11_user.md +++ b/07_dockerfile/7.11_user.md @@ -225,7 +225,7 @@ CMD ["node", "server.js"] 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。始终使用非 root 用户 +#### 1. 始终使用非 root 用户 如下代码块所示,展示了相关示例: @@ -241,7 +241,7 @@ CMD ["myapp"] CMD ["myapp"] # 以 root 运行 ``` -#### 2。使用固定 UID/GID +#### 2. 使用固定 UID/GID 便于在宿主机和容器间共享文件: @@ -253,7 +253,7 @@ RUN addgroup -g 1000 -S appgroup && \ USER 1000:1000 ``` -#### 3。多阶段构建中的 USER +#### 3. 多阶段构建中的 USER 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.12_healthcheck.md b/07_dockerfile/7.12_healthcheck.md index 4b970cc..3d91162 100644 --- a/07_dockerfile/7.12_healthcheck.md +++ b/07_dockerfile/7.12_healthcheck.md @@ -191,15 +191,15 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。避免副作用 +#### 1. 避免副作用 健康检查会被频繁执行,不要在检查脚本中进行写操作或消耗大量资源的操作。 -#### 2。使用轻量级工具 +#### 2. 使用轻量级工具 优先使用镜像中已有的工具 (如 `wget`),避免为了健康检查安装庞大的依赖 (如 `curl`)。 -#### 3。设置合理的 Start Period +#### 3. 设置合理的 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 ``` -#### 4。只检查核心依赖 +#### 4. 只检查核心依赖 健康检查应主要关注 **当前服务** 是否可用,而不是检查其下游依赖 (数据库等)。下游依赖的检查应由应用逻辑处理。 diff --git a/07_dockerfile/7.13_onbuild.md b/07_dockerfile/7.13_onbuild.md index a7bc508..b7620ed 100644 --- a/07_dockerfile/7.13_onbuild.md +++ b/07_dockerfile/7.13_onbuild.md @@ -79,7 +79,7 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。自动处理依赖安装 +#### 1. 自动处理依赖安装 如下代码块所示,展示了相关示例: @@ -90,7 +90,7 @@ ONBUILD COPY 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 ``` -#### 3。处理静态资源 +#### 3. 处理静态资源 如下代码块所示,展示了相关示例: @@ -117,7 +117,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/ 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。继承性限制 +#### 1. 继承性限制 `ONBUILD` 指令 **只会继承一次**。 @@ -125,15 +125,15 @@ ONBUILD COPY dist/ /usr/share/nginx/html/ - 镜像 B (FROM A) -> 触发 ONBUILD - 镜像 C (FROM B) -> **不会** 再次触发 ONBUILD -#### 2。构建上下文 +#### 2. 构建上下文 子镜像构建时,`ONBUILD COPY . .` 中的 `.` 指的是 **子项目** 的构建上下文,而不是基础镜像的上下文。 -#### 3。不允许级联 +#### 3. 不允许级联 `ONBUILD ONBUILD` 是非法的。你不能写 `ONBUILD ONBUILD COPY ...`。 -#### 4。可能会导致构建失败 +#### 4. 可能会导致构建失败 由于 `ONBUILD` 实际上是在子镜像中执行指令,如果子项目的上下文不满足要求 (例如缺少 `package.json`),会导致子镜像构建失败,且错误信息可能比较隐晦。 @@ -143,7 +143,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/ 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。命名规范 +#### 1. 命名规范 建议在镜像标签中添加 `-onbuild` 后缀,明确告知使用者该镜像包含触发器。 @@ -152,11 +152,11 @@ node:20-onbuild python:3.12-onbuild ``` -#### 2。避免执行耗时操作 +#### 2. 避免执行耗时操作 尽量不要在 `ONBUILD` 中执行过于耗时或不确定的操作 (如更新系统软件),这会让子镜像构建变得缓慢且不可控。 -#### 3。清理工作 +#### 3. 清理工作 如果 `ONBUILD` 指令产生了临时文件,最好在同一个指令链中清理,或者提供机制让子镜像清理。 diff --git a/07_dockerfile/7.15_shell.md b/07_dockerfile/7.15_shell.md index 59537ea..5ca0e05 100644 --- a/07_dockerfile/7.15_shell.md +++ b/07_dockerfile/7.15_shell.md @@ -23,7 +23,7 @@ SHELL ["executable", "parameters"] 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。使用 bash 特性 +#### 1. 使用 bash 特性 默认的 `/bin/sh` (通常是 dash 或 alpine 的 ash) 功能有限。如果你需要使用 bash 的特有功能 (如数组、`{}` 扩展、`pipefail` 等),可以切换 shell。 @@ -39,7 +39,7 @@ SHELL ["/bin/bash", "-c"] RUN echo {a..z} ``` -#### 2。增强错误处理 +#### 2. 增强错误处理 默认情况下,管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功,整个指令就视为成功。这可能掩盖构建错误。 @@ -61,7 +61,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN wget -O - https://invalid-url | tar xz ``` -#### 3。Windows 环境 +#### 3. Windows 环境 在 Windows 容器中,经常需要在 `cmd` 和 `powershell` 之间切换。 @@ -127,7 +127,7 @@ RUN echo "Using sh again" 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。推荐开启 pipefail +#### 1. 推荐开启 pipefail 对于使用 bash 的镜像,强烈建议开启 `pipefail`,以确保构建过程中的错误能被及时捕获。 @@ -135,11 +135,11 @@ RUN echo "Using sh again" SHELL ["/bin/bash", "-o", "pipefail", "-c"] ``` -#### 2。明确意图 +#### 2. 明确意图 如果由于脚本需求必须更改 shell,最好在 Dockerfile 中显式声明,而不是依赖默认行为。 -#### 3。尽量保持一致 +#### 3. 尽量保持一致 避免在 Dockerfile 中频繁切换 SHELL,这会使构建过程难以理解和调试。尽量在头部定义一次即可。 diff --git a/07_dockerfile/7.1_run.md b/07_dockerfile/7.1_run.md index 224e6a1..8d08db4 100644 --- a/07_dockerfile/7.1_run.md +++ b/07_dockerfile/7.1_run.md @@ -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 ``` -#### 2。Exec 格式 +#### 2. Exec 格式 如下代码块所示,展示了相关示例: @@ -52,7 +52,7 @@ RUN ["apt-get", "update"] 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。组合命令 (减少层数) +#### 1. 组合命令 (减少层数) 每一个 `RUN` 指令都会新建一层镜像。为了减少镜像体积和层数,应使用 `&&` 连接命令。 @@ -72,7 +72,7 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* ``` -#### 2。清理缓存 +#### 2. 清理缓存 在安装完软件后,立即清除缓存,可以显著减小镜像体积。 @@ -87,7 +87,7 @@ RUN apt-get update && \ RUN apk add --no-cache package-bar ``` -#### 3。使用 `set -e` 和 `pipefail` +#### 3. 使用 `set -e` 和 `pipefail` 默认情况下,管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功,整个 `RUN` 就视为成功。 @@ -150,7 +150,7 @@ RUN echo $MY_VAR 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。使用 BuildKit 的挂载缓存 +#### 1. 使用 BuildKit 的挂载缓存 BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存,加速构建。 @@ -169,7 +169,7 @@ RUN --mount=type=cache,target=/go/pkg/mod \ go build -o app ``` -#### 2。挂载密钥 +#### 2. 挂载密钥 安全地使用 SSH 密钥或 Token,而不将其记录在镜像中。 diff --git a/07_dockerfile/7.2_copy.md b/07_dockerfile/7.2_copy.md index 9962aad..f92441f 100644 --- a/07_dockerfile/7.2_copy.md +++ b/07_dockerfile/7.2_copy.md @@ -256,7 +256,7 @@ Dockerfile 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。利用缓存,先复制依赖文件 +#### 1. 利用缓存,先复制依赖文件 如下代码块所示,展示了相关示例: @@ -273,7 +273,7 @@ COPY . . RUN npm install ``` -#### 2。使用。dockerignore +#### 2. 使用 .dockerignore 如下代码块所示,展示了相关示例: @@ -286,7 +286,7 @@ COPY . . ... ``` -#### 3。明确复制路径 +#### 3. 明确复制路径 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.3_add.md b/07_dockerfile/7.3_add.md index 5e7cd9b..e794c8d 100644 --- a/07_dockerfile/7.3_add.md +++ b/07_dockerfile/7.3_add.md @@ -214,7 +214,7 @@ ADD app.tar.gz /app/ 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。默认使用 COPY +#### 1. 默认使用 COPY 如下代码块所示,展示了相关示例: @@ -224,7 +224,7 @@ ADD app.tar.gz /app/ COPY . /app/ ``` -#### 2。仅在需要解压时使用 ADD +#### 2. 仅在需要解压时使用 ADD 如下代码块所示,展示了相关示例: @@ -234,7 +234,7 @@ COPY . /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 ``` -#### 4。解压后清理 +#### 4. 解压后清理 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.4_cmd.md b/07_dockerfile/7.4_cmd.md index 2cc873c..c7934c2 100644 --- a/07_dockerfile/7.4_cmd.md +++ b/07_dockerfile/7.4_cmd.md @@ -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"] ``` -#### 2。确保应用在前台运行 +#### 2. 确保应用在前台运行 如下代码块所示,展示了相关示例: @@ -243,7 +243,7 @@ CMD service nginx start CMD systemctl start nginx ``` -#### 3。使用双引号 +#### 3. 使用双引号 如下代码块所示,展示了相关示例: @@ -257,7 +257,7 @@ CMD ["node", "server.js"] CMD ['node', 'server.js'] ``` -#### 4。配合 ENTRYPOINT 使用 +#### 4. 配合 ENTRYPOINT 使用 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.5_entrypoint.md b/07_dockerfile/7.5_entrypoint.md index 2d13797..a82cf2d 100644 --- a/07_dockerfile/7.5_entrypoint.md +++ b/07_dockerfile/7.5_entrypoint.md @@ -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 ``` -#### 2。提供有意义的默认参数 +#### 2. 提供有意义的默认参数 如下代码块所示,展示了相关示例: @@ -317,7 +317,7 @@ ENTRYPOINT ["nginx"] CMD ["-g", "daemon off;"] ``` -#### 3。入口脚本使用 exec +#### 3. 入口脚本使用 exec 运行以下命令: @@ -330,7 +330,7 @@ CMD ["-g", "daemon off;"] exec "$@" ``` -#### 4。处理信号 +#### 4. 处理信号 确保 ENTRYPOINT 脚本能正确传递信号: diff --git a/07_dockerfile/7.6_env.md b/07_dockerfile/7.6_env.md index c6cc13f..46470aa 100644 --- a/07_dockerfile/7.6_env.md +++ b/07_dockerfile/7.6_env.md @@ -49,7 +49,7 @@ ENV NODE_VERSION=20.10.0 \ 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。后续指令中使用 +#### 1. 后续指令中使用 如下代码块所示,展示了相关示例: @@ -71,7 +71,7 @@ WORKDIR $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 ``` -#### 2。不要存储敏感信息 +#### 2. 不要存储敏感信息 如下代码块所示,展示了相关示例: @@ -227,7 +227,7 @@ ENV DB_PASSWORD=secret123 ... ``` -#### 3。为应用提供合理默认值 +#### 3. 为应用提供合理默认值 如下代码块所示,展示了相关示例: @@ -237,7 +237,7 @@ ENV APP_ENV=production \ LOG_LEVEL=info ``` -#### 4。使用有意义的变量名 +#### 4. 使用有意义的变量名 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.7_arg.md b/07_dockerfile/7.7_arg.md index a39be38..fab19f9 100644 --- a/07_dockerfile/7.7_arg.md +++ b/07_dockerfile/7.7_arg.md @@ -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 . ``` -#### 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 ``` -#### 3。配置构建环境 +#### 3. 配置构建环境 如下代码块所示,展示了相关示例: @@ -172,7 +172,7 @@ RUN if [ "$ENABLE_DEBUG" = "true" ]; then \ 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 ``` -#### 2。不要用 ARG 存储敏感信息 +#### 2. 不要用 ARG 存储敏感信息 如下代码块所示,展示了相关示例: @@ -262,7 +262,7 @@ RUN echo "password=$DB_PASSWORD" > /app/.env ... ``` -#### 3。使用 ARG 提高构建灵活性 +#### 3. 使用 ARG 提高构建灵活性 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.8_volume.md b/07_dockerfile/7.8_volume.md index c40ab8d..b855a23 100644 --- a/07_dockerfile/7.8_volume.md +++ b/07_dockerfile/7.8_volume.md @@ -73,7 +73,7 @@ VOLUME ["/data", "/logs", "/config"] 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。自动创建匿名卷 +#### 1. 自动创建匿名卷 如果运行时未指定挂载,Docker 会自动创建匿名卷: @@ -84,7 +84,7 @@ DRIVER VOLUME NAME local a1b2c3d4e5f6... # 自动创建的匿名卷 ``` -#### 2。可被命名卷覆盖 +#### 2. 可被命名卷覆盖 运行以下命令: @@ -94,7 +94,7 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷 $ 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 ``` -#### 2。不要在 VOLUME 后修改目录 +#### 2. 不要在 VOLUME 后修改目录 如下代码块所示,展示了相关示例: @@ -290,7 +290,7 @@ RUN mkdir -p /app/data && cp init-data.json /app/data/ VOLUME /app/data ``` -#### 3。文档中说明 VOLUME 用途 +#### 3. 文档中说明 VOLUME 用途 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/7.9_expose.md b/07_dockerfile/7.9_expose.md index 4098ea1..778e364 100644 --- a/07_dockerfile/7.9_expose.md +++ b/07_dockerfile/7.9_expose.md @@ -39,7 +39,7 @@ EXPOSE 53/udp 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。文档说明 +#### 1. 文档说明 告诉镜像使用者,容器将在哪些端口提供服务: @@ -56,7 +56,7 @@ $ docker inspect nginx --format '{{.Config.ExposedPorts}}' map[80/tcp:{}] ``` -#### 2。配合 -P 使用 +#### 2. 配合 -P 使用 使用 `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 ``` -#### 2。使用明确的协议 +#### 2. 使用明确的协议 如下代码块所示,展示了相关示例: @@ -201,7 +201,7 @@ EXPOSE 53/udp EXPOSE 53/tcp 53/udp ``` -#### 3。与应用实际端口保持一致 +#### 3. 与应用实际端口保持一致 如下代码块所示,展示了相关示例: diff --git a/07_dockerfile/summary.md b/07_dockerfile/summary.md index 5604d21..24c4ceb 100644 --- a/07_dockerfile/summary.md +++ b/07_dockerfile/summary.md @@ -26,7 +26,7 @@ ### 7.19.2 延伸阅读 -- [安全](../17_security/README.md):容器安全实践 +- [安全](../18_security/README.md):容器安全实践 - [ENTRYPOINT](7.5_entrypoint.md):入口脚本中的用户切换 - [最佳实践](../appendix/20.1_best_practices.md):Dockerfile 安全 @@ -41,7 +41,7 @@ ### 7.19.3 延伸阅读 - [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):容器排障 | 要点 | 说明 | @@ -163,7 +163,7 @@ ### 7.19.12 延伸阅读 - [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 编写指南 | 要点 | 说明 | @@ -191,9 +191,9 @@ ### 7.19.14 延伸阅读 -- [数据卷](../08_data_network/data/volume.md):卷的管理和使用 -- [挂载主机目录](../08_data_network/data/bind-mounts.md):Bind Mount -- [Compose 数据管理](../10_compose/10.5_compose_file.md):Compose 中的卷配置 +- [数据卷](../08_data/volume.md):卷的管理和使用 +- [挂载主机目录](../08_data/bind-mounts.md):Bind Mount +- [Compose 数据管理](../11_compose/11.5_compose_file.md):Compose 中的卷配置 | 要点 | 说明 | |------|------| @@ -205,6 +205,6 @@ ### 7.19.15 延伸阅读 -- [网络配置](../08_data_network/network/README.md):Docker 网络详解 -- [端口映射](../08_data_network/network/port_mapping.md):-p 参数详解 -- [Compose 端口](../10_compose/10.5_compose_file.md):Compose 中的端口配置 +- [网络配置](../09_network/README.md):Docker 网络详解 +- [端口映射](../09_network/port_mapping.md):-p 参数详解 +- [Compose 端口](../11_compose/11.5_compose_file.md):Compose 中的端口配置 diff --git a/08_data/bind-mounts.md b/08_data/bind-mounts.md index d5c5eee..7c7cee5 100644 --- a/08_data/bind-mounts.md +++ b/08_data/bind-mounts.md @@ -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 ``` -#### 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 ``` -#### 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 ``` -#### 4。注意路径安全 +#### 4. 注意路径安全 运行以下命令: diff --git a/08_data/summary.md b/08_data/summary.md index d3aa5d2..cf0d42c 100644 --- a/08_data/summary.md +++ b/08_data/summary.md @@ -14,7 +14,7 @@ - [数据卷](volume.md):Docker 管理的持久化存储 - [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):挂载宿主机目录 - [tmpfs 挂载](tmpfs.md):内存中的临时存储 -- [存储驱动](../../11_implementation/11.4_ufs.md):Docker 存储的底层原理 +- [存储驱动](../12_implementation/12.4_ufs.md):Docker 存储的底层原理 diff --git a/09_network/summary.md b/09_network/summary.md index d1bed18..a22dead 100644 --- a/09_network/summary.md +++ b/09_network/summary.md @@ -21,4 +21,4 @@ - [端口映射](port_mapping.md):高级端口配置 - [网络隔离](network_isolation.md):网络安全与隔离策略 - [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 中的网络配置 diff --git a/10_buildx/10.2_buildx.md b/10_buildx/10.2_buildx.md index 4a7d73d..766f123 100644 --- a/10_buildx/10.2_buildx.md +++ b/10_buildx/10.2_buildx.md @@ -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` diff --git a/10_buildx/README.md b/10_buildx/README.md index de4fadf..9445822 100644 --- a/10_buildx/README.md +++ b/10_buildx/README.md @@ -1,6 +1,6 @@ # 第十章 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+。在较新版本中已更常用且功能更完整。 @@ -12,6 +12,6 @@ Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持 本章将详细介绍 Docker Buildx 的使用,包括: -* [使用 BuildKit 构建镜像](9.1_buildkit.md) -* [使用 Buildx 构建镜像](9.2_buildx.md) -* [构建多种系统架构支持的 Docker 镜像](9.3_multi-arch-images.md) +* [使用 BuildKit 构建镜像](10.1_buildkit.md) +* [使用 Buildx 构建镜像](10.2_buildx.md) +* [构建多种系统架构支持的 Docker 镜像](10.3_multi-arch-images.md) diff --git a/11_compose/11.6_django.md b/11_compose/11.6_django.md index b4b5937..9172fdc 100644 --- a/11_compose/11.6_django.md +++ b/11_compose/11.6_django.md @@ -368,7 +368,7 @@ services: ### 11.6.12 延伸阅读 -- [Compose 模板文件详解](10.5_compose_file.md):深入理解 Compose 文件的所有配置项 -- [使用 WordPress](10.8_wordpress.md):另一个 Compose 实战案例 +- [Compose 模板文件详解](11.5_compose_file.md):深入理解 Compose 文件的所有配置项 +- [使用 WordPress](11.8_wordpress.md):另一个 Compose 实战案例 - [Dockerfile 最佳实践](../appendix/20.1_best_practices.md):构建更小、更安全的镜像 -- [数据管理](../08_data_network/README.md):Volume 和数据持久化详解 +- [数据管理](../08_data/README.md):Volume 和数据持久化详解 diff --git a/11_compose/11.7_rails.md b/11_compose/11.7_rails.md index 2d8f546..b3a833f 100644 --- a/11_compose/11.7_rails.md +++ b/11_compose/11.7_rails.md @@ -294,6 +294,6 @@ $ docker compose run --rm web bundle update ### 11.7.14 延伸阅读 -- [使用 Django](10.6_django.md):Python Web 框架实战 -- [Compose 模板文件](10.5_compose_file.md):配置详解 -- [数据管理](../08_data_network/README.md):数据持久化 +- [使用 Django](11.6_django.md):Python Web 框架实战 +- [Compose 模板文件](11.5_compose_file.md):配置详解 +- [数据管理](../08_data/README.md):数据持久化 diff --git a/11_compose/11.8_wordpress.md b/11_compose/11.8_wordpress.md index 5956a34..3719985 100644 --- a/11_compose/11.8_wordpress.md +++ b/11_compose/11.8_wordpress.md @@ -83,7 +83,7 @@ networks: 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。环境变量 (。env) +#### 1. 环境变量 (.env) 为了安全,不要在 `compose.yaml` 中直接写密码。创建 `.env` 文件: @@ -94,14 +94,14 @@ DB_PASSWORD=somestronguserpassword Compose 会自动读取此同级目录下的文件。 -#### 2。数据持久化 +#### 2. 数据持久化 我们定义了两个命名卷: - `db_data`:确保 MySQL 容器重建后数据不丢失 - `wp_data`:保存 WordPress 的核心文件、插件、主题和上传的媒体文件 -#### 3。PHP 配置优化 +#### 3. PHP 配置优化 默认的 WordPress 镜像上传文件限制较小 (通常 2MB)。创建 `uploads.ini`: @@ -138,7 +138,7 @@ $ docker compose logs -f 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。数据库备份 +#### 1. 数据库备份 不要只依赖 Volume。建议定期备份数据库: @@ -168,11 +168,11 @@ $ docker exec wordpress_db mysqldump -u wordpress -pwordpress wordpress > backup - wp_net ``` -#### 2。使用 Nginx 反向代理 +#### 2. 使用 Nginx 反向代理 在生产环境中,不要直接暴露 WordPress 端口,而是通过 Nginx 进行反向代理并配置 SSL。 -#### 3。使用 Redis 缓存 +#### 3. 使用 Redis 缓存 WordPress 支持 Redis 缓存以提高性能。 @@ -216,6 +216,6 @@ $ docker compose restart wordpress ### 11.8.7 延伸阅读 -- [Compose 模板文件](10.5_compose_file.md):深入了解配置项 -- [数据卷](../08_data_network/data/volume.md):理解数据持久化 +- [Compose 模板文件](11.5_compose_file.md):深入了解配置项 +- [数据卷](../08_data/volume.md):理解数据持久化 - [Docker Hub WordPress](https://hub.docker.com/_/wordpress):官方镜像文档 diff --git a/11_compose/README.md b/11_compose/README.md index 3aaf848..5b3934d 100644 --- a/11_compose/README.md +++ b/11_compose/README.md @@ -4,12 +4,12 @@ 本章将介绍 `Compose` 项目情况以及安装和使用。 -* [简介](10.1_introduction.md) -* [安装与卸载](10.2_install.md) -* [使用](10.3_usage.md) -* [命令说明](10.4_commands.md) -* [Compose 模板文件](10.5_compose_file.md) -* [实战 Django](10.6_django.md) -* [实战 Rails](10.7_rails.md) -* [实战 WordPress](10.8_wordpress.md) -* [实战 LNMP](10.9_lnmp.md) +* [简介](11.1_introduction.md) +* [安装与卸载](11.2_install.md) +* [使用](11.3_usage.md) +* [命令说明](11.4_commands.md) +* [Compose 模板文件](11.5_compose_file.md) +* [实战 Django](11.6_django.md) +* [实战 Rails](11.7_rails.md) +* [实战 WordPress](11.8_wordpress.md) +* [实战 LNMP](11.9_lnmp.md) diff --git a/11_compose/summary.md b/11_compose/summary.md index 66419a1..74b626f 100644 --- a/11_compose/summary.md +++ b/11_compose/summary.md @@ -15,7 +15,7 @@ Docker Compose 是管理多容器应用的利器,通过 YAML 文件声明式 ### 11.10.1 延伸阅读 -- [Compose 模板文件](10.5_compose_file.md):详细模板语法参考 -- [Compose 命令说明](10.4_commands.md):完整命令列表 +- [Compose 模板文件](11.5_compose_file.md):详细模板语法参考 +- [Compose 命令说明](11.4_commands.md):完整命令列表 - [网络配置](../09_network/README.md):Docker 网络基础 - [数据管理](../08_data/README.md):数据卷管理 diff --git a/12_implementation/12.1_arch.md b/12_implementation/12.1_arch.md index fecc62e..e322354 100644 --- a/12_implementation/12.1_arch.md +++ b/12_implementation/12.1_arch.md @@ -154,6 +154,6 @@ flowchart TD ### 12.1.7 延伸阅读 -- [命名空间](./11.2_namespace.md):Runc 如何隔离容器 -- [控制组](./11.3_cgroups.md):Runc 如何限制资源 -- [联合文件系统](./11.4_ufs.md):镜像如何存储 +- [命名空间](./12.2_namespace.md):Runc 如何隔离容器 +- [控制组](./12.3_cgroups.md):Runc 如何限制资源 +- [联合文件系统](./12.4_ufs.md):镜像如何存储 diff --git a/12_implementation/12.3_cgroups.md b/12_implementation/12.3_cgroups.md index a3f2ab9..84ae695 100644 --- a/12_implementation/12.3_cgroups.md +++ b/12_implementation/12.3_cgroups.md @@ -269,7 +269,7 @@ services: 在使用 Cgroups 限制资源时,遵循一些最佳实践可以避免潜在的问题。 -#### 1。始终设置内存限制 +#### 1. 始终设置内存限制 运行以下命令: @@ -279,7 +279,7 @@ services: $ 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 ``` -#### 3。监控资源使用 +#### 3. 监控资源使用 运行以下命令: diff --git a/12_implementation/12.4_ufs.md b/12_implementation/12.4_ufs.md index ea4c208..123a807 100644 --- a/12_implementation/12.4_ufs.md +++ b/12_implementation/12.4_ufs.md @@ -28,7 +28,7 @@ flowchart TD Docker 选择联合文件系统作为其存储驱动,主要基于以下几个核心优势。 -#### 1。镜像分层复用 +#### 1. 镜像分层复用 如下代码块所示,展示了相关示例: @@ -40,7 +40,7 @@ flowchart TD 多个镜像共享相同的底层,节省磁盘空间。 -#### 2。快速构建 +#### 2. 快速构建 每个 Dockerfile 指令创建一层,只有变化的层需要重建: @@ -53,7 +53,7 @@ COPY . . # 层4:应用代码 代码变化时,只需重建层 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/* ``` -#### 2。避免在容器中写入大量数据 +#### 2. 避免在容器中写入大量数据 容器层的写入性能低于直接写入。大量数据应使用: - 数据卷 (Volume) - 绑定挂载 (Bind Mount) -#### 3。使用。dockerignore +#### 3. 使用 .dockerignore 排除不需要的文件可以: diff --git a/12_implementation/README.md b/12_implementation/README.md index 83a3bdd..0f0d1eb 100644 --- a/12_implementation/README.md +++ b/12_implementation/README.md @@ -12,9 +12,9 @@ Docker 底层的核心技术包括 Linux 上的命名空间 (Namespaces)、控 随着 Linux 系统对于命名空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的命名空间中运行。大家虽然都共用一个内核和某些运行时环境 (例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器 (Container),利用命名空间来做权限的隔离控制,利用 cgroups 来做资源分配。 -* [基本架构](11.1_arch.md) -* [命名空间](11.2_namespace.md) -* [控制组](11.3_cgroups.md) -* [联合文件系统](11.4_ufs.md) -* [容器格式](11.5_container_format.md) -* [网络](11.6_network.md) +* [基本架构](12.1_arch.md) +* [命名空间](12.2_namespace.md) +* [控制组](12.3_cgroups.md) +* [联合文件系统](12.4_ufs.md) +* [容器格式](12.5_container_format.md) +* [网络](12.6_network.md) diff --git a/12_implementation/summary.md b/12_implementation/summary.md index 84c8e35..dc38c04 100644 --- a/12_implementation/summary.md +++ b/12_implementation/summary.md @@ -13,9 +13,9 @@ ### 12.7.1 延伸阅读 -- [控制组 (Cgroups)](11.3_cgroups.md):资源限制机制 -- [联合文件系统](11.4_ufs.md):分层存储的实现 -- [安全](../17_security/README.md):容器安全实践 +- [控制组 (Cgroups)](12.3_cgroups.md):资源限制机制 +- [联合文件系统](12.4_ufs.md):分层存储的实现 +- [安全](../18_security/README.md):容器安全实践 - [Linux Namespace 官方文档](https://man7.org/linux/man-pages/man7/namespaces.7.html) | 资源 | 限制参数 | 示例 | @@ -28,8 +28,8 @@ ### 12.7.2 延伸阅读 -- [命名空间](11.2_namespace.md):资源隔离 -- [安全](../17_security/README.md):容器安全概述 +- [命名空间](12.2_namespace.md):资源隔离 +- [安全](../18_security/README.md):容器安全概述 - [Docker Stats](../05_container/README.md):监控容器资源 | 概念 | 说明 | diff --git a/13_kubernetes_concepts/concepts.md b/13_kubernetes_concepts/concepts.md index 5e56fc0..5755a23 100644 --- a/13_kubernetes_concepts/concepts.md +++ b/13_kubernetes_concepts/concepts.md @@ -105,10 +105,10 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中,有两个接 为什么不在一个单一的容器里运行多个程序? -* 1。透明化。为了使容器组中的容器保持一致的基础设施和服务,比如进程管理和资源监控。这样设计是为了用户的便利性。 -* 2。解偶软件之间的依赖。每个容器都可能重新构建和发布,Kubernetes 必须支持热发布和热更新 (将来)。 -* 3。方便使用。用户不必运行独立的程序管理,也不用担心每个应用程序的退出状态。 -* 4。高效。考虑到基础设施有更多的职责,容器必须要轻量化。 +* 1. 透明化。为了使容器组中的容器保持一致的基础设施和服务,比如进程管理和资源监控。这样设计是为了用户的便利性。 +* 2. 解耦软件之间的依赖。每个容器都可能重新构建和发布,Kubernetes 必须支持热发布和热更新 (将来)。 +* 3. 方便使用。用户不必运行独立的程序管理,也不用担心每个应用程序的退出状态。 +* 4. 高效。考虑到基础设施有更多的职责,容器必须要轻量化。 #### 容器组的生命状态 diff --git a/13_kubernetes_concepts/intro.md b/13_kubernetes_concepts/intro.md index c93cc00..c1123c7 100644 --- a/13_kubernetes_concepts/intro.md +++ b/13_kubernetes_concepts/intro.md @@ -91,5 +91,5 @@ Kubernetes 的学习曲线较陡峭。建议的学习路径: ### 13.1.7 延伸阅读 -- [Minikube 安装](../setup/README.md):本地体验 K8s +- [Minikube 安装](../14_kubernetes_setup/README.md):本地体验 K8s - [Kubernetes 官网](https://kubernetes.io/):官方文档 diff --git a/14_kubernetes_setup/kubeadm-docker.md b/14_kubernetes_setup/kubeadm-docker.md index 45f2f24..eac64b9 100644 --- a/14_kubernetes_setup/kubeadm-docker.md +++ b/14_kubernetes_setup/kubeadm-docker.md @@ -8,7 +8,7 @@ ### 14.2.1 安装 Docker -参考[安装 Docker](../../03_install/README.md) 一节安装 Docker。 +参考[安装 Docker](../03_install/README.md) 一节安装 Docker。 ### 14.2.2 安装 **kubelet****kubeadm****kubectl** diff --git a/14_kubernetes_setup/kubeadm.md b/14_kubernetes_setup/kubeadm.md index cb437aa..56a8f3d 100644 --- a/14_kubernetes_setup/kubeadm.md +++ b/14_kubernetes_setup/kubeadm.md @@ -6,7 +6,7 @@ ### 14.1.1 安装 containerd -参考[安装 Docker](../../03_install/README.md) 一节添加 apt/yum 源,之后执行如下命令。 +参考[安装 Docker](../03_install/README.md) 一节添加 apt/yum 源,之后执行如下命令。 ```bash ## debian 系 diff --git a/15_etcd/cluster.md b/15_etcd/cluster.md index 96f3ea4..8680806 100644 --- a/15_etcd/cluster.md +++ b/15_etcd/cluster.md @@ -1,6 +1,6 @@ ## 15.3 etcd 集群 -下面我们使用 [Docker Compose](../../10_compose/README.md) 模拟启动一个 3 节点的 `etcd` 集群。 +下面我们使用 [Docker Compose](../11_compose/README.md) 模拟启动一个 3 节点的 `etcd` 集群。 编辑 `compose.yaml` (或 `docker-compose.yml`) 文件 diff --git a/16_cloud/multicloud.md b/16_cloud/multicloud.md index d25d084..7878119 100644 --- a/16_cloud/multicloud.md +++ b/16_cloud/multicloud.md @@ -18,21 +18,21 @@ 随着企业业务的扩展,单一云平台可能无法满足所有需求,多云部署成为趋势。 -#### 1。跨云灾备 (Active-Passive) +#### 1. 跨云灾备 (Active-Passive) 主要业务运行在一个云 (如 AWS),数据实时复制到另一个云 (如阿里云)。当主云发生故障时,流量切换到备云。 * **优点**:架构相对简单,数据一致性好控制。 * **缺点**:资源闲置浪费,切换可能有 RTO。 -#### 2。多活部署 (Active-Active) +#### 2. 多活部署 (Active-Active) 业务同时在多个云上运行,通过全局流量管理 (DNS/GSLB) 分发流量。 * **优点**:高可用,就近接入提升用户体验。 * **缺点**:数据同步复杂,跨云网络延迟问题。 -#### 3。混合云 +#### 3. 混合云 核心数据和敏感业务保留在私有云 (IDC),弹性业务或前端业务部署在公有云。 diff --git a/18_security/README.md b/18_security/README.md index 75a6829..22edbdd 100644 --- a/18_security/README.md +++ b/18_security/README.md @@ -30,7 +30,7 @@ flowchart LR 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -### 1。命名空间 +### 1. 命名空间 提供进程、网络、文件系统等资源的隔离: @@ -43,9 +43,9 @@ flowchart LR | IPC | 进程通信 | 隔离共享内存 | | 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 ``` -### 3。能力机制 +### 3. 能力机制 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 ``` -### 2。只读文件系统 +### 2. 只读文件系统 运行以下命令: @@ -199,7 +199,7 @@ $ docker run --read-only 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 ``` -### 4。限制资源 +### 4. 限制资源 运行以下命令: @@ -226,7 +226,7 @@ $ docker run \ myapp ``` -### 5。网络隔离 +### 5. 网络隔离 运行以下命令: @@ -247,7 +247,7 @@ $ docker run --network=isolated_net myapp 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -### 1。使用精简基础镜像 +### 1. 使用精简基础镜像 Dockerfile 内容如下: @@ -263,7 +263,7 @@ FROM node:22 # ~1GB FROM ubuntu:24.04 # ~78MB ``` -### 2。多阶段构建 +### 2. 多阶段构建 Dockerfile 内容如下: @@ -283,7 +283,7 @@ USER node CMD ["node", "/app/server.js"] ``` -### 3。不存储敏感信息 +### 3. 不存储敏感信息 Dockerfile 内容如下: @@ -300,7 +300,7 @@ COPY .env /app/ ... ``` -### 4。固定依赖版本 +### 4. 固定依赖版本 Dockerfile 内容如下: @@ -371,14 +371,14 @@ $ docker run --runtime=runsc myapp 随着软件供应链攻击日益频繁,仅保障运行时安全已不足够。 -### 1。SBOM (软件物料清单) +### 1. SBOM (软件物料清单) SBOM 类似于食品的配料表,列出了容器镜像中包含的所有软件包及其版本。 - **生成 SBOM**:使用 `docker buildx build --sbom` 或 `docker scout 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):隔离机制详解 -- [控制组](../../11_implementation/11.3_cgroups.md):资源限制详解 -- [最佳实践](../../appendix/20.1_best_practices.md):Dockerfile 安全配置 +- [命名空间](../12_implementation/12.2_namespace.md):隔离机制详解 +- [控制组](../12_implementation/12.3_cgroups.md):资源限制详解 +- [最佳实践](../appendix/20.1_best_practices.md):Dockerfile 安全配置 diff --git a/19_observability/elk.md b/19_observability/elk.md index 667b446..e738ee8 100644 --- a/19_observability/elk.md +++ b/19_observability/elk.md @@ -15,7 +15,7 @@ ELK (Elasticsearch,Logstash,Kibana) 是目前业界最流行的开源日志 我们将使用 Docker Compose 来一键部署整个日志堆栈。 -#### 1。编写 Compose 文件 +#### 1. 编写 Compose 文件 1. 编写 `compose.yaml` (或 `docker-compose.yml`) 配置如下: @@ -71,7 +71,7 @@ networks: logging: ``` -#### 2。配置 Fluentd +#### 2. 配置 Fluentd 创建 `fluentd/conf/fluent.conf`: @@ -102,7 +102,7 @@ networks: ``` -#### 3。配置应用容器使用 fluentd 驱动 +#### 3. 配置应用容器使用 fluentd 驱动 启动一个测试容器,指定日志驱动为 `fluentd`: @@ -117,7 +117,7 @@ docker run -d \ **注意**:确保 `fluentd` 容器已经启动并监听在 `localhost:24224`。在生产环境中,如果你是在不同机器上,需要将 `localhost` 替换为运行 fluentd 的主机 IP。 -#### 4。在 Kibana 中查看日志 +#### 4. 在 Kibana 中查看日志 1. 访问 `http://localhost:5601`。 2. 进入 **Management**->**Kibana**->**Index Patterns**。 diff --git a/19_observability/prometheus.md b/19_observability/prometheus.md index aa197df..045d6bf 100644 --- a/19_observability/prometheus.md +++ b/19_observability/prometheus.md @@ -17,7 +17,7 @@ Prometheus 的主要组件包括: 我们可以使用 Docker Compose 快速部署一套 Prometheus + Grafana 监控环境。 -#### 1。准备配置文件 +#### 1. 准备配置文件 创建 `prometheus.yml`: @@ -39,7 +39,7 @@ scrape_configs: - targets: ['cadvisor:8080'] ``` -#### 2。编写 Docker Compose 文件 +#### 2. 编写 Docker Compose 文件 创建 `compose.yaml` (或 `docker-compose.yml`): @@ -88,7 +88,7 @@ networks: monitoring: ``` -#### 3。启动服务 +#### 3. 启动服务 运行以下命令: diff --git a/20_cases/ci/devops_workflow.md b/20_cases/ci/devops_workflow.md index 7eb5713..beb4033 100644 --- a/20_cases/ci/devops_workflow.md +++ b/20_cases/ci/devops_workflow.md @@ -16,7 +16,7 @@ 本节涵盖了相关内容与详细描述,主要探讨以下几个方面: -#### 1。Dockerfile 多阶段构建 +#### 1. Dockerfile 多阶段构建 使用 Docker 多阶段构建可以有效减小镜像体积。 @@ -39,7 +39,7 @@ COPY --from=builder /app/main . CMD ["./main"] ``` -#### 2。GitLab CI 配置 +#### 2. GitLab CI 配置 GitLab CI (。gitlab-ci.yml) 配置如下: diff --git a/appendix/20.1_best_practices.md b/appendix/20.1_best_practices.md index 9fbd2ff..de1e38f 100644 --- a/appendix/20.1_best_practices.md +++ b/appendix/20.1_best_practices.md @@ -26,7 +26,7 @@ 应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web 应用、数据库、缓存。 -如果容器互相依赖,你可以使用 [Docker 自定义网络](../08_data_network/network/README.md)来把这些容器连接起来。 +如果容器互相依赖,你可以使用 [Docker 自定义网络](../09_network/custom_network.md)来把这些容器连接起来。 #### 镜像层数尽可能少 diff --git a/appendix/README.md b/appendix/README.md index fd49703..c0e936a 100644 --- a/appendix/README.md +++ b/appendix/README.md @@ -14,5 +14,5 @@ * [**Dockerfile 最佳实践**](20.1_best_practices.md):提供编写高效、安全 Dockerfile 的指导原则。 * [**如何调试 Docker**](20.2_debug.md):介绍 Docker 调试技巧和工具。 * [**资源链接**](20.3_resources.md):推荐更多 Docker 相关的学习资源。 -* [**术语词表 (出版统一版)**](20.4_terminology.md):统一全书中英文术语、缩写与命令写法。 -* [**出版清稿规范 (图号与章节风格)**](20.5_editorial_style.md):统一图号命名、图题写法与章节风格。 +* **术语词表 (出版统一版)**:统一全书中英文术语、缩写与命令写法。(本仓库暂未收录对应文件) +* **出版清稿规范 (图号与章节风格)**:统一图号命名、图题写法与章节风格。(本仓库暂未收录对应文件)