云原生时代(四):容器和Docker

上文我们主要介绍了微服务,第四部分我们来讲云原生关键技术之一的容器及Docker。


虚拟化与容器

在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表是VMWare和OpenStack,我在虚拟化与超融合系列里做过介绍。很多人都用过虚拟机,就是在操作系统里安装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。在“子电脑”里,可以和正常电脑一样运行程序,例如微信、Word。“子电脑”和“子电脑”之间,相互隔离互不影响。

虚拟机虽然可以隔离出很多“子电脑”,但占用空间大,启动慢,虚拟机软件可能还要花钱(例如VMWare)。而容器技术恰好没有这些缺点,它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”),启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。虚拟机和以Docker为代表的容器都是虚拟化技术,不过容器属于轻量级的虚拟化。下面是两者的主要对比。

云原生时代(四):容器和Docker_第1张图片


Docker的源起

我们再来看看Docker,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。虽然Docker 把容器技术推向了巅峰,但容器技术却不是Docker发明的。实际上,容器技术连新技术都算不上,因为它的诞生和使用有些年头了,像最早的容器LXC发布于2008年。

Docker本来是做PaaS的公司,原来叫做DotCloud,成立于2010年。但比起Pivotal、Red Hat等著名企业,DotCloud运营并不成功。眼看就要失败的时候,2013年DotCloud决定开源自己的容器项目Docker。但是短短几个月,Docker迅速崛起,吸引大量的开发者使用。随着Docker在开发者中越来越流行,2013年10月,DotCloud公司正式更名为Docker,2014年8月,Docker 宣布把PaaS业务出售,开始专心致志做Docker。

Docker一词意为码头工人,而它的logo则是一个托着许多集装箱的鲸鱼,非常形象:Docker是鲸鱼,而集装箱则是一个个的容器。在Docker的官网上,对于容器有一个一句话的解释“A standardized unit of software”,即“软件的一个标准化单元”。

云原生时代(四):容器和Docker_第2张图片

下面的图片比较了Docker和传统虚拟化的不同之处,容器是在操作系统层面上实现虚拟化,而传统方式是在硬件层面实现,所以导致两者的特性有很大区别,Docker更小更轻。

云原生时代(四):容器和Docker_第3张图片 Docker vs 虚拟化

而Docker与传统的Linux容器也并不完全一致。Docker技术最初是建立在LXC技术之上的,大多数人都把LXC技术与传统的Linux容器联系在一起,尽管后来它已经摆脱了这种依赖性。LXC作为轻量级虚拟化很有用,但它没有很好的开发人员或用户体验。Docker技术带来的不仅仅是运行容器的能力,它还简化了创建和构建容器、加载镜像和镜像版本控制等过程。传统的Linux容器使用可以管理多个进程的init系统,这意味着整个应用可以作为一个整体运行。Docker鼓励将应用程序分解为它们各自的进程,并提供了实现这一点的工具,这种粒度有不少优点。

云原生时代(四):容器和Docker_第4张图片 传统Linux容器 vs Docker

Docker解决的问题

众所周知,Linux上我们不愉快的经历之一就是安装软件。因为系统硬件、操作系统环境不一样,软件包有不同的依赖性,所以必须要安装完软件依赖路径上的所有包,这个链条之长,往往要耗费几小时甚至几天的时间。例如下面的案例,我要安装Docker,系统提示我必须要先安装selinux-policy、selinux-policy-base、selinux-policy-targeted三个相关模块。而我安装selinux-policy的时候,又提示要先安装python;安装python的时候,又提示我要先安装_bz2、_curses、_curses_panel等等模块…

云原生时代(四):容器和Docker_第5张图片

云原生时代(四):容器和Docker_第6张图片

这就是由于环境不统一带来的巨大问题,每天在世界各地的数千万台机器上都会重复上演无数次。那么,如果服务器环境能够标准化,那我们安装任何软件只需要一个版本就可以解决问题。

同时,如果所有服务器环境统一、标准化,还能保留上面的配置、安装的软件和应用,对于我们来讲就更加有用。Docker正是在操作系统之上实现了这个标准化、统一化的运行环境,并且把各种不同的配置和应用存储成镜像,供未来使用。这有点类似于我们熟悉的Ghost或者虚拟光驱,把需要的环境和状态保留为镜像,随时恢复、随时使用。不过Ghost基于操作系统,镜像是一个大文件,管理起来并不方便,恢复速度也很慢,同时不支持跨平台的镜像恢复;而虚拟光驱则是基于软件层面,使用范围有限;而Docker正处于两者之间,能完成更多功能的同时,还实现了镜像的快速加载和运行。

云原生时代(四):容器和Docker_第7张图片 Ghost
云原生时代(四):容器和Docker_第8张图片 虚拟光驱软件

我们在上一部分讲微服务的时候,将其比喻成装配式建筑。把这个比喻用在Docker上的话,我们只要提前设计好模板(配置环境、部署软件或服务),就能在工厂(Docker)里批量化生产(说复制可能更加合适)出楼板、墙板、楼梯、阳台等构件和配件(容器所装载的、不同的微服务),这些构件在建筑施工现场经过组装拼合(API访问),就能成为各种各样的建筑(各种类型的产品和应用)。

云原生时代(四):容器和Docker_第9张图片 装配式建筑由各种构件组成
云原生时代(四):容器和Docker_第10张图片 Docker与各种概念的关系

所以,Docker曾经有一句Slogan叫做“Build once,Run anywhere(搭建一次,随处可用)”。


Docker的核心概念

Docker技术的三大核心概念,分别是:

• 镜像(Image)

• 容器(Container)

• 仓库(Repository)

上面的例子里,设计出来的模板就是Docker镜像,生产(复制)出来的构件就是Docker容器,而Docker仓库则是集中放置管理Docker镜像的地方。

Docker镜像是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

每一种模板(镜像)能够创建出一种构件,但是模板可以由不同的设计师来设计,提供不同用途、不同风格,例如斜顶式阳台、嵌入式阳台、包豪斯风格、蒙德里安风格等等,所有人相互之间可以共享,这就形成了大的公共仓库。

Docker官方提供了Docker Hub来维护管理所有的镜像,只是对于免费用户而言,只能创建一个私有仓库。Docker Hub里提供了大量高质量的官方镜像,例如Oracle、MySQL、redis、Ubuntu、Nginx、python、Docker(Docker in Docker!)等等,开发人员需要一个环境的时候,可以直接到Docker镜像仓库去查找,减少了大量无谓的环境安装工作。

云原生时代(四):容器和Docker_第11张图片 Docker Hub

Docker创始人曾经公布过一个相关数据,Docker Hub里镜像的下载数量从2014年的100万次,3年内猛增到了120亿次。

云原生时代(四):容器和Docker_第12张图片

下面是我从Docker Hub上拉取一个hello world演示镜像,并且运行的示例。

云原生时代(四):容器和Docker_第13张图片


Docker的好处

Docker给我们带来的好处非常多,下面简单列举几点: 

• 更高效的利用系统资源

有了Docker,我们可以在一台服务器上运行很多应用,充分利用硬件资源。例如现在我们有一台Linux服务器,可以构建不同版本的Ubuntu镜像启动,并且为不同的用户分配不同的容器。这样用一台服务器就能虚拟出许多运行不同操作系统的虚拟服务器,而对于用户来说,这些都是透明的。许多公有云采用了容器技术为用户提供服务,所以虚拟化与容器共同成为了现代云计算的基石。

• 更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无须启动完整的操作系统,因此可以做到秒级甚至毫秒级的启动时间,大大的节约了开发、测试、部署的时间。

• 保证环境一致性

开发过程中常见的问题之一是环境一致性问题,由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现,而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,再也不会有在线下开发环境中运行正常,而部署到线上有各种错误的情况了。

• 持续交付和部署

对于开发和运维人员来说,最希望的是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码,无论在多少台服务器中部署都是如此。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见。

• 更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易,Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,其运行结果是一致的,因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

• 提升复用性,降低耦合性,维护和扩展更轻松

Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。安装Docker后,我们可以从Docker Hub上获取各种各样的操作系统镜像,这个操作很简单,只需要拉取相应的镜像到本地然后运行即可。另外我们可以将数据库、Web服务器、缓存服务器运行在不同的容器中,降低了各个服务之间的耦合性、便于扩展,Docker Hub上有各种各样的优秀镜像,我们可以直接拿来使用,不需要自己搭建,应用的部署就像搭积木一样简单。

• 实现沙盒机制,提高了安全性

由于应用运行在容器中,与操作系统隔离开,从而使操作系统基本不可能受到破坏。另外如果应用因为攻击而瘫痪,并不需要重启服务器,直接重启容器或者再启动一个镜像就可以了。


容器与微服务

容器是微服务和云原生架构的最佳实现载体。微服务与容器几乎是完美的搭配。单体式架构(Monolithic)变成微服务架构(Microservices),相当于一个全能型变成N个专能型,每个专能型分配一个隔离的容器,赋予了最大程度的灵活。

云原生时代(四):容器和Docker_第14张图片

服务器势必会走上虚拟化的道路,因为虚拟化有太多的优势,例如前文所说的低成本、高利用率、充分灵活、动态调度等等。而采用容器之后,只需要一台服务器,创建十几个容器,用不同的容器,来分别运行不同用途的服务程序。这些容器,随时可以创建,也可以随时销毁。还能够在不停机的情况下,随意变大,随意变小,随意变强,随意变弱,在性能和功耗之间动态平衡。所以容器化是云计算的终极形态。

如果把传统IT架构比作传统工厂,容器化比作现代化工厂,那么下一部分我们要讲到的Kubernetes则会将现代化工厂进一步提升为智能化无人工厂。那么当Docker遇到Kubernetes之后将会发生什么有趣的事情?让我们拭目以待。

云原生时代(四):容器和Docker_第15张图片

下一期内容为《云原生时代(五):Kubernetes与容器编排之战》。

参考文档:

本文的部分内容参考或者引用以下文章,在此表示感谢,如果有涉及知识产权的问题,请联系我及时修改。

10分钟看懂Docker和K8S

极简Docker和Kubernetes发展史

你可能感兴趣的:(软件架构,投资)