“ the Docker book ”,作者 James Turnbull ,是一本为任何想学习 Docker 的人所撰写的一本手册,它会带着读者从第一次安装,通过简单的例子解释 Docker 的一些概念,一直到稍复杂的场景中让读者领略真实世界如何使用 Docker 的各种奇思妙想。
本书从描述 Docker 是什么以及其目的为何开始。它也描述了所有主要的 Docker 概念,以镜像、容器和注册处作为开端。镜像是基础的构建块,对于此James 是描述为“容器的’源代码’”:高度的可移植性且易于更新。容器是“运行时”组件:一个基于镜像对包含自我的环境。镜像和容器在Docker 中是可以分离的,分别为独立的部分。注册处是一种镜像管理、存储以及分享的机制。注册处所对于Docker 镜像的角色就像是Github 和社交对于源代码的角色。
在学习完基本的概念之后,读者就可开始学习Docker 的安装了,书中讲述了如何在各种Linux 发行版、Windows 以及MacOSX 下安装Docker。James 列出了几种管理Docker 的用户界面工具,但是它们表现不尽如人意,所以命令行才是王道。当你阅读完本书,你就能够掌握大多数Docker 的各种命令、子命令的用法。
一旦读者将Docker 成功的安装到自己的系统,James 就会教授关于如何使用命令行和Docker 来进行交互。通过一些基本的场景James 向读者展示了如何创建容器( docker run ),如何检查容器 ( docker inspect ),或者是查看内部运行着什么 ( docker ps )。
接下来是学习如何创建镜像以及创建完成后将它们存储到仓库中。再重复一次,Docker 仓库可以被类比于是 Git 仓库:Docker 仓库存放 Docker 镜像;Git 仓库存放源代码。创建镜像的方法有两种:使用 docker commit 和 Dockerfiles。因为镜像使用了分层的格式, 构建在Union 文件系统之上,Docker 使用了提交的暗喻来创建新的镜像层。镜像层类似于源代码控制工具中的新版本。的确是,正如读者所真正理解的那样,Docker 借鉴了源代码控制的理念。
使用 docker commit 来创建镜像,就是创建了一个新的层,即改变了一个已经创建好的容器。所以 James 建议创建镜像的方式是使用 Dockerfiles 。James 在此花了一些篇幅来解释 Dockerfiles,因为其对于 Docker 来说绝对是核心概念。在此读者可以不仅可以学习到 Dockerfile 的格式,还有运行时执行的工作流。例如,给出了每个创建镜像层的 Dockerfile 指令,Docker 的时光机器功能可以随时回到镜像的任何历史的状态。同样,如果一个指令失败,你可以运行最后成功的那个指令的镜像,然后开始调试。这是 Docker 所提供的强大的功能之一,它彻底更改了服务器的构建方式。
一旦准备好了 Dockerfile 且完成了镜像的构建,就是该将镜像推送到 Docker 注册处了。James 解释了如何使用 Docker 自身的 DockerHub ,以及如何集成 GitHub 或 BitBucket 来提供自动化的镜像构建。自动化构建,过去叫做可信的构建,是一种当你向 GitHub 或 BitBucket 提交了代码的时候,自动的开始构建镜像然后将镜像上传到 DockerHub 的工作流。James 还提到了在刚开始写作本书的时候,提及了相关的注册处 Qury 和 Orchard ,以及如果需要的话,如何构建自己的注册处。但是这个世界变化太快,在本书出版后,CoreOS收购了Qury,Docker 公司收购了Orchard。James 对这些相关的事件做了一些补充。
James Turnbull 花了很多篇幅来阐述 Docker 如何应用于实际案例中的想法。他的第一个案例是持续集成,使用 Jenkins 来运行多配置的构建任务。然后是一个使用 Docker 来构建和配置一个 Jekyll 站点。之后构建了一个基于 Node.js 和完全复制的 Redis 后端的 web 应用程序。每个案例的流程是很类似的,最有趣的地方莫过于 Docker 可以用于任何地方。主机服务器出了执行 Docker 之外不做任何其它事情。通过这些案例也阐述了卷和 Docker 网络的一些内容。
当将一台容器停止运行时,其上面所有的变更都会被丢弃,(译者注:相比于镜像)除非将这些变更作了提交,在原来镜像的基础上创建一层。这对于处理应用程序的数据并不适合。Docker 解决此问题的方法是使用卷,通过 Union 文件系统来提供持久化的存储。James 利用上述中的案例向大家展示了现实环境中 Docker 的使用卷是非常关键的。
接下来 James 介绍了容器网络的各种属性。在书中首先提到的是将容器的端口映射到主机的本地网络。稍后讨论了 Docker 的内部网络特性。一旦安装了Docker,Docker 就会在主机中创建一个名为docker0 的虚拟网桥,它是连接主机和所有容器的虚拟设备。通过此方法可以让用户创建一个虚拟子网,相比于直接使用IP,James 指出了此种方法的两个缺陷:在应用程序配置中需将网络硬编码;容器重启后其IP 会发生变化。
本书讨论网络的部分,最后谈到的是容器的链接。一个链接是指在两个链接之间创建的一种父子关系,允许作为父的容器使用端口来和作为子的容器中没有被其它容器使用的端口通信。这就提供了一个高度安全的方式,这些端口都不会暴露给主机。不过,聪明的读者一定能够从这个描述中想到了,那就是链接只能在同一主机上的两台容器之间工作。
单个容器的能力是有限的,很明显,要提供更加复杂的服务,就需要工具来协调所有的容器。James 为此写了一章内容,介绍了 Fig 和 Consul ,前者是为多容器服务的编排工具,后者是一个高度弹性服务的发现工具,并展示了在更加复杂的环境中如何使用它们。
在书中将 Docker 的应用程序接口专门的列出了一章,重点讲述了远程应用程序接口。远程API(应用程序接口,下同,译者注)是一个REST 的接口,提供了和命令行类似的功能,是Docker 管理和配置自动化的不二选择。但讲述API 不是本书的核心内容,所以作者仅仅是走马观花的介绍了一下。虽然仅仅是粗略的介绍,但是对于本书已经足够用了。它们提供了一种和Docker 通信的另外一个渠道,但是它们提供的是和本书其它章节一样的概念和功能。
本书所期望的读者要基本熟悉Linux,基本的命令行shell,软件包(yum 和apt),服务管理,以及基本的网络知识。无论是开发者还是运维背景的任何人都可以阅读本书,即使是Windows 背景,照着例子做也不会遇到很大的困难。本书有很完整的代码清单,在适当的时候,书中就会指出相关的包括实例代码的Github 仓库。
本书所描述的案例表明了为何现在Docker 是如此的盛行。鉴于本书是一本介绍Docker 本身的书,案例仍然是现实环境的简化版。我们仍然要等待Docker 在实际生产环境的使用的用户们提供更多的案例。
James Turnbull 是一位多产的作家,其一些书是值得称赞的。去年,InfoQ 曾对他另外一本书:“The LogStash Book”作了内容回顾。“The Docker Book” 这本书对于Docker 的入门者是非常有价值的。你可以从Docker 的官方文档中获得同样的信息,但是本书有着更好的组织方式,且易读。从另外一个角度讲,对于熟悉技术、又有图书的预算的人来说,这本书值得拥有。
InfoQ 借此机会采访了 James,让读者们听听他的转移技术阵营的想法。
InfoQ: 当第一次看到关于 Docker 时,看起来似乎服务的配置管理都不那么重要了,你只需要创建一个 Dockerfile,其它就不用管了。也有一些人坦言承认 Docker 的各种好处,但也警告说这也太夸张了点。请问你对此怎么看?
James Turnbull: 使用 Docker 或者其它工具并不是一个非此即彼的问题。当你使用了一种新的工具你不可能就将旧的工具废弃掉,更何况没有哪种技术是包治百病的灵丹妙药。那些向你提出建议的人,不是在向你兜售一些东西,就是利用恐惧、迟疑、不确定来阻止你使用某些东西。优秀的开发者和系统管理员在工作中总能找到好的工具。如果说 Docker 和配置管理在他们中间非常的受欢迎。对于基于 Docker 的应用来说,使用配置管理来构建 Docker 镜像和维护 Docker 主机令人惊奇,Docker 也不过是你服务管理和应用工具箱中另外一个强大、可爱的工具罢了。
InfoQ: 可以确定的一件事情就是 Docker 和容器技术改变了这个技术阵营,Docker 的出现使什么作了主要的范式转变?在 Docker 没有出现之前是个什么样的情况?
James Turnbull: Docker 能够让应用程序的构建以及可移植的部署更加的容易。也不是说离了 Docker 某些特定的应用就无法使用,但是可以确定的是 Docker 的出现让一些较难的 IT 任务变得更为简单和容易,比如:更加快速的交付代码、可移植的负载、以及构建应用程序。
InfoQ: “The Docker Book”是一本手册类的图书,主要针对的是从基本原理开始学习<strong>docker 的初学者,但是,在了解了 Docker 的机制之后,想要了解整个大局,其基础设施给如何适应这个新的“世界”。当你的读者看完了本书以后,还有什么资源可以进一步利用?</strong>
<strong>James Turnbull:</strong> 我期望大家不要将本书仅仅视为一本入门的教材。本书不仅着眼于基础,而且覆盖了在‘实际环境’中使用 Docker,如测试、持续集成工作流、以及构建和部署应用和服务,还讲述了‘数据中心’工具的基础,如 Fig 之于编排,Consul 之于服务发现。 本书之外,大家可以参考 Docker 的文档-[<span><a href="http://docs.docker.com/">docs.docker.com</a></span>],以及来自 Docker 社区的优质资源-Freenode 上的 IRC 频道 #docker,[<span><a href="https://groups.google.com/forum/#!forum/docker-user">Docker 用户邮件列表 </a></span>]。
<strong>InfoQ: Docker 并非是唯一的容器技术,甚至一个概念也不是新的。你为什么认为 Docker 能够引领这一潮流?</strong>
<strong>James Turnbull:</strong> Docker 让容器更加的容易使用。Docker 借鉴了很多已有的技术,没有诸如 Solaris Zone 或 LXC 容器等软件卓越的工作就不可能有 Docker。但是这些工具对于很多开发者和系统管理员不怎么接地气或者说入门门槛很高。Docker 让一切变得简单起来,让一个入门者能够快速的掌握基本知识,就可以为他们的应用程序创建容器。
<strong>InfoQ: Docker 的未来会是什么样子的?</strong>
<strong>James Turnbull:</strong> 我认为前途一片光明。Docker 的工具和贡献者的生态系统的快速成长着实吃惊。它让整个行业的很多人都开始拥抱它,我们开始看到很多的功能以及集成,它允许人们构建和管理复杂的应用程序。我想你会看到现有的相当一部分的负载,不是全部!但占有相当份额的应用会迁移到 Docker 容器中运行。
关于作者
James Turnbull 是多本关于开源软件技术书籍的作者,长时间活跃于开源社区,过去写过的书涉及 Docker,Logstash,Puppet。他是 kickstarter 的 VP,Docker 公司的顾问,James 常在一些开源会议上作演讲,包括 Velocity, OSCON, Linux.conf.au , FOSDEM, DevOpsDays。他曾任职于澳大利亚 Linux 协会主席,维多利亚 Linux 协会前任委员,2008 年 Linux.conf.au 的财务官,并且担任 Linux.conf.au 和 OSCON 的议程委员。
查看英文原文:“The Docker Book” Review and author Q&A
感谢张龙对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论