本书的主要内容有:了解Docker和Linux容器如何与云服务和Kubernetes集成。构建Open Container Initiative(OCI)映像,使用强大的命令行工具部署和管理Linux容器。了解OCI映像如何简化应用的依赖管理和部署流程。学习在生产中部署和测试Linux容器的实用技术。在任何需要的地方大规模部署生产容器。探讨一些Docker高级话题,包括部署工具、网络、编排、安全和配置。
编辑推荐
Docker和Linux容器从根本上改变了组织大规模开发、交付和运行软件的方式。但是,了解这些工具为何如此重要,以及如何正确集成到组织的生态系统中可能具有一定挑战。本书全面更新,指引开发人员、运维人员、架构师和技术经理充分理解Docker工具集,让他们了解容器对现代软件交付和管理几乎各方面的改进。
这一版的更新涵盖本书首次出版后近十年来的重大变化。本书作者根据最佳实践进行了修订,还增加了BuildKit、多架构映像支持、无root容器等更多内容。
专家推荐
Docker是一项让人兴奋的技术,本书教你在生产环境中应该如何使用容器。
Kelsey Hightower
Google Cloud Platform首席开发者布道师
本书不仅涵盖基本的底层概念,还介绍了从大规模部署中总结出的宝贵经验。
Liz Rice
Isovalent首席开源官和eBPF专家
本书将指引你构建稳健、高可用性的现代分布式系统。
Mihai Todor
TLCP高级总工程师
前言本书针对想切实理解Linux 容器、了解如何使用容器改进开发和生产实践的人。大多数现代集成工作流程和生产系统要求开发人员和运维工程师对Linux 容器以及如何利用容器显著提高整个系统的可重复性和可预测性有深入的了解。在学习过程中,我们将探讨在Docker 生态系统中如何构建、测试、部署和调试Linux 容器,还将涵盖利用Linux 容器的重要编排工具。最后,结合以上内容,给出一些有关容器环境安全性和最佳实践方面的指导。目标读者本书的目标读者是那些在开发和大规模部署软件的过程中遇到复杂工作流程而在寻找解决方案的人。如果你对Linux 容器、Docker、DevOps 和可弹性伸缩的大规模软件基础设施感兴趣,绝不能错过这本书!为什么读这本书如今,网上到处都在讨论Docker,有许多使用Docker 的项目,还有很多关于Docker 的文章。甚至,有人已经开始预言Docker 的衰败。既然如此,为什么还要花费宝贵的时间阅读这本书呢?尽管现在出现了其他替代方案,但Docker 凭一己之力把Linux 容器推到了所有工程师面前。在Docker 创建容器映像格式、构建现今容器化系统用到的许多核心库之前,Linux 容器非常难用,而且使用群体主要是大型云托管公司,因为他们需要提供可扩展性,同时还想保护系统免受不良用户代码的危害。Docker 改变了这一切。尽管有关Docker 和Linux 容器的信息很多,但是环境在发展,最佳实践也在变化。假设你在阅读一篇四年前发表的关于Docker 的博客文章。文章的内容或许仍然奏效,但可能不再是最好的方法。在我们撰写本书第一版期间,Docker公司发布了四个Docker 版本和一些重要工具。本书第一版和第三版相隔七年,Docker 世界发生了天翻地覆的变化。Docker 已经稳定下来,现在有许多其他工具可以扮演类似的角色。如今,DevOps 工作流程的几乎每个方面都有许多强大的选择,早就过了工具匮乏的时期。了解Linux 容器和Docker 提供的功能、了解如何把它们融入自己的工作流程,以及正确集成一切,都不是简单的事。过去九年,我们与多家公司合作,为他们构建和运营各种Linux 容器平台,涵盖Docker、Mesos 和Kubernetes。Docker 发布几个月之后我们就开始在生产环境使用Docker,积累了很多经验,在本书中将与你一一分享。我们的目的是给你提供前车之鉴,避免重蹈覆辙。Docker 项目的在线文档(https://docs.docker.com)确实有用,不过我们写这本书是想让你对Docker 有更全面的认识,告诉你我们在使用Docker 的过程中总结出的最佳实践。读完本书之后,你将掌握足够的知识,知道Linux 容器是什么、Docker 提供了哪些功能,为什么二者如此重要,以及如何在本地开发和线上环境中利用它们提升效率。我们希望通过一些非常真实的运用让你快速掌握引起你兴趣的技术。内容结构本书的结构如下。? 第1 章和第2 章简要介绍Docker,说明Docker 是什么、能用来做什么。? 第3 章说明Docker 的安装步骤。? 第4 章到第6 章探讨Docker 客户端、映像和容器,说明这三者是什么以及如何使用。? 第7 章讨论如何调试映像和容器。? 第8 章介绍Docker Compose,说明它在开发复杂的容器化服务的过程中起到的简化作用。? 第9 章探讨转移到生产环境的过程中需要注意的事项。? 第10 章探讨如何在公共云和私有云中大规模部署容器。? 第11 章探讨一些高级话题,若想理解这些话题,需要对Docker 有一定的了解。开始在生产环境中使用Docker 后,这些话题将变得很重要。? 第12 章介绍一些可在容器化Linux 环境中使用的替代工具。? 第13 章探讨一些关于如何设计适合互联网量级的下一代软件的核心概念,这些概念已经开始得到业界的一致认同。? 第14 章总结本书内容,概述如何使用现有的技术改进交付和弹性伸缩软件服务的方式。我们发现,很多读者不会逐页阅读技术书籍,而且有些读者特别喜欢跳过前言。如果你还在阅读前言,下面简单说明阅读本书的几种方式。? 如果你刚接触Linux 容器,请从头开始阅读。前两章的目的是让你了解Docker 和Linux 容器的基本知识,介绍Docker 和Linux 容器是什么、二者的工作方式,以及为什么要使用它们。? 如果你想直接学习如何在工作站中安装并运行Docker,请跳到第3 章和第4 章。这两章说明如何安装Docker、如何创建和下载映像、如何运行容器等。? 如果你已经熟悉Docker 基本知识,想学习如何利用Docker 做开发,请阅读第5 章到第8 章。这几章说明日常使用Docker 相关的技能,并对Docker Compose 做了详尽介绍。? 如果你已经在开发过程中使用Docker,想知道如何在生产环境中使用,请阅读第9 章和第12 章。这一部分涉及容器部署、容器平台设置等高级话题。? 如果你是软件或平台架构师,可能会对第13 章感兴趣。这一章探讨当前对容器化应用和横向扩展服务的思考。排版约定本书使用以下排版约定。斜体(Italic)表示新术语、URL、电子邮件地址、文件名和文件扩展名。等宽字体(Constant width)表示程序代码清单,也表示正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等程序元素。加粗等宽字体(Constant width bold)表示命令或者其他应该由用户原样输入的内容。尖括号中的等宽字体()表示需要使用用户的输入值代替的文本,或者由上下文决定的值。使用代码示例本书附带资源( 代码示例、练习等) 的下载地址:https://github.com/bluewhalebook/docker-up-and-running-3rd-edition。本书是要帮你完成工作的。一般来说,你可以在自己的程序或文档中使用书中的代码。除非你使用了很大一部分代码,否则无须联系我们获得许可。例如,用书中的几个代码片段写一个程序就无需获得许可,销售或分发OReilly 图书的示例合集需要获得许可;引用书中的示例代码回答问题无须获得许可,把书中的大量代码放到你的产品文档中需要获得许可。我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和 ISBN。例如:Docker: Up & Running, 3e, by Sean P. Kane with Karl Matthias (OReilly). Copyright 2023 Sean P. Kane and Karl Matthias, 978-1-098-13182-1。如果你觉得自己对示例代码的使用超出了上述许可范围,请通过permissions@oreilly.com 联系我们。OReilly 在线学习平台(OReilly Online Learning)近40 年来,OReilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。公司独有的专家和改革创新者网络通过OReilly 书籍、文章以及在线学习平台,分享他们的专业知识和实践经验。OReilly 在线学习平台按照您的需要提供实时培训课程、深入学习渠道、交互式编程环境以及来自OReilly 和其他200 多家出版商的大量书籍与视频资料。更多信息,请访问网站:https://www.oreilly.com/。联系我们任何有关本书的意见或疑问,请按照以下地址联系出版社。美国:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)奥莱利技术咨询(北京)有限公司勘误、示例和其他信息可访问https://oreil.ly/docker-up-and-running-3e 获取。对本书的评论或技术疑问,可以发电子邮件到errata@oreilly.com.cn。欲了解本社图书和课程的新闻和信息,请访问https://oreilly.com。我们的LinkedIn:https://linkedin.com/company/oreilly-media。我们的Twitter:https://twitter.com/oreillymedia。我们的YouTube:https://youtube.com/oreillymedia。致谢衷心感谢让本书每一版得以出版的诸位。? 感谢New Relic 公司的Nic Benders、Bjorn Freeman-Benson 和Dana Lawson,他们对第一版给予的帮助超乎想象,给我们留出了充足的时间写作。? 感谢Roland Tritsch 和Nitro Software 公司支持Karl 修订第二版。? 感谢OReilly 出版社的Laurel Ruma,她最先联系我们,让我们写一本关于Docker 的书;感谢Mike Loukides,他帮助我们按部就班地写作本书。? 特别感谢第一版的编辑Brian Anderson,他告诉我们该做什么,在写作过程中一直给予我们指导。? 感谢Nikki McDonald 和Virginia Wilson 在修订本书第二版的过程中给予的帮助。? 感谢John Devins、Michele Cronin 和Elizabeth Faerm,他们付出了极大的努力,确保第三版得以付梓。? 感谢Terraform: Up & RunningYevgeniy 一书的作者Yevgeniy (Jim) Brikman,他非常慷慨,允许我们参照他之前的工作成果设计https://dockerupandrunning.com 网站。? 传播新技术需要特殊人才的支持。非常感谢Lars Herrmann、Laura Frank Tacho 和Raju Gandhi 分别为本书的三个版本作序。? 感谢本书草稿的审稿人,他们在本书写作过程中帮助我们不偏离轨道。他们是:第一个审阅本书并写了完整技术审校报告的Ksenia Burlachenko,以及Andrew T. Baker、Sébastien Goasguen、Henri Gomez、Chelsey Frank、Rachid Zarouali、Werner Dijkerman、Predrag Kne?evi? 和Vishwesh Ravi Shrimali。? 特别感谢Alice Goldfuss 和Tom Offermann,他们在写作第一版的过程中一直给我们细致的反馈。感谢Mihai Todor 在第二版的修订过程中鼓励我们,审校书稿、反馈问题。? 感谢Gillian McGarvey、Melanie Yarbrough、Justin Billing、Rachel Monaghan 和Sonia Saruba 编辑书稿,她们编辑后的书稿太好了,好像我们在高中的英语课上真的认真听讲了一样。她们添加了517 个逗号,或许还不止。? 感谢Sue Klefstad 为第三版建立索引,确保索引对所有读者都有用。感谢Wendy Catalano 和Ellen Troutman 为前两版建立索引。? 特别感谢Nick Adams 和OReilly Media 的幕后工作人员,他们确保了一切内容在所有发行格式中都显示得恰到好处。? 感谢New Relic 和Nitro 公司的所有同事,在使用Docker 的过程中他们一直陪伴左右,为我们提供了本书讲到的很多经验。? 感谢Grains of Wrath Brewery、World Cup Coffee、McMenamins Ringlers Pub、Old Town Pizza、A Beer at a Time!、Taylors Three Rock 等店,他们人很好,吃完饭很久之后依然让我们占用饭桌,用他们的电。? 感谢我们的家人,他们给予我们支持,在需要时为我们提供安静的环境。? 最后,感谢在本书出版过程中鼓励我们,给我们提供建议和支持的其他所有人。
Sean Kane是techlabs.sh的创始人和SuperOrbital的首席生产运维工程师。Karl Matthias是Community.com的架构副总裁。
目录
序 1
前言 5
第1 章 引言 13
1.1 Docker 带来的希望 13
1.2 Docker 不是什么 17
1.3 重要术语19
1.4 小结 .20
第2 章 Docker 概览 .21
2.1 简化流程21
2.2 广泛支持和采用 24
2.3 架构 .27
2.3.1 客户端?C 服务器模型.27
2.3.2 网络端口和UNIX 套接字 28
2.3.3 强健的工具 29
2.3.4 Docker 命令行工具 30
2.3.5 Docker 引擎API .30
2.3.6 容器的网络层 31
2.4 合理利用Docker 32
2.4.1 容器不是虚拟机 33
2.4.2 有限的隔离 34
2.4.3 容器很轻量级 35
2.4.4 实现不可变的基础设施 35
2.4.5 无状态的应用 36
2.4.6 状态外存 .36
2.5 Docker 工作流程 37
2.5.1 版本控制 .38
2.5.2 构建 39
2.5.3 测试 40
2.5.4 打包 41
2.5.5 部署 42
2.5.6 Docker 的生态系统 42
2.6 小结 .44
第3 章 安装Docker .47
3.1 安装Docker 客户端 .48
3.1.1 Linux .48
3.1.2 macOS,Mac OS X 51
3.1.3 Microsoft Windows 11 52
3.2 安装Docker 服务器 .54
3.2.1 基于systemd 的Linux .54
3.2.2 不基于Linux 虚拟机的服务器 .55
3.3 测试安装的 Docker61
3.3.1 Ubuntu 61
3.3.2 Fedora 61
3.3.3 Alpine Linux 62
3.4 探索Docker 服务器 .62
3.5 小结 .64
第4 章 使用Docker 映像 65
4.1 Dockerfile 文件剖析 66
4.2 构建映像70
4.3 运行映像73
4.3.1 构建参数 .74
4.3.2 环境变量即配置 74
4.4 定制基础映像 .76
4.5 存储映像77
4.5.1 公共注册处 77
4.5.2 私有注册处 78
4.5.3 获得注册处的身份验证 78
4.5.4 自建私有注册处 84
4.6 优化映像89
4.6.1 映像瘦身 .89
4.6.2 层层相加 .97
4.6.3 利用层缓存 .100
4.6.4 目录缓存 105
4.7 诊断构建问题 110
4.7.1 调试未用BuildKit 的映像 110
4.7.2 调试使用BuildKit 的映像 113
4.8 多架构构建 115
4.9 小结 122
第5 章 使用Docker 容器 123
5.1 容器是什么 123
5.2 创建容器.126
5.2.1 基本配置 126
5.2.2 存储卷 132
5.2.3 资源配额 135
5.3 启动容器.145
5.4 自动重启容器 146
5.5 停止容器.147
5.6 终止容器.149
5.7 暂停和恢复容器 .149
5.8 清理容器和映像 .151
5.9 Windows 容器 153
5.10 小结 157
第6 章 探索Docker 的其他功能 159
6.1 打印Docker 的版本号 .160
6.2 服务器信息 161
6.3 下载映像更新 163
6.4 审查容器.165
6.5 在shell 中探索 166
6.6 返回结果.167
6.7 进入运行中的容器 .169
6.7.1 docker container exec .170
6.7.2 docker volume 171
6.8 处理日志.173
6.8.1 docker container logs 173
6.8.2 日志处理高级技术 175
6.9 监控Docker 178
6.9.1 容器的统计信息 178
6.9.2 健康检查 182
6.9.3 docker system events 186
6.9.4 cAdvisor 188
6.10 Prometheus 监控系统 .190
6.11 继续探索 194
6.12 小结 195
第7 章 调试容器 . 197
7.1 列出进程.198
7.2 审查进程.203
7.3 管控进程.206
7.4 审查网络.208
7.5 映像历史.212
7.6 审查容器.212
7.7 审查文件系统 214
7.8 小结 215
第8 章 探索Docker Compose . 217
8.1 配置Docker Compose .218
8.2 启动服务.228
8.3 探索Rocket.Chat 230
8.4 Docker Compose 命令 .242
8.5 管理配置.244
8.5.1 默认值 244
8.5.2 强制值 246
8.5.3 dotenv 文件 .247
8.6 小结 250
第9 章 在生产环境中部署容器 . 251
9.1 部署到生产环境 .251
9.2 Docker 在生产环境中扮演的角色 .252
9.2.1 作业管控 254
9.2.2 资源限制 255
9.2.3 网络管理 255
9.2.4 配置管理 256
9.2.5 打包交付 256
9.2.6 日志处理 257
9.2.7 健康监控 257
9.2.8 调度 .258
9.2.9 服务发现 260
9.2.10 本节小结 262
9.3 Docker 和DevOps 流水作业 262
9.3.1 简述 .263
9.3.2 外部依赖 266
9.4 小结 267
第10 章 容器弹性伸缩 . 269
10.1 Docker Swarm 模式 270
10.2 Kubernetes 284
10.2.1 Minikube 284
10.2.2 Docker Desktop 集成的Kubernetes 308
10.2.3 Kind309
10.3 Amazon ECS 和Fargate 312
10.3.1 AWS 基本设置 312
10.3.2 设置IAM 角色 313
10.3.3 设置AWS CLI .314
10.3.4 容器实例 316
10.3.5 定义任务 317
10.3.6 测试任务 325
10.3.7 停止任务 326
10.4 小结 328
第11 章 高级话题 329
11.1 容器详解 329
11.1.1 控制组 .330
11.1.2 命名空间 335
11.2 安全性 340
11.2.1 UID 0 341
11.2.2 无root 模式 345
11.2.3 需要特权的容器 .349
11.2.4 安全计算模式 353
11.2.5 SELinux 和AppArmor 359
11.2.6 Docker 守护进程 360
11.3 高级配置 361
11.4 存储 369
11.5 nsenter374
11.6 Docker 的结构 379
11.7 替换运行时 .384
11.8 小结 387
第12 章 丰富的选择 . 389
12.1 客户端工具 .389
12.1.1 nerdctl .389
12.1.2 podman 和buildah .391
12.2 多合一开发者工具 393
12.2.1 Rancher Desktop .394
12.2.2 Podman Desktop .394
12.3 小结 396
第13 章 容器平台设计 . 397
13.1 应用的十二要素 398
13.1.1 代码基 .399
13.1.2 依赖 399
13.1.3 配置 401
13.1.4 后端服务 403
13.1.5 构建、发布、运行 403
13.1.6 进程 404
13.1.7 端口绑定 404
13.1.8 并发 405
13.1.9 易用 405
13.1.10 开发环境和生产环境同等重要 .406
13.1.11 日志 406
13.1.12 管理进程 .407
13.1.13 十二要素小结 407
13.2 响应式宣言 .407
13.2.1 反应迅速 408
13.2.2 恢复力强 408
13.2.3 灵活性高 408
13.2.4 消息驱动 408
13.3 小结 409
第14 章 总结 411
14.1 前路漫漫 411
14.2 Docker 解决的问题 .413
14.3 Docker 工作流程 .413
14.4 简化用于部署的构建产物414
14.5 使用最佳方式存储和获取映像 .415
14.6 回报 415
14.7 结语 416