File: README.md
关于本书
Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 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:
- 安装 Docker(第3章):根据操作系统完成 Docker 的安装与验证
- 第一个容器(第1章
1.1):快速体验构建镜像与启动容器的完整流程 - 交互式容器(第5章):执行
docker run -it ubuntu bash,进入容器内部与系统交互 - 镜像与仓库(第2章、第4章、第6章):理解核心概念,并学会拉取、使用与管理镜像和仓库
- 自定义镜像(第7章):学习如何编写 Dockerfile 创建自己的镜像
学习路线图
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。也可访问 GitHub 仓库目录。
下载离线版本
本书提供 PDF 版本供离线阅读,可前往 GitHub Releases 页面下载最新版本。
如需获取默认分支自动更新的预览版,可直接下载 docker_practice.pdf。该文件会随主线更新覆盖,不代表正式发布版本。
本地阅读
先安装 mdPress:
brew tap yeasy/tap && brew install mdpress
mdpress serve社区交流
- GitHub Issues(内容错误、建议)
推荐阅读
本书是技术丛书的一部分。以下书籍与本书形成互补:
| 书名 | 与本书的关系 |
|---|---|
| 《前线部署工程实践指南》 | 讲容器、Kubernetes、GitOps、IaC、供应链、安全、观测与 SLO 如何组合成可交付、可审计、可运营的部署工程体系 |
| 《智能体 Harness 工程指南》 | Agent 基础设施中的容器化部署与隔离 |
| 《大模型安全权威指南》 | 容器安全与 AI 系统安全的交叉实践 |
| 《区块链技术指南》 | 区块链节点的容器化部署 |
参与贡献
欢迎参与项目维护。
进阶学习
《Docker 技术入门与实战》已更新到第 4 版,讲解最新容器技术栈知识,欢迎大家阅读并反馈建议。京东图书 | 天猫图书
支持鼓励
欢迎鼓励项目一杯 coffee~
Star History
许可证
本书采用 CC BY-NC-SA 4.0 许可证。
您可以自由分享和演绎,但需署名、非商业使用、相同方式共享。
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)的本地支持原生性。
本章内容
-
- 通过一个简单的 Web 应用例子,带你快速体验 Docker 的核心流程:构建镜像、运行容器。
-
- 介绍 Docker 的起源、发展历程以及其背后的核心技术 (Cgroups,Namespaces,UnionFS,以及
containerd引擎的演进)。 - 了解 Docker 是如何改变软件交付方式的。
- 介绍 Docker 的起源、发展历程以及其背后的核心技术 (Cgroups,Namespaces,UnionFS,以及
-
- 对比传统虚拟机技术,阐述 Docker 在启动速度、资源利用率、交付效率等方面的巨大优势。
- 探讨 Docker 在 DevOps、微服务架构中的关键作用。
学习目标
通过本章的学习,你将能够:
- 理解 Docker 的核心概念与架构。
- 明白 Docker 解决了现代软件开发与运维中的哪些痛点。
- 建立起对容器技术的初步认知,为后续的实战操作打下基础。
好吧,让我们带着问题开始这神奇之旅。
File: 02_basic_concept/README.md
第二章 基本概念
版本说明:本章内容及示例基于 Docker v29.x 编写。镜像标签相关示例请查阅官方文档以确认最新可用版本。
Docker 包括三个基本概念:
- 镜像 (
Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 - 容器 (
Container):镜像 (Image) 和容器 (Container) 的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 - 仓库 (
Repository):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
理解了这三个概念,就理解了 Docker 的整个生命周期。
File: 03_install/README.md
第三章 安装 Docker
Docker Engine 主要提供 stable 和 test 两个更新频道;test.docker.com 对应测试频道,适合预发布验证,不建议直接用于生产环境。
官方网站上有各种环境下的安装指南,这里主要介绍 Docker 在 Linux、Windows 10/11 和 macOS 上的安装。
安装方式选择指南
在开始安装前,笔者建议你根据以下决策树选择最合适的安装方式:
生产环境 vs 开发环境
生产环境(服务器部署):
- 优先使用官方 APT/YUM 源安装(Ubuntu、Debian、Fedora、CentOS)
- 优势:获得官方安全更新、长期技术支持、版本管理清晰
- 安装步骤稍多一些,但这种“麻烦”是值得的——它为你的生产系统争取了稳定性和可维护性
开发环境(本地开发机、测试服务器):
- 配置 Docker 官方源后 使用包管理器安装,或在一次性测试环境使用官方脚本自动安装
- 如果你想快速上手,官方脚本(
get.docker.com)是最便捷的选择 - 国内用户注意:这一步一定要选对镜像源,否则网络卡顿会严重影响体验
国内用户的网络优化建议
值得注意的是,国内直接访问 Docker 官方源速度较慢,建议:
- 安装过程:使用阿里云、腾讯云等国内镜像源
- 镜像拉取:安装完成后配置 Docker 镜像加速器(详见 3.9 镜像加速器),这一步对日常开发的体验提升最明显
特殊场景
- Raspberry Pi/ARM 平台:见 3.5 Raspberry Pi
- 离线环境:见 3.6 Linux 离线安装
- macOS/Windows:Docker Desktop 是官方推荐的一站式解决方案
- 需要实验特性:见 3.10 开启实验特性
详细安装指南
File: 04_image/README.md
第四章 使用镜像
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
本章内容
本章将介绍更多关于镜像的内容,包括:
版本提示:镜像存储后端的变迁
在 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)而非仅大版本号
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:企业级完整解决方案,支持权限管理、备份等
本章内容
File: 07_dockerfile/README.md
第七章 Dockerfile 指令详解
什么是 Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的 指令 (Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
在第四章中,我们通过 docker commit 学习了镜像的构成。但是,手动 commit 只能作为临时修补,并不适合作为生产环境镜像的构建方式。
使用 Dockerfile 构建镜像有以下优势:
- 自动化:可以通过
docker build命令自动构建镜像。 - 可重复性:由于 Dockerfile 是文本文件,可以确保每次构建的结果一致。
- 版本控制:Dockerfile 可以纳入版本控制系统 (如 Git),便于追踪变更。
- 透明性:任何人都可以通过阅读 Dockerfile 了解镜像的构建过程。
Dockerfile 编写哲学
在深入每个指令的细节之前,笔者想强调一个至关重要的原则:Dockerfile 不是脚本,而是镜像的“设计图”。这个区别决定了你如何思考每条指令的作用。
相比编写 Bash 脚本的思维(“按顺序执行这些命令”),Dockerfile 的思维应该是(“这一层镜像应该如何构建,下一层如何分层”)。这个思维转变会影响你的决策:
- 合并命令:一个
RUN apt-get update && apt-get install ...应该写在一起,而不是分开成多个RUN指令,因为它们是同一个“层”的逻辑 - 选择合适的指令:
COPYvsADD、CMDvsENTRYPOINT这些选择不是随意的,而是根据镜像分层的语义来决定的 - 优化镜像大小:最后才清理缓存、删除临时文件,让这些“瘦身”操作在同一层完成
这个章节将详细介绍各个指令。在学习指令语法时,请始终思考:“这个指令为什么要以这样的方式工作?如果我是 Docker,我应该如何设计它?”
Dockerfile 基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
可运行 docker buildx build --check 校验的完整 Dockerfile 示例与配套 index.html 保存在仓库中。它使用 scratch,因此结构检查不会解析远程基础镜像元数据。下面的围栏与该文件由测试强制保持一致。
FROM scratch
COPY index.html /index.html指令详解
本章将详细讲解 Dockerfile 中的各个指令:
- RUN 执行命令
- COPY 复制文件
- ADD 更高级的复制文件
- CMD 容器启动命令
- ENTRYPOINT 入口点
- ENV 设置环境变量
- ARG 构建参数
- VOLUME 定义匿名卷
- EXPOSE 暴露端口
- WORKDIR 指定工作目录
- USER 指定当前用户
- HEALTHCHECK 健康检查
- ONBUILD 为他人作嫁衣裳
- LABEL 为镜像添加元数据
- SHELL 指令
高级特性
本章还将介绍 Dockerfile 的高级特性:
参考与最佳实践
此外,我们还将介绍 Dockerfile 的最佳实践和常见问题。
使用 Dockerfile 构建镜像
构建镜像的基本命令格式为:
docker build [选项] <上下文路径/URL/->例如,在 Dockerfile 所在目录执行:
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 内部以及容器之间管理数据,在容器中管理数据主要有以下几种方式:
File: 09_network/README.md
第九章 网络配置
Docker 容器需要网络来与外部世界通信、容器之间相互通信以及与宿主机通信。Docker 在安装时会自动配置网络基础设施,大多数情况下开箱即用。
概述
Docker 启动时自动创建以下网络组件:
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 网络配置的各个方面。