## File: README.md

---

## 关于本书

[Docker](https://www.docker.com) 是个划时代的开源项目，它彻底释放了计算虚拟化的威力，极大提高了应用的维护效率，降低了云计算应用开发的成本！使用 Docker，可以让应用的部署、测试和分发都变得前所未有的高效和轻松！

无论是应用开发者、运维人员、还是其他信息技术从业人员，都有必要认识和掌握 Docker，节约有限的生命。

本书既适用于具备基础 Linux 知识的 Docker 初学者，也希望可供理解原理和实现的高级用户参考。同时，书中给出的实践案例，可供在进行实际部署时借鉴。

## 内容特色

*   **入门基础**：第 1 ~ 6 章为基础内容，帮助深入理解 Docker 的基本概念 (镜像、容器、仓库) 和核心操作。
*   **进阶应用**：第 7 ~ 11 章涵盖 Dockerfile 指令详解、数据与网络管理、Buildx、Compose 等高级配置和管理操作。
*   **深入原理**：第 12 ~ 17 章介绍其底层实现技术，深入探讨容器编排体系 (Kubernetes、Etcd)，并延伸涉及容器与云计算及其它关键生态项目 (Fedora CoreOS、Podman 等)。
*   **实战扩展**：第 18 ~ 21 章重点讨论容器安全防护机制、监控与日志聚合系统 (Prometheus、ELK)，并展示操作系统、CI/CD 自动化构建等典型实践案例。

## 五分钟快速上手

“5分钟运行第一个容器”——跟随以下步骤快速体验 Docker：

1. **安装 Docker**（第3章）：根据操作系统完成 Docker 的安装与验证
2. **第一个容器**（第1章 `1.1`）：快速体验构建镜像与启动容器的完整流程
3. **交互式容器**（第5章）：执行 `docker run -it ubuntu bash`，进入容器内部与系统交互
4. **镜像与仓库**（第2章、第4章、第6章）：理解核心概念，并学会拉取、使用与管理镜像和仓库
5. **自定义镜像**（第7章）：学习如何编写 Dockerfile 创建自己的镜像

## 学习路线图

```mermaid
graph LR
    Start[Docker 学习入口] --> Ch1[第1章：Docker 简介]

    Ch1 --> Role1["运维新手第1-6章"]
    Ch1 --> Role2["开发者第1-8章 → 第11章"]
    Ch1 --> Role3["DevOps 工程师第1-11章 → 第13-14章 → 第18-21章"]
    Ch1 --> Role4["架构师第1-6章 → 第12-17章 → 第18-19章"]

    Role1 --> End1["掌握基本操作"]
    Role2 --> End2["构建与部署应用"]
    Role3 --> End3["自动化与运维"]
    Role4 --> End4["设计容器方案"]
```
| 读者角色 | 学习重点 | 核心成果 |
|---------|---------|---------|
| **运维新手** | 第1-6章 | 掌握容器的基本概念与操作 |
| **开发者** | 第1-8章 → 第11章 | 学会容器化应用的构建与部署 |
| **DevOps 工程师** | 第1-11章 → 第13-14章 → 第18-21章 | 实现容器编排与自动化部署流程 |
| **架构师** | 第1-6章 → 第12-17章 → 第18-19章 | 设计高可用、高性能的容器基础设施 |

## 在线阅读

本书在线阅读，可直接访问 [GitBook](https://yeasy.gitbook.io/docker_practice/)。也可访问 [GitHub 仓库目录](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)。

## 下载离线版本

本书提供 PDF 版本供离线阅读，可前往 [GitHub Releases](https://github.com/yeasy/docker_practice/releases/latest) 页面下载最新版本。

如需获取默认分支自动更新的预览版，可直接下载 [docker_practice.pdf](https://github.com/yeasy/docker_practice/releases/download/preview-pdf/docker_practice.pdf)。该文件会随主线更新覆盖，不代表正式发布版本。

## 本地阅读

先安装 [mdPress](https://github.com/yeasy/mdpress)：

```bash
brew tap yeasy/tap && brew install mdpress
mdpress serve
```

## 社区交流

- [GitHub Issues](https://github.com/yeasy/docker_practice/issues/new/choose)（内容错误、建议）

## 推荐阅读

本书是技术丛书的一部分。以下书籍与本书形成互补：

| 书名 | 与本书的关系 |
|------|------------|
| [《前线部署工程实践指南》](https://yeasy.gitbook.io/forward_deployed_engineering_guide/) | 讲容器、Kubernetes、GitOps、IaC、供应链、安全、观测与 SLO 如何组合成可交付、可审计、可运营的部署工程体系 |
| [《智能体 Harness 工程指南》](https://yeasy.gitbook.io/harness_engineering_guide) | Agent 基础设施中的容器化部署与隔离 |
| [《大模型安全权威指南》](https://yeasy.gitbook.io/ai_security_guide) | 容器安全与 AI 系统安全的交叉实践 |
| [《区块链技术指南》](https://yeasy.gitbook.io/blockchain_guide) | 区块链节点的容器化部署 |

## 参与贡献

欢迎[参与项目维护](CONTRIBUTING.md)。

*   [修订记录](CHANGELOG.md)
*   [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)

## 进阶学习

《[Docker 技术入门与实战][1]》已更新到第 4 版，讲解最新容器技术栈知识，欢迎大家阅读并反馈建议。[京东图书][1] | [天猫图书](https://detail.tmall.com/item.htm?id=997383773726&skuId=6143496614475)

## 支持鼓励

欢迎鼓励项目一杯 coffee~



## Star History



## 许可证

本书采用 [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可证。

您可以自由分享和演绎，但需署名、非商业使用、相同方式共享。

[1]: https://item.jd.com/10200902362001.html

---

## File: 01_introduction/README.md

# 第一章 Docker 简介

本章将带领你进入 **Docker** 的世界。

> **版本提示**：本书内容及示例基于 **Docker Engine v29.x** 及以上版本。值得注意的是，自 Docker Engine v29 起，官方在全新安装场景下 **默认启用 `containerd image store` 作为镜像存储后端**（取代传统 classic store 路径下的 graph driver 体系）。这项底层革新极大增强了 Docker 对多架构镜像（Multi-platform）以及软件供应链安全元数据（Attestations, SBOM, Provenance）的本地支持原生性。

## 本章内容

* [快速上手](1.1_quickstart.md)
  * 通过一个简单的 Web 应用例子，带你快速体验 Docker 的核心流程：构建镜像、运行容器。

* [什么是 Docker](1.2_what.md)
  * 介绍 Docker 的起源、发展历程以及其背后的核心技术 (Cgroups，Namespaces，UnionFS，以及 `containerd` 引擎的演进)。
  * 了解 Docker 是如何改变软件交付方式的。

* [为什么要用 Docker](1.3_why.md)
  * 对比传统虚拟机技术，阐述 Docker 在启动速度、资源利用率、交付效率等方面的巨大优势。
  * 探讨 Docker 在 DevOps、微服务架构中的关键作用。


## 学习目标

通过本章的学习，你将能够：

1. 理解 Docker 的核心概念与架构。
2. 明白 Docker 解决了现代软件开发与运维中的哪些痛点。
3. 建立起对容器技术的初步认知，为后续的实战操作打下基础。

好吧，让我们带着问题开始这神奇之旅。

---

## File: 02_basic_concept/README.md

# 第二章 基本概念

> **版本说明**：本章内容及示例基于 Docker v29.x 编写。镜像标签相关示例请查阅官方文档以确认最新可用版本。

**Docker** 包括三个基本概念：

* **镜像** (`Image`)：Docker 镜像是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据，其内容在构建之后也不会被改变。
* **容器** (`Container`)：镜像 (`Image`) 和容器 (`Container`) 的关系，就像是面向对象程序设计中的 `类` 和 `实例` 一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
* **仓库** (`Repository`)：镜像构建完成后，可以很容易的在当前宿主机上运行，但是，如果需要在其它服务器上使用这个镜像，我们就需要一个集中的存储、分发镜像的服务，Docker Registry 就是这样的服务。

理解了这三个概念，就理解了 **Docker** 的整个生命周期。

* [Docker 镜像](2.1_image.md)
* [Docker 容器](2.2_container.md)
* [Docker 仓库](2.3_repository.md)

---

## File: 03_install/README.md

# 第三章 安装 Docker

Docker Engine 主要提供 `stable` 和 `test` 两个更新频道；`test.docker.com` 对应测试频道，适合预发布验证，不建议直接用于生产环境。

官方网站上有各种环境下的[安装指南](https://docs.docker.com/get-docker/)，这里主要介绍 Docker 在 `Linux`、`Windows 10/11` 和 `macOS` 上的安装。

## 安装方式选择指南

在开始安装前，笔者建议你根据以下决策树选择最合适的安装方式：

### 生产环境 vs 开发环境

**生产环境**（服务器部署）：

- 优先使用**官方 APT/YUM 源安装**（Ubuntu、Debian、Fedora、CentOS）
- 优势：获得官方安全更新、长期技术支持、版本管理清晰
- 安装步骤稍多一些，但这种“麻烦”是值得的——它为你的生产系统争取了稳定性和可维护性

**开发环境**（本地开发机、测试服务器）：

- 配置 **Docker 官方源后** 使用包管理器安装，或在一次性测试环境使用官方脚本自动安装
- 如果你想快速上手，官方脚本（`get.docker.com`）是最便捷的选择
- 国内用户注意：这一步一定要选对镜像源，否则网络卡顿会严重影响体验

### 国内用户的网络优化建议

值得注意的是，国内直接访问 Docker 官方源速度较慢，建议：

- **安装过程**：使用阿里云、腾讯云等国内镜像源
- **镜像拉取**：安装完成后配置 Docker 镜像加速器（详见 [3.9 镜像加速器](3.9_mirror.md)），这一步对日常开发的体验提升最明显

### 特殊场景

- **Raspberry Pi/ARM 平台**：见 [3.5 Raspberry Pi](3.5_raspberry-pi.md)
- **离线环境**：见 [3.6 Linux 离线安装](3.6_offline.md)
- **macOS/Windows**：Docker Desktop 是官方推荐的一站式解决方案
- **需要实验特性**：见 [3.10 开启实验特性](3.10_experimental.md)

## 详细安装指南

* [Ubuntu](3.1_ubuntu.md)
* [Debian](3.2_debian.md)
* [Fedora](3.3_fedora.md)
* [CentOS](3.4_centos.md)
* [Raspberry Pi](3.5_raspberry-pi.md)
* [Linux 离线安装](3.6_offline.md)
* [macOS](3.7_mac.md)
* [Windows 10/11](3.8_windows.md)
* [镜像加速器](3.9_mirror.md)
* [开启实验特性](3.10_experimental.md)

---

## File: 04_image/README.md

# 第四章 使用镜像

在之前的介绍中，我们知道镜像是 Docker 的三大组件之一。

Docker 运行容器前需要本地存在对应的镜像，如果本地不存在该镜像，Docker 会从镜像仓库下载该镜像。

## 本章内容

本章将介绍更多关于镜像的内容，包括：

* [从仓库获取镜像](4.1_pull.md)
* [列出镜像](4.2_list.md)
* [删除本地镜像](4.3_rm.md)
* [利用 commit 理解镜像构成](4.4_commit.md)
* [使用 Dockerfile 定制镜像](4.5_build.md)
* [其它制作镜像的方式](4.6_other.md)
* [镜像的实现原理](4.7_internal.md)

> **版本提示：镜像存储后端的变迁**
>
> 在 Docker Engine v29 及后续版本中，Docker 在**全新安装场景**默认启用 **containerd image store**（替代传统 classic store 路径）。这一底层架构级别的变迁，意味着 Docker 解锁了对 OCI Image Index 和 Attestations（例如原生的 provenance 来源证明与 SBOM 软件物料清单）的全量本地支持。
> 读者在执行类似 `docker buildx build --provenance=mode=min --sbom=true` 甚至使用后续审查工具（如 `docker buildx imagetools inspect`）时，其元数据能够与镜像数据一并完好地管理于本地存储系统中，为供应链安全验证补齐了最后一块拼图。

---

## File: 05_container/README.md

# 第五章 操作容器

容器是 Docker 又一核心概念。

简单的说，容器是独立运行的一个或一组应用，以及它们的运行态环境。对应的，虚拟机可以理解为模拟运行的一整套操作系统 (提供了运行态环境和其他系统环境) 和跑在上面的应用。

本章将具体介绍如何来管理一个容器，包括创建、启动和停止等。

## 版本号说明

本章示例涉及多个 Docker 镜像，遵循以下版本号最佳实践：

- **官方镜像**（如 `ubuntu`、`nginx`、`mysql`）：使用具体大版本号（如 `ubuntu:24.04`、`mysql:8.4`）而非 `latest`，确保示例的可重复性
- **镜像标签约定**：
  - `latest` 或 `v1.0.0` 等：带标签的自定义镜像，示例中指定具体版本
  - `24.04`、`8.4`：官方镜像的稳定版本分支
  - 生产环境建议：指定确切版本号（如 `nginx:1.28.0`、`mysql:8.4.4`）而非仅大版本号

* [启动容器](5.1_run.md)
* [守护态运行](5.2_daemon.md)
* [终止容器](5.3_stop.md)
* [进入容器](5.4_attach_exec.md)
* [导出和导入容器](5.5_import_export.md)
* [删除容器](5.6_rm.md)

---

## File: 06_repository/README.md

# 第六章 访问仓库

仓库 (`Repository`) 是集中存放镜像的地方。

一个容易混淆的概念是注册服务器 (`Registry`)。实际上注册服务器是管理仓库的具体服务器，每个服务器上可以有多个仓库，而每个仓库下面有多个镜像。从这方面来说，仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 `docker.io/ubuntu` 来说，`docker.io` 是注册服务器地址，`ubuntu` 是仓库名。

大部分时候，并不需要严格区分这两者的概念。

## 版本号说明

本章涉及的 Registry 和相关工具版本说明：

- **Docker Registry / CNCF Distribution**：本章示例使用 `registry:2` 兼容路径；新生产部署应评估 Distribution 3.x，并核对配置路径、迁移说明和生态兼容性。已停止维护的 `registry:1` 不建议使用
- **Nexus 3**：建议指定具体版本（如 `sonatype/nexus3:3.69`）而非 `latest`，避免自动升级带来的兼容性问题
- **镜像标签规范**：
  - 生产环境推送至仓库时应明确指定版本号（如 `myapp:v1.0.0`）
  - 避免依赖 `latest` 标签，因为其含义存在歧义且易导致版本混淆

## 为什么需要私有仓库？

在讨论具体的安装和配置前，让我们先理解：**什么时候你应该建设私有仓库？**

**开发团队**（有专利代码、不能公开）：

- 需要私有仓库存储内部镜像
- 涉及访问控制和审计
- 强烈推荐使用托管方案（如 Harbor 或云厂商提供的镜像仓库）

**开源项目或个人学习**：

- Docker Hub 公开仓库足够
- 无需自建私有仓库的成本

**企业级部署**：

- 需要高可用、备份、灾难恢复
- 推荐使用专业级方案（Nexus 3、Harbor）而非简单的 Registry

本章涵盖的方案从简到复杂：

- Docker Registry：最小化部署（适合简单场景）
- 私有仓库高级配置：添加认证、HTTPS 等生产必需项
- Nexus 3：企业级完整解决方案，支持权限管理、备份等

## 本章内容

* [Docker Hub](6.1_dockerhub.md)
* [私有仓库](6.2_registry.md)
* [私有仓库高级配置](6.3_registry_auth.md)
* [Nexus 3](6.4_nexus3_registry.md)

---

## File: 07_dockerfile/README.md

# 第七章 Dockerfile 指令详解

## 什么是 Dockerfile

Dockerfile 是一个文本文件，其内包含了一条条的 **指令 (Instruction)**，每一条指令构建一层，因此每一条指令的内容，就是描述该层应当如何构建。

在[第四章](../04_image/README.md)中，我们通过 `docker commit` 学习了镜像的构成。但是，手动 `commit` 只能作为临时修补，并不适合作为生产环境镜像的构建方式。

使用 Dockerfile 构建镜像有以下优势：

*   **自动化**：可以通过 `docker build` 命令自动构建镜像。
*   **可重复性**：由于 Dockerfile 是文本文件，可以确保每次构建的结果一致。
*   **版本控制**：Dockerfile 可以纳入版本控制系统 (如 Git)，便于追踪变更。
*   **透明性**：任何人都可以通过阅读 Dockerfile 了解镜像的构建过程。

## Dockerfile 编写哲学

在深入每个指令的细节之前，笔者想强调一个至关重要的原则：**Dockerfile 不是脚本，而是镜像的“设计图”**。这个区别决定了你如何思考每条指令的作用。

相比编写 Bash 脚本的思维（“按顺序执行这些命令”），Dockerfile 的思维应该是（“这一层镜像应该如何构建，下一层如何分层”）。这个思维转变会影响你的决策：

- **合并命令**：一个 `RUN apt-get update && apt-get install ...` 应该写在一起，而不是分开成多个 `RUN` 指令，因为它们是同一个“层”的逻辑
- **选择合适的指令**：`COPY` vs `ADD`、`CMD` vs `ENTRYPOINT` 这些选择不是随意的，而是根据镜像分层的语义来决定的
- **优化镜像大小**：最后才清理缓存、删除临时文件，让这些“瘦身”操作在同一层完成

这个章节将详细介绍各个指令。在学习指令语法时，请始终思考：“这个指令为什么要以这样的方式工作？如果我是 Docker，我应该如何设计它？”

## Dockerfile 基本结构

Dockerfile 一般分为四部分：基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

可运行 `docker buildx build --check` 校验的[完整 Dockerfile 示例](../examples/validated/dockerfile/Dockerfile)与配套 `index.html` 保存在仓库中。它使用 `scratch`，因此结构检查不会解析远程基础镜像元数据。下面的围栏与该文件由测试强制保持一致。


```dockerfile
FROM scratch

COPY index.html /index.html
```

### 指令详解

本章将详细讲解 Dockerfile 中的各个指令：

*   [RUN 执行命令](7.1_run.md)
*   [COPY 复制文件](7.2_copy.md)
*   [ADD 更高级的复制文件](7.3_add.md)
*   [CMD 容器启动命令](7.4_cmd.md)
*   [ENTRYPOINT 入口点](7.5_entrypoint.md)
*   [ENV 设置环境变量](7.6_env.md)
*   [ARG 构建参数](7.7_arg.md)
*   [VOLUME 定义匿名卷](7.8_volume.md)
*   [EXPOSE 暴露端口](7.9_expose.md)
*   [WORKDIR 指定工作目录](7.10_workdir.md)
*   [USER 指定当前用户](7.11_user.md)
*   [HEALTHCHECK 健康检查](7.12_healthcheck.md)
*   [ONBUILD 为他人作嫁衣裳](7.13_onbuild.md)
*   [LABEL 为镜像添加元数据](7.14_label.md)
*   [SHELL 指令](7.15_shell.md)

### 高级特性

本章还将介绍 Dockerfile 的高级特性：

*   [多阶段构建](7.17_multistage_builds.md)
*   [多阶段构建实战：Laravel 应用](7.18_multistage_builds_laravel.md)

### 参考与最佳实践

此外，我们还将介绍 Dockerfile 的最佳实践和常见问题。

*   [参考文档](7.16_references.md)

## 使用 Dockerfile 构建镜像

构建镜像的基本命令格式为：

```bash
docker build [选项] <上下文路径/URL/->
```
例如，在 Dockerfile 所在目录执行：

```bash
docker build -t my-image:1.0 .
```

### 关于版本号最佳实践

本章中的 Dockerfile 示例使用的基础镜像标签遵循以下原则：

- **通用标签**（如 `ubuntu:24.04`、`alpine`、`nginx`）：保持原样，无需修改
- **基础镜像版本号**（如 `node:22`、`python:3.12`）：使用主或次版本号而非完整版本号（patch），这样可以自动获取最新的补丁版本，确保获得安全更新
- **避免**：不建议使用 `latest` 标签和完整的 patch 版本号（如 `20.10.0`）作为基础镜像，因为这会导致构建的不可重现性或安全风险

读者在使用这些示例时，应根据实际生产环境需求选择合适的版本号。

更多关于 `docker build` 的用法，我们在实战中会结合具体指令进行演示。

---

## File: 08_data/README.md

# 第八章 数据管理

如图 8-1 所示，Docker 数据管理主要围绕三类挂载方式展开。



图 8-1：Docker 数据挂载类型示意图

这一章介绍如何在 Docker 内部以及容器之间管理数据，在容器中管理数据主要有以下几种方式：

* [数据卷](8.1_volume.md)
* [挂载主机目录](8.2_bind-mounts.md)
* [tmpfs 挂载](8.3_tmpfs.md)

---

## File: 09_network/README.md

# 第九章 网络配置

Docker 容器需要网络来与外部世界通信、容器之间相互通信以及与宿主机通信。Docker 在安装时会自动配置网络基础设施，大多数情况下开箱即用。

## 概述

Docker 启动时自动创建以下网络组件：

```mermaid
graph TD
    subgraph Host [宿主机]
        eth0[物理网卡 eth0192.168.1.100]
        docker0[docker0 网桥172.17.0.1]

        subgraph Containers
            subgraph ContainerA [容器 A]
                eth0_A[eth0172.17.0.2]
            end
            subgraph ContainerB [容器 B]
                eth0_B[eth0172.17.0.3]
            end
        end

        eth0 <--> docker0
        docker0 <--> eth0_A
        docker0 <--> eth0_B
    end

    Internet((互联网)) <--> eth0
```
本章将详细介绍 Docker 网络配置的各个方面。

## 本章内容

* [配置 DNS](9.1_dns.md)
* [网络类型](9.2_network_types.md)
* [自定义网络](9.3_custom_network.md)
* [容器互联](9.4_container_linking.md)
* [外部访问容器](9.5_port_mapping.md)
* [网络隔离](9.6_network_isolation.md)
* [高级网络配置](9.7_advanced_networking.md)