何为云?
技术的变革,一定是思想先行,云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。叶秋学长理解的云原生就是用来降本增效的,如下图:
云原生的应用程序是什么?
叶秋学长认为符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。
容器和Docker是什么?
虚拟化与容器
在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表是VMware和OpenStack。很多人都用过虚拟机,就是在操作系统里安装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。在“子电脑”里,可以和正常电脑一样运行程序,例如微信、Word。“子电脑”和“子电脑”之间,相互隔离互不影响。
虚拟机虽然可以隔离出很多“子电脑”,但占用空间大,启动慢,虚拟机软件可能还要花钱(例如VMware)。而容器技术恰好没有这些缺点,它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”),启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。虚拟机和以Docker为代表的容器都是虚拟化技术,不过容器属于轻量级的虚拟化。下面是两者的主要对比。
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的核心概念
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的好处
Docker给我们带来的好处非常多,下面简单列举几点:
• 更高效的利用系统资源
有了Docker,我们可以在一台服务器上运行很多应用,充分利用硬件资源。例如现在我们有一台Linux服务器,可以构建不同版本的Ubuntu镜像启动,并且为不同的用户分配不同的容器。这样用一台服务器就能虚拟出许多运行不同操作系统的虚拟服务器,而对于用户来说,这些都是透明的。许多公有云采用了容器技术为用户提供服务,所以虚拟化与容器共同成为了现代云计算的基石。
• 更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无须启动完整的操作系统,因此可以做到秒级甚至毫秒级的启动时间,大大的节约了开发、测试、部署的时间。
• 保证环境一致性
开发过程中常见的问题之一是环境一致性问题,由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现,而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,再也不会有在线下开发环境中运行正常,而部署到线上有各种错误的情况了。
• 持续交付和部署
对于开发和运维人员来说,最希望的是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码,无论在多少台服务器中部署都是如此。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见。
• 更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易,Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,其运行结果是一致的,因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
• 提升复用性,降低耦合性,维护和扩展更轻松
Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。安装Docker后,我们可以从Docker Hub上获取各种各样的操作系统镜像,这个操作很简单,只需要拉取相应的镜像到本地然后运行即可。另外我们可以将数据库、Web服务器、缓存服务器运行在不同的容器中,降低了各个服务之间的耦合性、便于扩展,Docker Hub上有各种各样的优秀镜像,我们可以直接拿来使用,不需要自己搭建,应用的部署就像搭积木一样简单。
• 实现沙盒机制,提高了安全性
由于应用运行在容器中,与操作系统隔离开,从而使操作系统基本不可能受到破坏。另外如果应用因为攻击而瘫痪,并不需要重启服务器,直接重启容器或者再启动一个镜像就可以了。
容器与微服务
容器是微服务和云原生架构的最佳实现载体。微服务与容器几乎是完美的搭配。单体式架构(Monolithic)变成微服务架构(Microservices),相当于一个全能型变成N个专能型,每个专能型分配一个隔离的容器,赋予了最大程度的灵活。