第一本Docker书(txt+pdf+epub+mobi电子书下载)

作者:[澳]詹姆斯·特恩布尔(James Turnbull)

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

第一本Docker书

第一本Docker书试读:

前言

本书面向的读者

本书适合希望实施 Docker 或基于容器的虚拟化技术的开发者、系统管理员和有意DevOps的人员阅读。

要阅读本书,读者需要具备一定的Linux/Unix技能,并熟悉命令行、文件编辑、软件包安装、服务管理和基本的网络知识。

注意

本书基于1.0.0或更高版本的Docker,该版本不向下兼容。而且,在生产环境中,我们也推荐使用1.0.0或更高版本。

致谢

● 感谢我的合伙人及好友Ruth Brown,感谢你迁就我进行本书的写作。

● 感谢Docker公司的团队,感谢你们开发出Docker,并在本书写作期间提供无私的帮助。

● 感谢#docker频道和Docker邮件列表里的朋友们,感谢你们在我遇到问题时为我答疑解惑。

● 感谢Royce Gilbert,感谢你不仅提供超赞的技术插图,还为本书英文版设计了封面。

● 感谢Abhinav Ajgaonkar,感谢你提供自己的Node.js和Express示例应用程序。

● 感谢本书的技术审校团队,你们让我时刻保持头脑清醒,并指出了书中的愚蠢错误。本书中有3张配图是由Docker公司提供的。

Docker™是Docker公司的注册商标。

技术审稿人团队

Scott Collier

Scott Collier是一位高级主任系统工程师,就职于Red Hat 的系统设计及工程团队。该团队根据从销售、市场以及工程团队收集到的数据,甄别并提供高价值的解决方案,并为内外部用户开发参考架构。Scott 是Red Hat 认证构架师(RHCA),具有超过15 年的IT 从业经验,他现在专注于Docker、OpenShift 以及Red Hat 系列产品。

除思考分布式构架之外,Scott 喜欢跑步、登山、露营,还喜欢陪妻子和三个孩子在得克萨斯州的奥斯汀享受烧烤。他的技术文章以及相关信息都发表在他的个人网站(http://colliernotes.com)上。

John Ferlito

John 是一位连续创业者,同时也是高可用性、可扩展性基础设备专家。John 现在在自己创建的Bulletproof公司担任CTO,这是一家提供关键任务的云服务商,同时,John还兼任提供综合视频服务的Vquence公司的CTO。

在空闲时间,John 投身自由及开源软件(Free and Open Source Soft,FOSS)社区。他是linux.conf.au 2007 会议的联合发起人,也是2007 年悉尼Linux 用户委员会(Sydney Linux User Group,SLUG)的委员。他做过大量的开源项目,如Debian、Ubuntu、Puppet 以及Annodex套件。读者可以在他的个人博客(http://inodes.org/blog)上查看他的文章。John拥有新南威尔士大学的工程学士荣誉学位(计算机科学类)。

Paul Nasrat

Paul Nasrat就职于Google 公司,是一位网站可靠性工程师,同时也是Docker的贡献者。他在系统工程领域做了大量的开源工具,包括启动加载器、包管理以及配置管理等。

Paul 做过各种系统管理和软件开发的工作。他曾在 Red Hat 担任软件工程师,还在ThoughtWorks公司担任过基础设备专家级顾问。Paul在各种大会上做过演讲,既有DevOps活动早期在2009年敏捷大会上关于敏捷基础设备的演讲,也有在小型聚会和会议上的演讲。

技术插图作家

Royce Gilbert(ksuroyce@yahoo.com)是本书技术插图的作者,在他超过30 年的从业经验中,他做过CAD设计、计算机支持、网络技术、项目管理,还曾为多家世界500强企业提供商务系统分析,包括安然(Enron)、康柏(Compaq)、科氏(Koch)和阿莫科(Amoco)集团。Royce在位于堪萨斯州曼哈顿的堪萨斯州立大学担任系统/业务分析员。他业余时间在自己的Royce艺术工作室进行创作,是一位独立艺术家和技术插画家。他和38岁的妻子在堪萨斯州的弗林特山上修复了一间127年历史的石头老屋,并以此为居所,过着平静的生活。

校对者

Q女士在纽约地区长大,是一位高中教师、纸杯蛋糕冷冻师、业余科学家、法医人类学家,还是一名灾难应急专家。她现居旧金山,[1]制作音乐,研究表演,整理 ng-newsletter ,并负责照顾Stripe公司的名流。

排版约定

这是行内代码语句:inline code statement。

下面是代码块:代码清单0-1 示例代码块

This is a code block

过长的代码行会换行。

代码及示例[2]

读者可以在网站上获取本书的代码和示例程序 ,也可以获取代[3]码和示例的Git库 。

说明

本书英文原版是用Markdown格式写的,同时也使用了大量的LaTeX格式的标记符号,然后用PanDoc转成PDF和其他格式(还使[4]用了Backbone.js on Rails 那帮好兄弟写的脚本)。

勘误

如果读者发现任何错误,请用电子邮件与我联系,我的邮箱是 james+errata@lovedthanlost.net。

版本

本书是《The Docker Book》一书v1.3.1 版的中文版。

注释

[1]. http://www.ng-newsletter.com/

[2]. http://www.dockerbook.com/code/index.html

[3]. https://github.com/jamtur01/dockerbook-code

[4]. https://learn.thoughtbot.com/products/1-backbone-js-on-rails第1章简介

在计算世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

由于“客居”于操作系统,容器只能运行与底层宿主机相同或相似的操作系统,这看起来并不是非常灵活。例如,可以在Ubuntu 服务器中运行RedHat Enterprise Linux,但却无法在Ubuntu 服务器上运行Microsoft Windows。

相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟机所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。

尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是“权限隔离监牢”(chroot jail),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢中正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器创建的目录中,无法对宿主机进行进一步的破坏。

最新的容器技术引入了OpenVZ、Solaris Zones 以及Linux 容器(如lxc)。使用这些新技术,容器不再仅仅是一个单纯的运行环境。在自己的权限范围内,容器更像是一个完整的宿主机。对 Docker 来说,它得益于现代 Linux 内核特性,如控件组(control group)、命名空间(namespace)技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好地共存。

容器经常被认为是精益技术,因为容器需要的开销有限。和传统的虚拟化以及半虚拟化(paravirtualization)相比,容器运行不需要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。

尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而 Docker 就是为改变这一切而生。1.1 Docker简介

Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。由 Docker 公司(www.docker.com,前dotCloud公司,PaaS市场中的老牌提供商)的团队编写,基于Apache 2.0开源授权协议发行。

注意

顺便披露一个小新闻:作者本人就曾在Docker工作过,目前是Docker公司的顾问。

那么Docker有什么特别之处呢?Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker 极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。而Docker的目标就是要提供以下这些东西。1.1.1 提供一个简单、轻量的建模方式

Docker上手非常快,用户只需要几分钟,就可以把自己的程序“Docker化”(Dockerize)。Docker 依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到了“随心所至,代码即改”的境界。

随后,就可以创建容器来运行应用程序了。大多数Docker容器只需不到1秒钟即可启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。1.1.2 职责的逻辑分离

使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种“开发时一切都正常,肯定是运维的问题”的风险。1.1.3 快速、高效的开发生命周期

Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。1.1.4 鼓励使用面向服务的架构[1]

Docker还鼓励面向服务的架构和微服务架构 。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。

注意

如果你愿意,当然不必拘泥于这种模式,你可以轻松地在一个容器内运行多个进程的应用程序。1.2 Docker组件

我们来看看Docker的核心组件:

● Docker客户端和服务器;

● Docker镜像;

● Registry;

● Docker容器。1.2.1 Docker客户端和服务器

Docker是一个客户-服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具docker 以及一整[2]套RESTful API 。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。图1-1描绘了Docker的架构。图1-1 Docker架构1.2.2 Docker镜像

镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合(Union)文件系统的一种层式的结构,由一系列指令一步一步构建出来。例如:

● 添加一个文件;

● 执行一个命令;

● 打开一个端口。

也可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。在本书中,我们将会学习如何使用已有的镜像,同时也会尝试构建我们自己的镜像。1.2.3 Registry

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营的公共Registry叫做Docker Hub。用户可以[3][4]在Docker Hub 注册账号 ,分享并保存自己的镜像。

根据最新统计,Docker Hub上有超过10 000注册用户构建和分享[5]的镜像。需要Nginx Web服务器 的Docker镜像,或者Asterix开源[6][7]PABX系统 的镜像,抑或是MySQL数据库 的镜像?这些镜像在Docker Hub 上都有,而且具有多种版本。

你也可以在Docker Hub 上保存自己的私有镜像。例如,包含源代码或专利信息等需要保密的镜像,或者只在团队或组织内部可见的镜像。

你甚至可以架设自己的私有 Registry。具体方法我们会在第 4 章中讨论。私有 Registry可以受到防火墙的保护,将镜像保存在防火墙后面,以满足一些组织的特殊需求。1.2.4 容器

Docker 可以帮你构建和部署容器,你只需要把自己的应用程序或服务打包放进容器即可。我们刚刚提到,容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。

总结起来,Docker容器就是:

● 一个镜像格式;

● 一系列标准的操作;

● 一个执行环境。

Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而Docker运输软件。

每个容器都包含一个软件镜像,也就是容器的“货物”,而且与真正的货物一样,容器里的软件镜像可以进行一些操作。例如,镜像可以被创建、启动、关闭、重启以及销毁。

和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底塞进了什么,它不管里面是 Web 服务器,还是数据库,或者是应用程序服务器什么的。所有容器都按照相同的方式将内容“装载”进去。

Docker 也不关心你要把容器运到何方:你可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到 Amazon EC2主机的集群中去。像标准集装箱一样,Docker 容器方便替换,可以叠加,易于分发,并且尽量通用。

使用Docker,我们可以快速构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续集成(continuous integration,CI)测试环境或者任意一种应用程序、服务或工具。我们可以在本地构建一个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序栈。可以说,Docker的应用场景相当广泛。1.3 我们能用Docker做什么

那么,我们为什么要关注 Docker 或容器技术呢?我们前面已经简单地讨论了容器提供的隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本身就具有“标准性”的特征,非常适合为服务创建构建块。Docker的一些应用场景如下。

● 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境。

● 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署中尤其实用。

● 用Docker创建隔离的环境来进行测试。例如,用Jenkins CI这样的持续集成工具启动一个用于测试的容器。

● Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是一开始就在生产环境部署、测试。

● 构建一个多用户的平台即服务(PaaS)基础设施。

● 为开发、测试提供一个轻量级的独立沙盒环境,或者将独立的沙盒环境用于技术教学,如Unix shell 的使用、编程语言教学。[8]

● 提供软件即服务(SaaS)应用程序,如Memcached 即服务 。

● 高性能、超大规模的宿主机部署。

本书为读者提供了一个基于和围绕 Docker 生态环境构建的早期项目列表,详情请查看http://blog.docker.com/2013/07/docker-projects-from-the-docker-community/。1.4 Docker与配置管理

从Docker项目公布以来,已经有大量关于“哪些配置管理工具适用于Docker”的讨论,如Puppet、Chef。Docker包含一套镜像构建和镜像管理的解决方案。现代配置管理工具的原动力之一就是“黄金镜[9]像”模型 。然而,使用黄金镜像的结果就是充斥了大量、无管理状态的镜像:已部署或未部署的复杂镜像数量庞大,版本状态混乱不堪。随着镜像的使用,不确定性飞速增长,环境中的混乱程度急剧膨胀。镜像本身也变得越来越笨重。最终不得不手动修正镜像中不符合设计和难以管理的配置层,因为底层的镜像缺乏适当的灵活性。

与传统的镜像模型相比,Docker 就显得轻量多了:镜像是分层的,你可以对其进行迅速的迭代。数据表明,Docker 的这些特性确实能够减轻许多传统镜像管理中的麻烦。现在还难以确定 Docker 是否可以完全取代配置管理工具,但是从幂等性和内省性来看,Docker确实能够获得非常好的效果。Docker 本身还是需要在主机上进行安装、管理和部署的。而主机也需要被管理起来。这样,Docker 容器需要编配、管理和部署,也经常需要与外部服务和工具进行通信,而这些恰恰是配置管理工具所擅长的。

Docker 一个显著的特点就是,对不同的宿主机、应用程序和服务,可能会表现出不同的特性与架构(或者确切地说,Docker本就是被设计成这样的):Docker可以是短生命周期的,但也可以用于恒定的环境,可以用一次即销毁,也可以提供持久的服务。这些行为并不会给 Docker 增加复杂性,也不会和配置管理工具的需求产生重合。基于这些行为,我们基本不需要担心管理状态的持久性,也不必太担心状态的复杂性,因为容器的生命周期往往比较短,而且重建容器状态的代价通常也比传统的状态修复要低。

然而,并非所有的基础设施都具备这样的“特性”。在未来的一段时间内,Docker这种理想化的工作负载可能会与传统的基础设备部署共存一段时间。长期运行的主机和物理设备上运行的主机在很多组织中仍具有不可替代的地位。由于多样化的管理需求,以及管理Docker自身的需求,在绝大多数组织中,Docker和配置管理工具可能都需要部署。1.5 Docker的技术组件

Docker可以运行于任何安装了现代Linux内核的x64主机上。我们推荐的内核版本是3.8或者更高。Docker的开销比较低,可以用于服务器、台式机或笔记本。它包括以下几个部分。

一个原生的Linux容器格式,Docker中称为libcontainer,或者很[10]流行的容器平台lxc 。libcontainer格式现在是Docker容器的默认格式。[11]

Linxu内核的命名空间(namespace) ,用于隔离文件系统、进程和网络。

● 文件系统隔离:每个容器都有自己的root 文件系统。

● 进程隔离:每个容器都运行在自己的进程环境中。

● 网络隔离:容器间的虚拟网络接口和IP地址都是分开的。[12]

● 资源隔离和分组:使用cgroups (即control group,Linux 的内核特性之一)将CPU和内存之类的资源独立分配给每个Docker容器。[13]

● 写时复制 :文件系统都是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小。

● 日志:容器产生的STDOUT、STDERR 和STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障排错。

● 交互式shell:用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式的shell。1.6 本书的内容

在本书中,我们将讲述如何安装、部署、管理 Docker,并对其进行功能扩展。我们首先会向大家介绍Docker的基础知识及其组件,然后用Docker构建容器和服务,来完成各种的任务。

我们还会体验从测试到生产环境的完整开发生命周期,并会探讨 Docker 适用于哪些领域,Docker是如何让我们的生活更加简单的。我们使用Docker为新项目构建测试环境,演示如何将 Docker 集成到持续集成工作流,如何构建程序应用的服务和平台。最后,我们会向大家介绍如何使用Docker的API,以及如何对Docker进行扩展。

我们将会教大家如何:

● 安装Docker;

● 尝试使用Docker容器;

● 构建Docker镜像;

● 管理并共享Docker镜像;

● 运行、管理更复杂的Docker容器;

● 将Docker容器的部署纳入测试流程;

● 构建多容器的应用程序和环境;

● 介绍使用Fig进行Docker编配的基础;

● 探索Docker的API;

● 获取帮助文档并扩展Docker。

推荐读者按顺序阅读本书。每一章都会以前面章节的 Docker 知识为基础,并引入新的特性和功能。读完本书后,读者应该会对如何使用 Docker 构建标准容器,部署应用程序、测试环境和独立的服务有比较深刻的理解。1.7 Docker资源

● Docker官方主页(http://www.docker.com/)。

● Docker Hub(http://hub.docker.com)。

● Docker官方博客(http://blog.docker.com/)。

● Docker官方文档(http://docs.docker.com/)。

● Docker快速入门指南(http://www.docker.com/tryit/)。

● Docker的GitHub 源代码(https://github.com/docker/docker)。

● Docker Forge(https://github.com/dockerforge):收集了各种Docker工具、组件和服务。

● Docker邮件列表(https://groups.google.com/forum/#!forum/docker-user)。

● Docker的IRC 频道(irc.freenode.net)。

● Docker的Twitter主页(http://twitter.com/docker)。

● Docker的StackOverflow问答主页(http://stackoverflow.com/search?q=docker)。

● Docker官网(http://www.docker.com/)。

除这些资源之外,我们在第9章中会详细介绍去哪里以及如何获得Docker的帮助信息。

注释

[1]. http://martinfowler.com/articles/microservices.html

[2]. http://docs.docker.com/reference/api/docker_remote_api/

[3]. http://hub.docker.com/

[4]. https://hub.docker.com/account/signup/

[5]. https://hub.docker.com/search?q=nginx

[6]. https://hub.docker.com/search?q=Asterisk

[7]. https://hub.docker.com/search?q=mysql

[8]. http://www.memcachedasaservice.com/

[9]. https://web.archive.org/web/20090207105003/http://madstop.com/2009/02/04/golden-image-or-foil-ball

[10]. http://lxc.sourceforge.net/

[11]. http://lwn.net/Articles/531114/

[12]. http://en.wikipedia.org/wiki/Cgroups

[13]. http://en.wikipedia.org/wiki/Copy-on-write第2章安装Docker

Docker的安装既快又简单。目前,Docker已经支持非常多的Linux平台,包括Ubuntu和RHEL(Red Hat Enterprise Linux,Red Hat企业版Linux)。除此之外,Docker还支持Debian、CentOS、Fedora、Oracle Linux 等衍生系统和相关的发行版。如果使用虚拟环境,甚至也可以在OS X和Microsoft Windows中运行Docker。

目前来讲,Docker团队推荐在Ubuntu或RHEL宿主机中部署Docker,这两个发行版中直接提供了可安装的软件包。本章将介绍如何在四种各有所长的操作系统中安装 Docker,包括:

● 在运行Ubuntu 系统的宿主机中安装Docker;

● 在运行RHEL 或其衍生的Linux 发行版的宿主机中安装Docker;[1]

● 在OS X系统中用Boot2Docker 工具安装Docker;

● 在Microsoft Windows系统中使用Boot2Docker工具安装Docker。

提示

Boot2Docker是一个极小的虚拟机,同时提供了一个包装脚本(wrapper script)对该虚拟机进行管理。该虚拟机运行一个守护进程,并在OS X或Microsoft Windows中提供一个本地的Docker守护进程。Docker的客户端工具docker可以作为这些平台的原生程序安装,并连接到在Boot2Docker虚拟机中运行的Docker守护进程。

Docker 也可以在很多其他 Linux 发行版中运行,包括 Debian、[2][3][4]SuSE 、Arch Linux 、CentOS 和Gentoo 。Docker 也支持一些云[5][6]平台,包括Amazon EC2 、Rackspace Cloud 和Google Compute [7]Engine 。

我们之所以选择对在这四种环境下 Docker 的安装方法进行介绍,主要是因为它们是Docker社区中最常用的几种环境。例如,开发人员使用OS X电脑,系统管理员使用Windows工作站,而测试、预演(staging)或生产环境运行的是Docker原生支持的其他平台。这样,开发人员和系统管理员就可以在自己的 OS X 或者 Windows 工作站中用 Boot2Docker 构建Docker容器,然后把这些容器放到运行其他支持平台的测试、预演或者生产环境中。

建议读者至少使用Ubuntu或者RHEL完整地安装一遍Docker,以了解Docker安装需要哪些前提条件,也能够了解到底如何安装Docker。

提示[8]

和所有安装过程一样,我也推荐读者了解一下如何使用Puppet [9]或Chef 这样的工具来安装Docker,而不是纯手动安装。例如,可以[10][11]在网上找到安装Docker的Puppet模块 和Chef cookbook 。2.1 安装Docker的先决条件

和安装其他软件一样,安装Docker也需要一些基本的前提条件。Docker要求的条件具体如下。

● 运行64 位CPU构架的计算机(目前只能是x86_64 和amd64),请注意,Docker目前不支持32位CPU。

● 运行Linux 3.8或更高版本内核。一些老版本的2.6.x或其后的内核也能够运行Docker,但运行结果会有很大的不同。而且,如果你需要就老版本内核寻求帮助时,通常大家会建议你升级到更高版本的内核。

● 内核必须支持一种适合的存储驱动(storage driver),例如:[12]

◆ Device Manager ;[13]

◆ AUFS ;[14]

◆ vfs ;[15]

◆ btrfs ;

◆ 默认存储驱动通常是Device Mapper。[16][17]

● 内核必须支持并开启cgroup 和命名空间 (namespace)功能。2.2 在Ubuntu中安装Docker

目前,官方支持在下面的Ubuntu版本中安装Docker:

● Ubuntu Trusty 14.04(LTS)(64 位);

● Ubuntu Precise 12.04(LTS)(64 位);

● Ubuntu Raring 13.04(64位);

● Ubuntu Saucy 13.10(64 位)。

注意

这并不意味着上面清单之外的Ubuntu(或Debian)版本就不能安装Docker。只要有适当的内核和Docker所必需的支持,其他版本的Ubuntu也是可以安装Docker的,只不过这些版本并没有得到官方支持,因此,遇到的bug可能无法得到官方的修复。

安装之前,还要先确认一下已经安装了 Docker 所需的前提条件。我创建了一个要安装Docker的全新Ubuntu 12.04 LTS 64 位宿主机,称之为darknight.example.com。2.2.1 检查前提条件

在Ubuntu宿主机中安装并运行Docker所需的前提条件并不多,下面一一列出。

1.内核

首先,确认已经安装了能满足要求的Linux内核。可以通过uname命令来检查内核版本信息,如代码清单2-1所示。代码清单2-1 检查Ubuntu内核的版本

$ uname -a

Linux darknight.example.com 3.8.0-23-generic #34~precise1-Ubuntu SMP Wed May

29 21:12:31 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

可以看到,这里安装的是3.8.0 x86_64 版本的内核。这是Ubuntu 12.04.3 及更高版本(包括Ubuntu 13.04 Raring)默认的内核。

但是,如果我们使用Ubuntu 12.04 Precise较早的发行版,可能是3.2 内核。我们也可以轻松地把 Ubuntu12.04 升级到最新的内核。例如,本书写作时,3.8 版本的内核已经可以用apt-get来安装了,如代码清单2-2所示。代码清单2-2 在Ubuntu Precise中安装3.8内核

$ sudo apt-get update

$ sudo apt-get install linux-headers-3.8.0-27-generic

linux-image-3.8.0-27-generic linux-headers-3.8.0-27

注意

本书中的所有操作都使用sudo来获取所需的root权限。

然后,我们就可以更新Grub启动加载器来加载新内核,如代码清单2-3所示。代码清单2-3 更新Ubuntu Precise的启动加载器

$ sudo update-grub

完成安装后,需要重启宿主机来启用新的3.8内核,如代码清单2-4所示。代码清单2-4 重启Ubuntu宿主机

$ sudo reboot

重启之后,我们可以再次使用uname –a 来确认已经运行了正确版本的内核。

注意

请记住:如果在 Ubuntu Raring中安装Docker,无需升级内核,因为 Raring本身的内核就是3.8版本。

2.检查Device Mapper

这里我们将使用Device Mapper 作为存储驱动。自2.6.9 版本的Linux 内核开始已经集成了Device Mapper,并且提供了一个将块设备映射到高级虚拟设备的方法。Device Mapper支持“自动精简配置”[18] (thin-provisioning)的概念,可以在一种文件系统中存储多台虚拟设备(Docker镜像中的层)。因此,用Device Mapper作为Docker的存储驱动是再合适不过了。

任何Ubuntu 12.04 或更高版本的宿主机应该都已经安装了Device Mapper,可以通过代码清单2-5所示的命令来确认是否已经安装。代码清单2-5 检查Device Mapper

$ ls -l /sys/class/misc/device-mapper

lrwxrwxrwx 1 root root 0 Oct 5 18:50 /sys/class/misc/device-mapper

-> ../../devices/virtual/misc/device-mapper

也可以在/proc/devices文件中检查是否有device-mapper条目,如代码清单2-6所示。代码清单2-6 在Ubuntu的proc中检查Device Mapper

$ sudo grep device-mapper /proc/devices

如果没有出现device-mapper的相关信息,我们也可以尝试加载dm_mod模块,如代码清单2-7所示。代码清单2-7 加载Device Mapper模块

$ sudo modprobe dm_mod

cgroup 和命名空间自 2.6 版本开始已经集成在 Linux 内核中了。2.6.38 以后的内核对cgroup和命名空间都提供了良好的支持,基本上也没有什么bug。2.2.2 安装Docker

现在“万事俱备,只欠东风”。我们将使用Docker团队提供的DEB软件包来安装Docker。

首先,要添加Docker的APT仓库,如代码清单2-8所示。其间,可能会提示我们确认添加仓库并自动将仓库的GPG添加到宿主机中。代码清单2-8 添加Docker的ATP仓库

$ sudo sh -c "echo deb https://get.docker.io/ubuntu docker main >

/etc/apt/sources.list.d/docker.list"

安装之前,我们首先需要确认已经安装了curl命令,如代码清单2-9所示。代码清单2-9 检测curl命令是否安装

$ whereis curl

curl: /usr/bin/curl /usr/bin/X11/curl /usr/share/man/man1/curl.1.gz

如果没有找到curl命令,我们需要先安装它,如代码清单2-10所示。代码清单2-10 如果需要,安装curl

$ sudo apt-get -y install curl

接下来,要添加Docker仓库的GPG密钥,如代码清单2-11所示。代码清单2-11 添加Docker仓库的GPG密钥

$ curl -s https://get.docker.io/gpg | sudo apt-key add -

之后,我们需要更新APT源,如代码清单2-12所示。代码清单2-12 更新APT源

$ sudo apt-get update

现在,我们就可以安装Docker软件包了,如代码清单2-13所示。代码清单2-13 在Ubuntu中安装Docker

$ sudo apt-get install lxc-docker

执行该命令后,系统会安装Docker软件包以及一些必需的软件包。

安装完毕,可以用docker info 命令来确认Docker 是否已经正常安装并运行了,如代码清单2-14所示。代码清单2-14 确认Docker已经安装在Ubuntu中

$ sudo docker info

Containers: 0

Images: 0

...2.2.3 Docker与UFW[19]

在Ubuntu 中,如果使用UFW ,即Uncomplicated Firewall,那么还需对其做一点儿改动才能让Docker工作。Docker使用一个网桥来管理容器中的网络。默认情况下,UFW会丢弃所有转发的数据包(也称分组)。因此,需要在 UFW 中启用数据包的转发,这样才能让Docker正常运行。我们只需要对/etc/default/ufw文件做一些改动即可。我们需要将这个文件中代码清单2-15所示的代码替换为代码清单2-16所示的代码。代码清单2-15 原始的UFW转发策略

DEFAULT_FORWARD_POLICY="DROP"代码清单2-16 新的UFW转发策略

DEFAULT_FORWARD_POLICY="ACCEPT"

保存修改内容并重新加载UFW即可,如代码清单2-17所示。代码清单2-17 重新加载UFW防火墙

$ sudo ufw reload

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?