【读书分享】《Docker进阶与实践》读书分享

网友投稿 213 2022-10-22

【读书分享】《Docker进阶与实践》读书分享

感谢杭州地铁六号线,这里有我大把的美好读书时间。

这次要分享的书是《Docker进阶与实践》。

书简介

先上封面:

“太阳底下没有新鲜事”,这句话对于操作系统来说,有着深刻的意义。一个爆红的技术,寻根溯源,你会发现它往往已经在操作系统里潜伏了很久,这种例子俯拾皆是。

​本书简介:​

作者:华为Docker实践小组

在计算机技术日新月异的今天, Docker也算是其中异常璀璨一员了。它的生态圈涉及内核、操作系统、虚拟化、云计算、 DevOps等热门领域,受众群体也在不断扩大。Docker在国内的发展如火如荼,短短一两年时间里就陆续出现了一批关于 Docker的创业公司。作者认为有必要把自己的知识积累和实践经验总结出来分享给广大开发者。除了吸引更多的人投入到 Docker的生态建设以外,也希望通过本书帮助更多的读者更好、更快地掌握 Docker关键技术。

书中故事

这本书着实写的枯燥,但是枯燥的东西是最有用的,我尽量捡一些有趣的东西放在这里。

​故事一 Docker的历史和发展​

虚拟化技术的源头可以追溯到20世纪70年代初期IBM的S370,但直到2003年的SOSP会议上一篇关于虚拟化的论文《 Xen and the Art of Virtualization》引起广泛关注之后,虚拟化才走上发展的快车道。在软件领域,虚拟化技术把 VMware打造成400亿美元量级的行业明星,又在硬件领域搅动了CPU、网络、存储等各个市场,迫使市场上的行业领袖做出相应的创新。现在,计算虚拟化、网络虚拟化、存储虚拟化这些概念已经深入人心。而容器技术也不是全新的概念,系统容器最早可以追溯到20世纪80年代初期的 chroot;打着轻量级虚拟化旗号的商用软件也是在21世纪之初由 virtuozzo提出的。但当时这个技术只是在系统管理员的小圈子里口耳相传,不愠不火地发展着。

自从2013年年初一个叫 dotCloud的PaaS服务供应商将一个内部项目 Docker开源之后,这个名字在短短几年内就迅速成为一个热词。似乎一夜之间,人人都开始谈论 Docker,以至于这家公司干脆出售了其所持有的PaaS平台业务,并且改名为 Docker.Inc,从而专注于Docker的开发和推广。对于 Docker,目前的定义是一个开源的容器引擎,可以方便地对容器进行管理。其对镜像的打包封装,以及引入的 Docker Registry对镜像的统一管理,构建了方便快捷的“Build, Ship and Run"流程,它可以统一整个开发、测试和部署的环境和流程,极大地减少运维成本。另外,得益于容器技术带来的轻量级虚拟化,以及 Docker在分层镜像应用上的创新, Docker在磁盘占用、性能和效率方面相较于传统的虚拟化都有非常明显的提高,所以理所当然, Docker开始不断蚕食传统虚拟化的市场。随着 Docker技术的迅速普及, Docker公司持续进行融资,并且其估值也在不断攀升,同时, Docker公司也在不断地完善 Docker生态圈,这一切使得 Docker正慢慢成为轻量级虚拟化的代名词。在可预见的未来,很可能需要不断地刷新对 Docker的定义。目前 Docker已加入 Linux基金会,遵循 Apache20协议,其代码托管于​​Github​​。

​故事二 容器技术的前世今生​

容器技术,又称为容器虚拟化,它已经集成到了Linux内核中,已经被当作Linux内核原生提供的特性。对于容器,目前并没有一个严格的定义,但普遍认可的说法是它首先必须是一个相对独立的运行环境,在这一点上,有点类似虚拟机的概念,但又没有虚拟机那样彻底。另外,在一个容器环境内,应该最小化其对外界的影响,比如不能在容器中把host上的资源全部消耗掉,这就是资源控制。一般来说,容器技术主要包括 Namespace(主要做访问隔离)和 Cgroup(主要做资源控制)这两个内核特性。最早的容器原型可以简化为对目录结构的简单抽象,如图:

如上图所示为在普通的目录结构中创建一个完整的子目录结构。这种抽象化目录结构的出现最早源于1982年,那时通过chroot技术把用户的文件系统根目录切换到某个指定的目录下,实现了简单的文件系统视图上的抽象或虛拟化。但是这种技术只是提供了有限的文件系统隔离,并没有任何其他隔离手段,而且人们后来发现这种技术并不安全,用户可以逃离设定的根目录从而访问host上的文件。

针对上面提到的安全性问题,在2000年,内核版本2.3.41引入了pivot_root技术,它可以有效地避免chroot带来的安全性问题。今日的容器技术,比如LXC、 Docker等,也都是使用了pivot_root做根文件系统的切换。然而pivot_root仅仅是在文件系统的隔离上做了一些增强,并没有在其他隔离性上有所提高。同样在2000年左右,市场上出现了一些商用的容器技术,比如Linux-VServer和 SWsoft(现在的Odin)开发的 Virtuozzo,虽然这些技术相对当时的XEN和KVM,有明显的性能提升,但是因为各种原因,并未在当时引起市场太多的关注。这里只讨论 Linux系统上的容器技术,同时期还有很多有名的非Linux平台的容器技术,比如 FreeBSD的jail、 Solaris上的Zone等。到了2005年,同样是Odin公司,在 Virtuozzo的基础上发布了OpenVZ技术,同时开始推动OpenVZ中的核心容器技术进入 Linux内核主线,而此时IBM等公司也在推动类似的技术,最后在社区的合作下,形成了目前大家看到的 Cgroup和 Namespace,这时,容器技术才开始逐渐进入大众的视野。

书中硬核

1、Docker架构与功能组件

附上Docker架构图:

​  从Docker架构图可知, Docker并没有传统虚拟化中的 Hypervisor层。因为Docker是基于容器技术的轻量级虚拟化,相对于传统的虚拟化技术,省去了 Hypervisor层的开销,而且其虚拟化技术是基于内核的 Cgroup和 Namespace技术,处理逻辑与内核深度融合,所以在很多方面,它的性能与物理机非常接近。在通信上, Docker并不会直接与内核交互,它是通过一个更底层的工具 Libcontainer与内核交互的。 Libcontainer是真正意义上的容器引擎,它通过clone系统调用直接创建容器,通过pivot_root系统调用进入容器,且通过直接操作cgroupfs文件实现对资源的管控,而Docker本身则侧重于处理更上层的业务。Docker的另一个优势是对层级镜像的创新应用,即不同的容器可以共享底层的只读镜像,通过写入自己特有的内容后添加新的镜像层,新増的镜像层和下层的镜像一起又可以作为基础镜像被更上层的镜像使用。这种特性可以极大地提高磁盘利用率,所以当你的系统上有10个大小为1GB的镜像时,它们总共占用的空间大小可能只有5GB,甚至更少。另外, Docker对 Union mount的应用还体现在多个容器使用同一个基础镜像时,可极大地减少内存占用等方面,因为不同的容器访问同一个文件时,只会占用一份内存。当然这需要使用支持 Union mount的文件系统作为存储的 Graph Driver,比如AUFs和Overlay。

Docker为了实现其所描述的酷炫功能,引入了以下核心概念:

​Docker客户端​​ Docker将客户端和服务器端统一在同一个二进制文件中,不过,这只是对于Linux系统而言的,在其他平台如Mac上, Docker只提供了客户端。Docker客户端一般通过 Docker command来发起请求,另外,也可以通过 Docker提供的一整套 RESTful API来发起请求,这种方式更多地被应用在应用程序的代码中。​Docker daemon​​ Docker daemon也可以被理解成 Docker Server,另外也常常用 Docker Engine来直接描述它,因为这实际上就是驱动整个Docker功能的核心引擎。简单地说, Docker daemon实现的功能就是接收客户端发来的请求,并实现请求所要求的功能,同时针对请求返回相应的结果。在功能的实现上,因为涉及了容器、镜像、存储等多方面的内容daemon,内部的机制会复杂很多,涉及了多个模块的实现和交互。​Docker容器 在功能上, Docker通过 Libcontainer实现对容器生命周期的管理、信息的设置和查询,以及监控和通信等功能。而容器也是对镜像的完美诠释,容器以镜像为基础,同时又为镜像提供了一个标准的和隔离的执行环境在概念上,容器则很好地诠释了 Docker集装箱的理念,开发及运维人员在转移和部署应用的时候,不用关心容器里装了什么软件,也不用了解它们是如何配置的。​Docker镜像​​ 与容器相对应,如果说容器提供了一个完整的、隔离的运行环境,那么镜像则是这个运行环境的静态体现,是一个还没有运行起来的运行环境。相对于传统虚拟化中的ISO镜像, Docker镜像要轻量化很多,它只是一个可定制的 rootfs。Docker镜像的另一个创新是它是层级的并且是可复用的。Docker镜像通常是通过 Dockerfile来创建的, Dockerfile提供了镜像内容的定制,同时也体现了层级关系的建立。另外 Docker镜像也可以通过使用 docker commit这样的命令来手动将修改后的内容生成镜像。​Registry​​ Registry是一个存放镜像的仓库,它通常被部署在互联网服务器或者云端。在镜像的传输过程中,Registry就是这个传输的重要中转站。假如我们在公司将—个软件的运行环境制作成镜像,并上传到 Registry中,这时就可以很方便地在家里的笔记本上,或者在客户的生产环境上直接从 Registry上下载并运行了。

容器的核心技术是 Cgroup+ Namespace,对于 Linux容器的最小组成,可以由以下公式来表示:

容器= cgroup+ namespace+ rootfs+容器引擎(用户态工具)

其中各项的功能分别为:

Cgroup:资源控制Namespace:访问隔离rootfs:文件系统隔离容器引擎:生命周期控制

2、Docker安全

Docker自诞生以来,其安全性问题一直饱受诟病。随着 Docker的发展,它自身面临的挑战也越来越大,安全问题也越来越受到人们的关注。大约在2014年6月,网上一篇关于 Docker安全的博客显示Docker的容器已经被攻破,并且能够遍历宿host的文件了,这对Docker的商业化造成了很大的杀伤力。可见,安全问题必须高度重视。Docker的安全性主要体现在如下几个方面:

Docker容器的安全性:这是指容器是否会危害到hos域或其他容器;镜像的安全性:用户如何确保下载下来的镜像是可信的、未被篡改过的;Docker daemon的安全性:如何确保发送给 daemon的命令是由可信用户发起的。用户通过CLI或者 REST API向 daemon发送命令以完成对容器的各种操作,例如通过 docker exec命令删除容器里的数据,因此需要保证 client与 daemon的连接是可信的。容器安全性问题的根源在于,容器和host共用内核,因此受攻

容器安全性问题的根源在于,容器和host共用内核,因此受攻击面特别大,没有人能信心满满地说不可能由容器入侵到host。共用内核导致的另一个严重问题是,如果某个容器里的应用导致Linux内核崩溃,那么整个系统都会崩溃。在这方面,虚拟机的表现就相对好多了,虚拟机与host的接口是非常有限的,攻击面自然也就非常小了,并且虚拟机崩溃一般不会导致host崩溃。在共用内核这个前提下,容器主要通过内核的 Cgroup和Namespace这两大特性来达到容器隔离和资源限制的目的。目前Cgroup对系统资源的限制已经比较完善了,但 Namespace的隔离还是不够完善,只有PID、 mount、 network、UTS、PC和user这几种。

而对于未隔离的内核资源,容器访问时也就会存在影响到host及其他容器的风险。

(1)Cgroup用于限制容器对CPU、内存、块设备I/O等关键资源的使用,防止某个容器由于过度使用资源,导致hos或者其他容器无法正常运作;

(2)Linux系统中有一个ulimit指令,可以对一些类型的资源起到限制作用,包括 core dump文件的大小、进程数据段的大小、可创建文件的大小、常驻內存集的大小、打开文件的数量、进程栈的大小、CPU时间、单个用户的最大线程数、进程的最大虚拟内存等;

(3)在接入容器隔离不足的情况下,将受信任的和不受信任的容器组网在不同的网络中,可以减少危险;

(4)如果将容器运行在全虛拟化环境中(例如在虚拟机中运行容器),这样就算容器被攻破,也还有虚拟机的保护作用。目前一些安全需求很高的应用场景采用的就是这种方式,比如公有云场景;

(5)Docker可信镜像及升级框架使得我们可以校验镜像的发布者,当发布者将镜像push到远程的仓库时, Docker会对镜像用私钥进行签名,之后其他人pull这个镜像的时候, Docker就会用发布者的公钥来校验该镜像是否和发布者所发布的镜像一致,是否被篡改过,是否是最新版;

(6)日志驱动使得用户可以将日志直接从容器输出到如 syslogd这样的日志系统中,通过 docker-help可以看到Docker daemon支持 log-driver参数,目前支持的类型有none、json-file、syslog、gelf和 fluentd,默认的日志驱动是json-file;

(7)在使用容器时,应该注意监控容器的信息,若发现有什么不正常的现象,就能采取措施及时补救。这些信息包括容器的运行状态、容器的资源使用情况等;

(8)Docker可以设置容器的根文件系统为只读模式,只读模式的好处是,即使容器与host使用的是同一个文件系统,也不用担心会影响甚至破坏host的根文件系统。但这里需要注意的是,必须把容器里进程remount文件系统的能力给禁止掉,否则在容器内又可以把文件系统重新挂载为可写。甚至更进一步,用户可以禁止容器挂载任何文件;

(9)从2.2版开始,Linux有了 capability的概念,它打破了 Linux操作系统中超级用户/普通用户的概念,让普通用户也可以做只有超级用户才能完成的工作。 capability可以作用在进程上,也可以作用在程序文件上。它与sudo不同,sudo可以配置某个用户可以执行某个命令或更改某个文件,而 capability则是让某个程序拥有某种能力。

(10)等等,不说了太多了。

3、Docker集群管理

可以利用Docker社区中提供的三大编排工具:Compose、Machine和Swarm 进行 Docker的集群管理:

Docker Compose是用来组装多容器应用的工具,可以在Swarm集群中部署分布式应用;Docker Machine是支持多平台安装 Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装 Docker;Docker Swarm是 Docker社区原生提供的容器集群管理工具;

这里也不展开了,重点划一下,还有Kubernetes。

书中案例

“硬核” 模块太无聊,只怪该书太硬核,我也只是捡了部分东西,还有好多硬核还是需要你自己去拜读本书。

1、案例一 Docker测试

实践了Docker测试用例的执行。

2、案例二 参与Docker开发

Docker当前处于快速成长期,各种新的特性不断加入,也有各种问题不断出现,同时很多现有的功能也有待完善,而这正好给全世界的 Docker爱好者、使用者、开发者提供了大量的参与 Docker开发的机会。这里介绍了如何改进 Docker、搭建 Docker开发环境、参与社区交流。

今天的读书分享就到这了,咱们下本再见~

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)
下一篇:反欺诈(反欺诈模型)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~