网站
更多书籍点击进入 >> <font color=blue>CiCi 岛 </font>
下载
<font color=red>电子版仅供预览及学习交流使用,下载后请 24 小时内删除,支持正版,喜欢的请购买正版书籍</font>
- <font color=blue> 电子书下载 </font>(皮皮云盘 - 点击“普通下载”)
- <font color=blue> 购买正版 </font>
封页
编辑推荐
权威作者:具有十多年虚拟化研究经验,国内首批研究 Docker 容器技术的专家,Docker 开源项目贡献者 快速入门:透过简单的理论讲解,带你进入 Docker 的世界 步骤详细:手把手教你配置方法,为你量身定制自己的 Docker 内容丰富:揭露镜像制作过程,教你搭建镜像仓库
内容简介
自从 2013 年 3 月 Docker 0.1 版本发布以来,以其为代表的容器技术发展也走上了快车道,Docker 容器在很大程度上改变了软件的架构设计、开发和运维部署方式,也给早些年就提出的微服务架构模式插上了快速起飞的翅膀。本书由 Docker 社区第一人 Jeff Nickoloff 编写,共分为三部分,第一部分(1~6 章)重点介绍 Docker 容器的资源隔离和权限控制及基础理论,第二部分(7~10 章)详细解释了如何打包制作镜像以及各种镜像分发基础设施的建设,最后一部分(11~12 章)聚焦于 Docker 容器的组合操作也就是多容器和多主机环境的管理。本书图文并茂,结合基本原理和具体案例给大家提供了多个不错的实战机会。作为目前最炙手可热的容器技术类图书,本书适用于互联网、云计算及企业级软件开发、架构、测试及运维人员快速上手熟悉 Docker 容器,搭建以 Docker 为核心的基础设施,并在生产环境中快速部署应用以及管理容器集群。
作者简介
胡震,上海凡用信息科技有限公司 CTO,长夜公司首席架构师,DockOne 社区优秀翻译。杨润青,90 后博士僧,研究方向是网络和信息安全。黄帅 (Henry Huang),目前就职于趋势科技, 负责集群运维开发和维护工作,所在项目从 2011 年使用 AWS 服务至今,积累一定的 AWS 运维经验。Jeff Nickoloff 会建立大规模的服务站,写关于技术的文字,并帮助人们实现他们的产品目标。他曾在 Amazon.com、Limelight 网络和亚利桑那州立大学做这些事情。2014 年离开亚马逊,他创办了一家咨询公司,专注于为财富 100 强的企业和创业公司提供工具、培训和 实践。Jeff Nickoloff 会建立大规模的服务站,写关于技术的文字,并帮助人们实现他们的产品目标。他曾在 Amazon.com、Limelight 网络和亚利桑那州立大学做这些事情。2014 年离开亚马逊,他创办了一家咨询公司,专注于为财富 100 强的企业和创业公司提供工具、培训和 实践。如果你想与他聊天或者一起工作,可以在 http://allingeek.com 找到他,或者在 Twitter 上找 @allingeek。
目 录
目 录
第 1 部分 保持一台干净的机器
第 1 章 欢迎来到 Docker 世界 2
1.1 什么是 Docker 3
1.1.1 容器 3
1.1.2 容器不是虚拟化 4
1.1.3 在隔离的容器中运行软件 4
1.1.4 分发容器 6
1.2 Docker 解决了什么问题 6
1.2.1 有条理 7
1.2.2 提高可移植性 8
1.2.3 保护你的机器 9
1.3 为什么 Docker 如此重要 10
1.4 何时何处使用 Docker 11
1.5 案例:“hello world”11
1.6 小结 13
第 2 章 在容器中运行软件 14
2.1 从 Docker 命令行工具获得帮助 14
2.2 控制容器:建立一个网站的监控器 15
2.2.1 创建和启动一个新的容器 16
2.2.2 运行交互式容器 17
2.2.3 列举、停止、重新启动和查看容器输出 18
2.3 已解决的问题和 PID 命名空间 20
2.4 消除元数据冲突:构建一个网站农场 23
2.4.1 灵活的容器甄别 24
2.4.2 容器的状态和依赖 26
2.5 构建与环境无关的系统 28
2.5.1 只读文件系统 29
2.5.2 环境变量的注入 31
2.6 建立持久的容器 34
2.6.1 自动重启容器 35
2.6.2 保持容器运行 init 和 supervisor 进程 36
2.7 清理 38
2.8 小结 39
第 3 章 软件安装的简化 40
3.1 甄别软件 41
3.1.1 什么是仓库 41
3.1.2 使用标签 42
3.2 查找和安装软件 43
3.2.1 命令行使用 Docker Hub 43
3.2.2 通过网站访问 Docker Hub 45
3.2.3 使用替代注册服务器 47
3.2.4 镜像文件 47
3.2.5 从 Dockerfile 安装 49
3.3 安装文件和隔离 49
3.3.1 镜像层实战 50
3.3.2 分层关系 51
3.3.3 容器文件系统抽象和隔离 52
3.3.4 工具集和文件系统结构的好处 53
3.3.5 联合文件系统的不足 53
3.4 小结 54
第 4 章 持久化存储和卷间状态共享 55
4.1 存储卷的简介 56
4.1.1 存储卷提供容器无关的数据管理 56
4.1.2 NoSQL 数据库使用存储卷 57
4.2 存储卷的类型 60
4.2.1 绑定挂载卷 60
4.2.2 Docker 托管卷 63
4.3 共享存储卷 65
4.3.1 主机依赖的共享 65
4.3.2 通用共享和 volumes-from 标志 66
4.4 托管卷的生命周期 68
4.4.1 托管卷的权限 68
4.4.2 存储卷的清理 69
4.5 存储卷的高级容器模式 70
4.5.1 存储卷容器模式 70
4.5.2 数据经压缩的存储卷容器 72
4.5.3 多态容器模式 73
4.6 小结 74
第 5 章 网络访问 75
5.1 网络相关的背景知识 76
5.1.1 基础:协议,接口和端口 76
5.1.2 高级:网络,NAT 和端口转发 77
5.2 Docker 的网络 79
5.2.1 本地 Docker 网络的拓扑结构 79
5.2.2 四种网络结构原型 80
5.3 Closed 容器 81
5.4 Bridged 容器 83
5.4.1 访问外部网络 84
5.4.2 自定义命名解析 85
5.4.3 开放对容器的访问 88
5.4.4 跨容器通信 91
5.4.5 修改网桥接口的配置 92
5.5 Joined 容器 93
5.6 Open 容器 95
5.7 跨容器依赖 96
5.7.1 链接——本地服务发现 97
5.7.2 链接别名 98
5.7.3 环境变量的改动 99
5.7.4 链接的本质和缺点 101
5.8 小结 102
第 6 章 隔离——限制危险 103
6.1 资源分配 104
6.1.1 内存限制 104
6.1.2 CPU 105
6.1.3 设备的访问权 108
6.2 共享内存 108
6.2.1 跨容器的进程间通信 109
6.2.2 开放内存容器 110
6.3 理解用户 111
6.3.1 Linux 用户命令空间 111
6.3.2 run-as 用户 111
6.3.3 用户和卷 114
6.4 能力——操作系统功能的授权 116
6.5 运行特权容器 117
6.6 使用加强工具创建更健壮的容器 118
6.6.1 指定额外的安全选项 119
6.6.2 微调 LXC 120
6.7 因地制宜地构建容器 121
6.7.1 应用 121
6.7.2 高层的系统服务 122
6.7.3 低层的系统服务 122
6.8 小结 122
第 2 部分 镜像发布:如何打包软件
第 7 章 在镜像中打包软件 126
7.1 从容器构建镜像 126
7.1.1 打包 Hello World 127
7.1.2 打包 Git 128
7.1.3 审查文件系统的改动 128
7.1.4 Commit——创建新镜像 129
7.1.5 可配置的镜像属性 130
7.2 深入 Docker 镜像和层 131
7.2.1 深入联合文件系统 132
7.2.2 重新认识镜像、层、仓库和标签 134
7.2.3 镜像体积和层数限制 137
7.3 导出和导入扁平文件系统 139
7.4 版本控制的最佳实践 141
7.5 小结 143
第 8 章 构建自动化和高级镜像设置 144
8.1 使用 Dockerfile 打包 Git 144
8.2 Dockerfile 入门 148
8.2.1 元数据指令 148
8.2.2 文件系统指令 152
8.3 注入下游镜像在构建时发生的操作 155
8.4 使用启动脚本和多进程容器 158
8.4.1 验证环境相关的先决条件 158
8.4.2 初始化进程 160
8.5 加固应用镜像 161
8.5.1 内容可寻址镜像标识符 161
8.5.2 用户权限 162
8.5.3 SUID 和 SGID 权限 164
8.6 小结 166
第 9 章 公有和私有软件分发 168
9.1 选择一个分发方法 169
9.1.1 分发选项图谱 169
9.1.2 选择标准 169
9.2 通过托管 Registry 发布 172
9.2.1 通过公有仓库发布:你好!Docker Hub 172
9.2.2 使用自动构建发布公有项目 174
9.2.3 私有托管仓库 176
9.3 私有 Registry 介绍 178
9.3.1 使用 Registry 镜像 180
9.3.2 从 Registry 使用镜像 181
9.4 镜像的手动发布和分发 181
9.5 镜像源代码分发工作流程 186
9.6 小结 189
第 10 章 运行自定义 Registry 190
10.1 运行个人 Registry 191
10.1.1 再度介绍镜像 192
10.1.2 介绍 V2 API 193
10.1.3 定制镜像 195
10.2 集中式 Registry 的增强 196
10.2.1 创建一个反向代理 197
10.2.2 在反向代理上配置 HTTP(TLS)199
10.2.3 添加身份认证层 202
10.2.4 客户端兼容性 206
10.2.5 应用于生产环境之前 208
10.3 持久化的 BLOB 存储 210
10.3.1 微软 Azure 托管远程存储 211
10.3.2 AWS S3 托管远程存储 212
10.3.3 RADOS(Ceph)的内部远程存储 214
10.4 扩展访问和延迟的改进 215
10.4.1 与元数据缓存集成 215
10.4.2 使用存储中间件简化 BLOB 传输 217
10.5 通过通知集成 219
10.6 小结 224
第 3 部分 多容器和多主机环境
第 11 章 Docker Compose 声明式环境 228
11.1 Docker Compose:第一天的启动并运行 228
11.1.1 用一个简单的开发环境入门 229
11.1.2 一个复杂的架构:分布式系统和 Elasticsearch 的集成 231
11.2 环境内的迭代 233
11.2.1 构建、启动和重新构建服务 234
11.2.2 服务伸缩和删除 237
11.2.3 迭代和持久化状态 238
11.2.4 网络和连接问题 239
11.3 开始一个新项目:三个示例中的 Compose YAML 240
11.3.1 启动前的构建、环境、元数据和网络 240
11.3.2 已知的组件和绑定挂载卷 241
11.3.3 卷容器和扩展服务 242
11.4 小结 243
第 12 章 Docker Machine 和 Swarm 集群 245
12.1 介绍 Docker Machine 246
12.1.1 构建和管理 Docker Machine 246
12.1.2 配置 Docker 客户端与远程 Daemon 工作 249
12.2 Docker Swarm 介绍 252
12.2.1 借助于 Docker Machine 构建 Swarm 集群 252
12.2.2 Swarm 扩展了 Docker 远程 API 255
12.3 Swarm 调度 258
12.3.1 Spread 算法 258
12.3.2 用过滤器调整调度 260
12.3.3 BinPack 和随机调度算法 263
12.4 Swarm 服务发现 265
12.4.1 Swarm 和单主机网络 266
12.4.2 服务发现生态系统和权宜之计 268
12.4.3 展望多主机网络 269
12.5 小结 270
后记 271
前 言
2011 年,我开始在 Amazon.com 工作。在第一周我的生活就被改变了,因为我学会了如何使用他们的内部版本,对组件依赖建模和制作部署工具。这种自动化的管理方法,我一直都知道是可能的,但从来没有见过。我过去的团队,每一季度部署一次,需要 10 小时完成。在亚马逊公司,我看着滚动部署工具,将当天早些时候我做出的改动,推送到数百台遍布全球的机器上。和其他公司的前景相比,这就是大科技公司的工程优势。
早在 2013 年,我想使用 Graphite(监控数据的收集和绘图套件)工作。有一天,我要安装该软件,并开始整合个人项目。应付这些事情,我有几年开源工具的使用经验,但很少依赖于 Python 这么大的生态系统。安装说明很长且模糊,在接下来的几个小时里,我发现许多安装步骤没有文档说明。这对一个有较为深入的 Python 生态系统知识的人来说,可能显而易见。但对我来说,在尝试了几个安装指南,阅读了相关的配置文件,并和代码库的依赖关系进行了史诗般地战斗后,我认输了。
那是我一生中最沮丧的几个小时。我不想和这个项目再有任何关系。更糟糕的是,因为它,我改变了当前的系统环境,经常使用的那些软件现在变得无法兼容。而要还原这些变化,则需要很长一段时间,让我尴尬不已。
我清楚地记得那年 5 月 1 日,我在办公室,当我决定看看 Hacker News 上面有没有新的方法来提高我的能力时,并于那个被称为 Docker 的技术文章,一整个星期上了几次的头版。那天晚上,我决定去试试。我找到了那个网站,几分钟内安装了软件。我在计算机桌面上运行着 Ubuntu,而 Docker 只有两个依赖:LXC 和 Linux 内核本身。
像其他人一样,我尝试了“Hello,World”的示例,但什么都不会。接下来,我安装了 Memcached,一分钟内下载并运行。然后我启用了 WordPress,它带着捆绑好的 MySQL 数据库。我还拉了几个不同的 Java、Python 镜像。此时我回想起安装 Graphite 那可怕的一天。我打开 Docker Index(在 Docker Hub 之前),并做了一个快速搜索。
结果出来了,它就在那里——某些用户做好了 Graphite 镜像。我抓取下来,并创建了一个新容器,一个简单且配置好的 Graphite 服务器就在我的机器上运行了。我只用了不到一分钟的下载时间就搞定了它,而几个月前同样的安装花费了几个小时,结果还是失败。Docker 能够用最简单的示例,以及最小的努力来展现它的价值,我臣服了。
接下来的一周,我通过和好朋友之间关于 Docker 和容器的直接对话,测试了他的耐心。我解释了包管理的好处,以及文件系统默认强制隔离可解决的一些管理上的问题;我大谈资源利用效率和初始化延迟问题。我向其他几个同事反复地讲摸索着使用容器的故事。每个人听后都有类似的问题,“哦,这就像虚拟化吗?”“如果我有虚拟机,为什么我还需要这个?”问的问题越多,我就想了解得更多。随着项目的普及,我将这个故事分享给了许许多多的人。
当我有机会公开发言时,我开始谈论有关 Docker 的内容。在 2013 年和 2014 年,只有少数人听说过 Docker,甚至更少的人在实际中试过该软件。大多数情况下,总有一些怀疑的系统管理员和兴奋的开发人员,而且他们数量相当。人们的反应都大不相同。有些是纯粹的反对者,显然倾向于维持现状。看得出来,他们经历过某些困难,曾经遇到过很类似的日常问题。而另一些人的兴奋反应和我很相似。
2014 年的夏天,Manning 的副发行人打电话给我,让我谈谈 Docker。在手机上谈了一个多小时后,他问我是否有足够的内容构成一本书。我的看法是这些内容足够几本书。他问我,是否有兴趣写写,这让我变得更加兴奋,虽然那时我用 Docker 已经有一段时间了。那年秋天,我离开 Amazon.com,然后开始了《Docker 实战》这本书的创作。
今天,我坐在完成的手稿面前。写这本书的目的是让更多的人能尽快学会使用 Docker,在本书中,他们也将了解基本的机制和原理。我希望读者有了这些知识后,可以理解 Docker 是如何被应用到实际问题中,以及如何更好地应用在自己的实例中。
本篇文章由一文多发平台 ArtiPub 自动发布