干货丨Docker为何这么火
Posted 中兴开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货丨Docker为何这么火相关的知识,希望对你有一定的参考价值。
作者简介
因喜爱Python而接触到OpenStack,进而对云计算、虚拟化和开源产生兴趣,本篇文章是个人学习docker的入门心得总结,希望能对初学者有所启发和帮助。
作为云计算IT圈的人, 如果今天你还不知道Docker的话,那就太OUT了!作为一个2013年正式诞生的开源项目, Docker的发展速度和火爆程度着实令人惊叹.
然而Docker除了所使用的开发语言Go比较新之外,它的本质——Linux容器,却并不能算是一个很新的技术, 那么到底为什么Docker能让容器技术焕发新的生命力,并一发不可收拾,形成了席卷整个IT界的新浪潮呢?
本文不去介绍Docker的技术细节,而是试图从容器的发展,Docker的特性,以及当前IT发展的背景去说明,为什么Docker可以这么火。
容器简史
最早的容器技术雏形可以追溯到1979年UNIX系统中出现的chroot系统调用。chroot,即change root directory,将系统的根目录设定到指定的目录,从而限制了用户的活动范围,为进程提供隔离的磁盘空间。
进入到2000年之后, 一种使用Jail机制的操作系统级别的虚拟化技术在FreeBSD引入,第二年Linux系统出现类似的Linux VServer。
2004年Solaris系统为x86和SPARC系统引入了Solaris Containers,2005年,Linux系统中也出现一个类似的技术OpenVZ。
2006年Google的工程师以“Process containers”为名为Linux内核开发相关特性以做到进程的资源隔离,后来因为container在Linux语境里过于宽泛,为避免混乱,在2007年改名为“Control Groups”,简称CGroups,并合入到内核版本2.6.24。
2008年,一个Linux容器的管理工具 LXC发布。LXC的底层实现依靠的是Linux内核的特性,主要就是CGroups和Linux Namespaces。LXC提高的库liblxc提供了多种语言绑定的API,包括Python,Ruby,Go等。
2010年,Docker的前身dotCloud公司成立。dotCloud主要是基于 PaaS 平台为开发者或开发商提供技术服务,其后台的技术,也就是Docker的原型,实际也是以LXC为基础的。
2011年,另一个基于LXC,使用Ruby开发的容器技术Warden由CloudFoundry公司创建。
2013年,Google开源了自己的容器技术,LMCTFY:Let Me Contain That For You。同年,dotCloud公司的创始人在PaaS平台不温不火的情况下决定另辟蹊径,将核心引擎开源,并命名为Docker。
2014年,CoreOS发起了类似Docker的实现Rocket,并声称解决了Docker中已发现的若干缺陷。
2016年,微软也终于按捺不住,要推出基于Windows的容器: Windows Containers
容器VS虚拟机
容器本质上是在操作系统上对进程做了环境隔离和资源限制,所以说是操作系统级别的虚拟化。
相比较于虚拟机技术,占用的资源更少,启动也更迅速。可以在单个宿主机上实现更高密度的部署。
但是容器和虚拟机并不是互斥的,在某些方面容器可以提供更高效的方案,但容器并不能完全取代虚拟机。
实际应用中,还可以将容器部署在虚拟机上,提供更多的灵活性。
Docker相比LXC的改进
由容器的发展历史可以看出,Docker使用的容器技术最早也是基于LXC,同期也有类似的技术出现,为什么Docker就能脱颖而出呢?
个人尝试分析,大概有以下几点:
相比较以前复杂的管理工具,提供了简洁易用的命令行和API
使用新的Go语言开发,在开源社区容易吸引大家关注和兴趣
基于联合文件系统的镜像分层技术,加上在线的Docker Hub服务,容器的迁移更方便快速
遵从的一个容器只包含一个进程的设计思想,贴合时下流行的微服务架构
Docker的镜像分层
Docker的若干改进中,基于联合文件系统的镜像分层技术无疑是最大亮点。
镜像的分层结构,使得Docker相对于LXC等传统容器,更加的轻量化,也更加的标准化,主要表现在:
基于分层提供的镜像仓库服务,使得用户管理镜像就像通过Git管理代码一样,直接pull/push即可搞定。
还可以使用Dockerfile文件来构建镜像,使得镜像的管理更加规范和标准。
这些都大大加强了Docker的易用性。
下面我们首先从Linux的启动来看看镜像是如何分层的。
正常的Linux系统分为bootfs和rootfs两个文件系统,bootfs (boot file system) 主要包含 bootloader 和 kernel, bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被umount了. rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc,/bin, /etc 等标准目录和文件。
对于不同的linux发行版, bootfs基本是一致的, 但rootfs会有差别。
Docker镜像的最底层,也就是基础镜像,只包含对应不同发行版(如Debian)的rootfs,直接使用宿主机的bootfs。当创建容器时,在镜像上面新建一个Copy On Write的可写层作为容器层,而下面的镜像层是只读的。
容器层在写入数据后,可以将其commit以生成新的镜像层,这个新的镜像层加下面的基础镜像层就构成一个新的镜像。依次类推,形成 “一个可写的容器层+若干堆叠的镜像层” 这样的结构。
镜像分层后的最大的优势就是镜像的更新和迁移不再需要传输整个文件,只需要将更新的层传递即可,大大减少了数据传输量。同时,在同一个宿主机上的容器和上层镜像,底层相同的镜像层次是共享的,大大减少了本地的存储空间占用。
云计算、微服务架构和DevOps
在容器技术发展的这段时间内,IT界同时正在经历着更大的革命。
2006年,亚马逊推出了弹性计算云(Elastic Computing Cloud,EC2)服务,正式开启了云计算时代。2010年OpenStack项目启动,云计算的发展进入到如火如荼的阶段。
同时,智能手机快速普及,手机APP呈现爆炸性地增长,传统的应用软件开发模式已经难以应付高度竞争、快速变化的互联网市场需求。
在这样的背景下,在Web服务的架构设计领域,一种新型的系统架构正在逐渐流行起来,这就是微服务架构;同时一种新的软件开发交付模式 DevOps 也在逐渐变的主流。
微服务架构相比较传统的整体化软件架构,将一个大的应用系统拆分为若干个微小的自治服务。
这些服务通常只关注某个特定的目标,每个服务都是独立的开发、测试和部署,服务之间使用约定的API(最常用的就是REST)通过网络进行通信。
而DevOps则是致力于促进开发、运营和质量保障(QA)部门之间的沟通、协作,以达成持续集成(CI)和持续交付(CD)的目标。
这3者之间的关系可以说是既互相支持,也互相促进:
微服务的关键字是微,也就是小,DevOps的关键字是快,只有更小的架构才有可能实现更快的交付;同时也只有更快的交付,才有可能应付服务数量增加带来的配合问题。
而如何实现又小又快,都离不开云计算的支持,只有计算资源可以随时按需地获取的情况下,才有可能实现又快速获取,又不至于浪费硬件资源。
Docker的发展情况
Docker虽然面世时间只有3年多,却发展迅猛,每年都有大的变化。
仅就其核心的容器管理部分来说,2013年刚出道时使用的还是LXC,2014年即推出了独立开发的libcontainer作为替代。2015年则向标准化方向更进一步,将libcontainer贡献给RedHat发起,多家公司参与的容器标准化组织OCI(Open Container Initiative),成立了独立于公司或平台的新的容器管理工具开源项目:runC。并且在Docker 1.11版本中已经开始使用runC。Docker已经从容器的后来者,发展成为事实上的标准,以及未来的领导者。
Docker的应用前景
根据最新的Docker2016年度调查显示,Docker正在帮助,并且将来会帮助更多的企业实现现代软件发展的三大策略:向云端迁移、向微服务转型、向DevOps实践转变。
Docker 为软件供应链提供了应用程序开发的敏捷性,可控性和可移值性。
结束语
虽然目前看来Docker技术在生产环境的应用还比较有限,但是相信在不远的未来,会有越来越多软件应用转向Docker。事实上,这种转变每天都在发生。
拥抱Docker, 拥抱未来,你是否已经做好准备了呢?
以上是关于干货丨Docker为何这么火的主要内容,如果未能解决你的问题,请参考以下文章