Docker从入门到实战.html.pdf
《Docker从入门到实战.html.pdf》由会员分享,可在线阅读,更多相关《Docker从入门到实战.html.pdf(214页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、前言 Docker作为一个2013年才诞生的开源项目,其发展的速度和火爆程度却令人惊叹。容器技术本不是什么新鲜事物,但是在Docker的整合下,一切变得清晰、易用起来,并且随着各大云计算厂商的进 场,使Docker得到了极大的推广。 如今,Docker已经成为容器技术领域当仁不让的领头羊。国内外以Docker技术起家的创业公司如雨后春笋般涌现出来,体现了容器市场的巨大需求。越来越多的企业开始逐步把传统的应用开发流程 迁移到Docker容器中作为开发部署流程的一环。伴随而来的是各种复杂的需求与Docker尚不算完善的功能所产生的矛盾,这些问题制约着企业容器化的脚步。 另一方面,Docker以其友
2、好的使用体验使广大开发者对其“一见倾心”,越来越多的开发者使用Docker作为应用分发部署的一个重要阵地。尽管如此,Docker对于大部分开发者而言还是尚未开拓的 疆土。特别是对于国内环境而言,Docker的推广基本上靠国内几家与Docker相关的初创公司。本书以一位普通的全栈开发者的身份,详细介绍了Docker的基础知识,分享了企业级容器云的实战经验。 为什么学习Docker 如果您是一名开发者,想必遇到过“这个程序只有在我的机器上才可以运行”的情况。随着用户需求变得多样,软件愈发复杂,所依赖环境愈发庞大,使得软件在其他机器上运行需要做大量的迁移工 作。更糟糕的是,这些琐事完成后软件还不一定
3、能正常运行。 为了解决这些问题,虚拟化技术开始普及。人们可以通过各种虚拟化技术来实现软件的迁移和分发。最常见的就是虚拟机或KVM技术。在虚拟机里完成开发再迁移到线上不会出现环境问题,解决了迁 移过程中的诸多难题,但是仍然存在性能低下、分发流程麻烦、耗时和成本昂贵等问题。在云计算时代这些问题更加突出。 随着容器技术的普及,人们意识到容器技术可以极大地降低成本。容器技术具有启动快、体积小和分发迅速等诸多特点,这简直就是开发人员梦寐以求的工具。 而“欣喜若狂”的不止是开发人员,还有运维人员。如果在十年前,普通企业要管理上百台服务器,最可能使用的方法是通过Shell脚本的方式使用SSH连接到所有服务器
4、然后执行相同的指令,并把日 志保存起来归档。这种方式我们称之为第一代运维。那时维护服务器是一项繁重的工作,工程师不得不把大量的时间耗费在服务器管理上。 随着技术的发展,虚拟化技术的普及和云计算的出现,企业需要管理的服务器数量大幅增长。过去我们只要管理企业内部数据中心的物理服务器,而现在则要管理遍布全球的服务器,运维成本愈发昂 贵。于是开发者开始针对云计算时代服务器运维方式做出改变,涌现出了诸如Ansible、Puppet、SaltStack和Chef等出色的运维工具。人们可以通过这些工具快速地完成对上百台甚至上千台服务器的管理 操作。这被称之为第二代运维。它极大地解决了管理庞大服务器集群的难题
5、,使人们可以在屏幕面前通过一个界面管理所有服务器。但本质上这些工具都是通过SSH或者类似于SSH的方式连接到服务器来 管理服务器集群,这意味着其实第二代运维和第一代运维并没有发生根本性的改变。 上面那些运维工具在云计算普及的大势下很快暴露了它们的问题速度。因为大部分运维工具依靠的是SSH连接来交换信息,这使得整个过程十分耗时,更不用说其他复杂的管理操作。而随着容器 技术的爆发,以Docker为代表的容器技术开始发力,并随着DevOps概念的普及,使运维发生了根本性的改变。容器集群管理不再是通过低效的SSH来连接服务器,甚至不需要登录服务器就可以完成对服 务器的管理。人们发现,通过容器管理集群可
6、以抛弃传统的“SSH+秘钥”的连接方式来连接服务器,这对大规模集群来说是一个极大的变革。而且在速度上,容器技术在上百台服务器上启动应用只需要一 眨眼的时间,这使得运维的工作大大减轻。 运维和开发在容器时代逐步“融为一体”,形成一个流水线车间的工作环境。这对于软件行业来说无疑是一次巨大的变革。 如果您也对传统的软件开发和运维的烦琐流程感到吃力,又对容器技术感兴趣,那么本书将是很好的入门书籍。 如果您不是职业的开发和运维人员,对Linux也不算熟悉,但属于一个对Docker感兴趣的极客,想通过Docker部署一些复杂的应用,本书也一样适合您。本书虽以Linux为平台介绍Docker的使用,但 是与
7、在Windows和Mac OS平台上的操作基本一致,普通用户完全可以把Docker当做一个“好玩的工具”来使用,体验Docker带来的便捷。 本书特色 适合新手入门。本书在基础方面内容非常详尽,包括镜像的构建、容器的运行监控、网络的管理、仓库的应用、集群的部署等内容,全面、细致地介绍了Docker的基本使用方法与实现原理,适合新 手入门。 应用结合实际。本书在实战应用部分结合实际应用,从不同的角度分析问题并提出对应的解决办法,扩展了很多实用的实战技巧。实战部分根据不同类型的开发环境构建基础开发环境镜像,使读者 可以直接使用Docker进入测试开发,并根据不同类型的应用部署做了详细介绍。 范例丰
8、富。在实战章节中的范例皆由浅入深,全面、实用且不缺乏趣味性,有助于读者了解其内部原理,进而应用到其他项目的思考与开发中。全书的代码均有指明出处以及链接,读者可以通过文 中链接找到源代码。 版本最新。本书使用目前流行的Docker 1.12版本,紧跟Docker更新步伐,介绍了新的Docker Swarm集群管理方式。 本书内容体系 第1篇 容器技术与Docker概念(第13章) 本篇主要介绍了容器技术的发展历史与容器技术的原理,并解释了Docker与其他容器技术的区别,对比了Docker与虚拟机的异同,客观地评价了两者的优缺点。另外,本篇还介绍了Docker分别在 Linux、Windows和
9、Mac OS系统下的安装方法,以及二进制安装方法。 第2篇 Docker基础知识(第410章) 本篇主要介绍了Docker的基本操作及简单应用,包括Docker基础、Docker镜像、Docker file文件、Docker仓库、Docker容器、数据卷的使用方法与原理及网络管理等内容。通过对本篇内容的学 习,读者可以掌握最常用的Docker知识。 第3篇 Docker进阶实战(第1119章) 本篇包含了许多Docker在实际开发中的应用实例,包括操作系统、编排工具Compose、Web服务器与应用、数据库、编程语言、Docker API、私有仓库、集群网络、Docker安全等内容,详细讲解
10、了Docker在容器云环境中的应用。读者通过这部分内容的学习已经完全可以在实际生产环境中应用Docker了。 本书读者对象 Dock开发入门人员; 容器技术爱好者; 各类运维人员; 基于Docker构建云计算平台的技术人员; 大、中专院校的学生; 相关培训学校的学员。 本书配套资源及获取方式 本书涉及的源代码文件等配套学习资源需要读者自行下载。请读者登录机械工业出版社华章公司的网站,然后搜索到本书页面,按照页面上的说明进行下载即可。 本书作者 本书由黄靖钧主笔编写。其他参与编写的人员有张昆、张友、赵桂芹、晁楠、高彩琴、郭现杰、刘琳、王凯迪、王晓燕、吴金艳、尹继平、张宏霞、张晶晶、陈冠军、魏春、
11、张燕、范陈琼、孟春燕、 王晓玲、顼宇峰、肖磊鑫、薛楠、杨丽娜、闫利娜、王韶、李杨坡、刘春华、黄艳娇、刘雁。 本书的顺利出版,要感谢机械工业出版社华章公司各位编辑的辛勤劳动和付出,另外对网络上提供有益资料的众多作者也在此表示感谢。 虽然我们对本书中所述内容都尽量核实,并多次进行文字校对,但因时间所限,加之水平所限,书中疏漏和错误在所难免,敬请广大读者批评指正。 第1篇 容器技术与Docker概念 第1章 容器技术 第2章 Docker简介 第3章 安装Docker 第1章 容器技术 随着容器技术的长足发展,特别是Docker的流行,容器技术已经被越来越多的企业应用于生产环境中。在了解Docker
12、之前,需要先了解一下容器技术。 本章将详细介绍容器技术,逐步认识容器的原理,并尝试启动简单的容器。在学习中了解容器技术的发展历程。 本章主要包括3部分: 认识容器技术,了解容器技术的发展历程。 了解容器技术的概念及基本原理。 了解容器与容器云对软件行业的影响。 1.1 什么是容器 容器技术并不是一个全新的概念,它又称为容器虚拟化。显然它是虚拟化技术中的一种。虚拟化技术目前主要有硬件虚拟化、半虚拟化和操作系统虚拟化等。本书讲述的容器虚拟化属于操作系统虚拟 化,其相较于其他主流虚拟化技术更轻量。 1.1.1 关于虚拟化 虚拟化技术的分类与定义在不同领域有不同理解。对于计算机领域,虚拟化技术主要分为
13、两大类:一类基于硬件虚拟化,另一类基于软件虚拟化。硬件虚拟化并不多见,大都是半虚拟化与软件结合, 应用较为广泛的则是基于软件的虚拟化技术。 基于软件虚拟化又可以分为应用虚拟化(如Wine)和平台虚拟化(如虚拟机)。本书中的容器技术属于操作系统虚拟化,属于平台虚拟化的一种。 从图1.1中可以看到,Docker属于容器技术的一种,而容器技术属于操作系统虚拟化的一种,有时这种分类会因为技术的发展而有变动。 图1.1 容器技术在虚拟化技术的位置 1.1.2 容器的定义 所谓容器,顾名思义就是用来放东西的道具。有意思的是,在Docker刚进入国内时,还有过一段时间在讨论Container这个单词是翻译为
14、“容器”合适,还是翻译为“集装箱”合适。 之所以有人建议翻译为“集装箱”,并不仅仅是因为Docker的图标是一条鲸鱼驮着几个集装箱的形象(如图1.2所示),还因为容器技术本身就是借鉴了工业运输的经验发展而来。 图1.2 容器技术与集装箱 经济学家这样评价工业运输领域的集装箱:“没有集装箱,就不可能有全球化。”在1956年集装箱出现之前,货物运输缺乏标准,成本很高。特别是远洋运输。直到“集装箱”这个概念的出现, 毫不起眼的集装箱降低了货物运输的成本,实现了货物运输的标准化,并以此为基础逐步建立全球范围内的船舶、港口、航线、公路、中转站、桥梁、隧道、多式联运相配套的物流系统,世界经济形态因 此而改
15、变。 同样,软件行业的容器技术也是在尝试打造一套标准化的软件构建、分发流程,以降低运维成本,提高软件安全与运行稳定等。与工业运输的集装箱不同,容器技术要复杂得多。它不仅仅是要打造一 个运输用的“集装箱”,还要保证软件在容器内能够运行,在操作系统上打造一个“独立的箱子”。这需要解决文件系统、网络、硬件等多方面的问题。经过长时间的发展,容器技术已经逐步成熟,并在 Docker的诞生下迎来它的繁荣时代。 读者大可把容器理解为一个沙盒,每个容器是独立的,容器之间可以相互通信。 1.1.3 为什么使用容器 与传统软件行业的开发和运维相比,容器虚拟化可以更高效地构建应用,也更容易管理维护。举个简单的例子,
16、常见的LAMP组合开发网站,按照传统的做法自然是各种安装,然后配置、测试、发 布,中间麻烦事一大堆,相信不少读者深有体会。 当服务器需要搬迁时,往往需要再执行一次以前的部署步骤,极大地浪费了运维人员的时间。最可怕的是搬迁后往往因为一些不可预知的原因而导致软件无法正常运行,只能一头扎进代码中找Bug。 如果使用了容器技术,运维只需要一句简单的命令即可部署一整套LAMP环境,并且不需要复杂的配置与测试。即便搬迁也只是打包传输即可。即使在另一台机器上,软件也不会出现“水土不服”的 情况。这无疑节约了运维人员的大量时间。 而对于开发者来说,一处构建,到处运行,大概是梦寐以求的事情。这也是很多跨平台语言
17、的宣传标语之一。但不管是怎样的跨平台语言,在很多细节上都需要不少调整才能运行在另一个平台上。但 容器技术则不一样,开发者可以使用熟悉的编程语言开发软件,之后用容器技术打包构建,便可以一键运行在所有支持该容器技术的平台上。 容器技术具有更快的交付和部署速度,而且相较于其他虚拟化技术,容器技术更加轻量。 1.2 容器技术的前世今生 如果说工业上的集装箱是从一个箱子开始的,那么软件行业上的容器则是从文件系统隔离开始的。 1.2.1 容器技术的起源 最早的容器技术大概是chroot(1979年)了,它最初是一个UNIX操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,
18、让这些进程只能访问到该目录。直到 今天,主流Linux上还有这个工具。 打开一个终端,输入chroothelp,查看一下这个古老的命令。 $ chroot -help 用法:chroot 选项 新根 命令 参数 或:chroot 选项 以指定的新根为运行指定命令时的根目录。 -userspec=用户:组 指定所用的用户及用户组(可使用“数字”或“名字”) -groups=组列表 指定可供选择的用户组列表,形如组1,组2,组3 -help 显示此帮助信息并退出 -version 显示版本信息并退出 If no command is given, run $SHELL -i (default: /
19、bin/sh -i). 请向bug-coreutilsgnu.org 报告chroot 的错误 GNU coreutils 的主页: GNU 软件一般性帮助: 要获取完整文档,请运行:info coreutils chroot invocation chroot这个命令主要用来把用户的文件系统根目录切换到指定的目录下,实现简单的文件系统隔离。可以说chroot的出现是为了提高安全性,但这种技术并不能防御来自其他方面的攻击,黑客依然可 以逃离设定访问宿主机上的其他文件。 1.2.2 容器技术的发展 2000年,由R 本质上,clone()是一个通用的fork()版本。fork()的功能由flag
20、s参数控制。总的来说,约有超过20个不同的CLONE_*标志控制clone()提供不同的功能,包括父子进程是否共享如虚拟内存、打开的文件 描述符和子进程等资源。如果调用clone()时设置了一个CLONE_NEW*标志,一个与之对应的新的命名空间将被创建,新的进程属于该命名空间。可以使用多个CLONE_NEW*标志的组合。 3使用setns()关联一个已经存在的namespace 当一个namespace没有进程时还保持其打开,这么做是为了后续添加进程到该namespace。而添加这个功能就是使用setns()系统调用来完成,这使得调用的进程能够和namespace关联,docker exec
21、就需要用到这个方法: int setns(int fd, int nstype); fd参数指明了关联的namespace,其指向了procPIDns目录下一个符号链接的文件描述符。可以通过打开这些符号链接指向的文件或者打开一个绑定到符号链接的文件来获得文件描述符。 nstype参数运行调用者检查fd指向的命名空间的类型,如果这个参数等于数,将不会检查。当调用者已经知道namespace的类型时这会很有用。当nstype被赋值为CLONE_NEW*的常量时,内核会检查fd 指向的namespace的类型。 要把namespace利用起来,还要使用execve()函数(或者其他的exec()函数
22、),使得我们能够构建一个简单但是有用的工具,该函数可以执行用户命令。 4使用unshare()在已有进程上进行namespace隔离 unshare()和clone()有些像,不同的地方是前者运行在原有进程上,相当于跳出原来namespace操作,Linux自带的unshare()就是通过调用unshare()这个API来实现的。 $ unshare Usage: unshare options args -h, -help usage information (this) -m, -mount unshare mounts namespace -u, -uts unshare UTS nam
23、espace (hostname etc) -i, -ipc unshare System V IPC namespace -n, -net unshare network namespace For more information see unshare(1). 由于Docker没有使用这个系统调用,所以不展开。除此之外,像fork()这样的函数也可以实现namespace隔离,但并不属于namespace API的一部分。有兴趣的读者可以扫描以下二维码阅读相关资 料。 1.3.2 认识Cgroups Cgrous是Linux内核提供的一种可以限制、记录、隔离进程组(process gro
24、ups)所使用的物理资源(如CPU,内存,I/O等)的机制。最初由Google公司的工程师提出,后来被整合进Linux内核。 Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有Cgroups就没有LXC。 目前,Cgroups有一套进程分组框架,不同资源由不同子系统控制。一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加(attach)到一个层级上 才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群(control groups)都受到这个子系统的控制。 Croups各个子系统作用如下。 Blkio:为块设备设定输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Docker 入门 实战 html
限制150内