1.容器化技术概述
容器化技术可以帮助我们对应用更快地进行标准化部署。
1.1 物理机时代
缺点:
部署慢:如果想部署Javaweb项目,物理服务器——》操作系统——》JDK——》Tomcat——》Javaweb项目
成本高:普通的PC Server服务器至少上万,一般在3-5万的价格
资源浪费:如果一个应用是计算密集型的,那么它对CPU要求比较高,但是对磁盘和内存要求较低,在这种情况下,闲置的磁盘和内存资源无法被有效利用,从而造成资源的浪费。
难以扩展和迁移:物理机可以做一些简单的扩展,比如增加内存条或者磁盘。但如果将一个应用从原先的windows服务器迁移到Linux服务器,就会出现很多问题,从而造成应用难以扩展和迁移。
受限于硬件:比如PC机常用的CPU架构有很多种,如x86架构、arm架构。基于不同架构开发的应用,在其他架构中可能不兼容,无法运行。
1.2 虚拟机化时代
在一台物理机上,通过硬件底层的虚拟化支持,可以虚拟出很多台虚拟机。每台虚拟机都可以看成一台独立的主机,同样拥有操作系统、CPU、内存、硬盘,然后再虚拟机的操作系统之上安装对应的软件。虚拟化技术可以让物理机的硬件资源得到更充分的利用。
优点:
多部署:在一台物理机上,可以创建多台虚拟机(可以利用如VMware软件),创建的每个虚拟机彼此间相互独立,每台虚拟机都拥有属于自己的软件和硬件资源,而且这些资源是彼此相互隔离的,其中一台虚拟机出现了问题,不会对其他虚拟机产生影响。
资源池:比如一台物理机有8核、16G内存、1T硬盘,Hypervisor(如VMware产品)可以将这些当作共有的资源。当我们创建新的虚拟机时,为了支持软件的运行,由Hypervisor分配指定的资源(2核、4G内存、30G硬盘)。
资源隔离:通过Hypervisor为指定的VM分配了资源以后,这些资源就由该VM独享,其他VM不会抢占它的资源。
易扩展:当一个VM虚拟机内存资源不够时,只要资源池的内存足够,就可以通过Hypervisor很方便的(比如再分配2G内存)增加新的内存。
缺点:
部署麻烦:每个Vm虚拟机都需要安装操作系统,如Linux、Windows。如果只是安装一个轻量级应用,每次创建一个虚拟机还需要安装操作系统,这种方式还是非常麻烦的。
1.3 容器化技术
容器化技术比虚拟机更灵活、更轻便、更小巧。虚拟化技术底层需要安装操作系统,而容器化技术则不需要安装操作系统,而是直接构建在主操作系统之上。
解决了什么问题?
(1)应用程序运行时隔离问题 容器,即Container,可翻译成集装箱。在港口用集装箱把货物封装起来,然后通过货轮从海上运输到另一个港口,再在港口卸载后通过大货车运送到目的地。如此货物便可在任何地方流转时,都封装在集装箱,无需根据是在货轮还是大货车而对货物重新装配。
软件的容器也是这个原理。它封装的是软件的运行环境。容器本质是Linux里的进程,但容器通过Namespace和Cgroups,可有自己的root文件系统、网络配置、进程空间,甚至自己的用户ID空间,如此容器里的进程就像运行在宿主机上的另外一个单独的os内,从而实现与宿主机os里运行的其他进程隔离。
(2)微服务运行环境保持一致的问题 Docker镜像解决了DevOps中微服务运行的环境难以在本地环境、测试环境以及线上环境保持一致的难题。如此一来,开发就可以把在本地环境中运行测试通过的代码,以及依赖的软件和操作系统本身打包成一个镜像,然后自动部署在测试环境中进行测试,测试通过后再自动发布到线上环境上去,整个开发、测试和发布的流程就打通了。
(3)服务运行环境迁移问题 在使用Docker镜像时并非把业务代码、依赖的软件环境以及os直接打包镜像,而是利用Docker镜像的分层机制,在每层编写Dockerfile逐层打包镜像。虽然不同微服务依赖的软件环境不同,但还是存在相同,因此打包Docker镜像时,可以分层设计、逐层复用,减少每层镜像文件大小。
(4)开发效率的问题 在不同环境中, 开发者的共同目标主要有两个:一是让开发环境尽量贴近生产环境,二是快速搭建开发环境。而开发环境的机器通常内存比较小,之前使用虚拟机的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来,从而大大提升开发效率。
应用场景:
(1)节省项目环境部署时间
Docker将整套项目打包封装起来,可以使用Docker Compose编排工具一键部署,无需人工慢慢实施部署。
(2)环境一致性
Docker可以将项目环境打包成镜像,从而保证开发、测试、运行环境一致,避免了环境不一致造成的项目无法运行的问题。
(3)持续集成 一个项目版本快速迭代的测试场景,需要一个合理的CI(持续集成)/CD(持续部署)环境支撑。CI/CD是一个周期性自动化项目测试流程,包括构建、部署、测试、发布等工作,很少需要人工干预。
(4)微服务 微服务是近几年来IT圈内谈论比较多的一个名词,意义也很简单:尽可能细粒度拆分业务程序架构,由多个独立服务组成业务系统。Docker的容器设计原则:一个容器一个服务,容器之间相互隔离,不妨试想一下,如果容器作为这些独立服务的部署单元,是不是有点恰到好处呢?
(5)弹性伸缩 说到弹性伸缩,通常是集群模式下存在。当适用Docker技术以后,这种弹性伸缩的单元就是云主机之上的容器了。容器集群化管理已经有成熟的解决方案,比如:官方的Swarm,谷歌的K8S 由于Docker容器快速启动特性,可以很快速的启动几十个、上百个容器来提供更多并发和资源利用率(如果宿主机资源不够,还需要加主机到集群中)。
2.Docker技术概述
2.1 docker定义
Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的Linux机器上,也可以实现虚拟化。Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性。
Docker诞生于2013年初,目前有两个版本,Community Edition(CE,社区版)和Enterprise Edition(EE,企业版)。其中Docker社区版是免费开源的,对于个人和小团队来说是比较理想的选择;Docker企业版则是收费的,是专门为企业和大型IT团队提供的,用于要求比较严格的商业应用中。
对于初学者而言,使用Docker社区版就足以满足需求。
2.2 docker作用
Docker是提供应用打包,部署和运行应用的容器化平台。
2.3 docker 特点
(1)更快速的交付和部署
开发者可以使用一个标准的Docker镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器以及快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器轻,且启动速度快,可以大量地节约开发、测试和部署的时间。
(2)更高效的虚拟化
Docker容器在运行时,不需要额外的虚拟机程序的支持。由于它是内核级的虚拟化,所以可以实现更高的性能和效率。
(3)更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑和服务器等。这种良好的兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台,十分有利于应用的迁移和扩展。
(4)更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
2.4 docker的发展历程
阶段1:
2008年,Solomon Hykes(所罗门·海克斯) 和他的朋友 Kamel Founadi、Sebastien Pahl 共同创立了一家名为 DotCloud 的公司。2010年,dotCloud获得了创业孵化器Y Combinator的支持,并开始吸引到一些真正的投资。
阶段2:
2013年3月20日,dotCloud发布了 Docker 的首个版本,并将Docker源码进行开源。
2013年9月 红帽公司成为Docker的主要合作伙伴,利用Docker来驱动他的OpenShift云业务。随后,谷歌、亚马逊也迅速的在其云服务平台提供了Docker的支持。主流云厂商的加入,加速Docker的发展进度。
阶段3:
2014年6月的DockerCon大会上Docker正式发布了Docker 1.0 版本。
2014年8月份,Docker Inc宣布将用于PaaS业务服务的DotCloud软件出售给德国柏林的PaaS服务厂商CloudControl,自此以后,DotCloud正式的和Docker分道扬镳了。
2014年12月举行的DockerConEU大会上,Docker Swarm 和Docker Machine同时面世。Docker Swarm是一个Docker集群管理工具,而Docker Machine是部署Docker主机的命令工具。
阶段4:
2015年6月,由Docker、IBM、微软、红帽及Google等厂商所组成的开放容器项目OCP联盟成立,该项目旨在建立软件容器的通用标准。
阶段5:
在2016年,人们认识到容器技术本身的价值时在于容器的编排,而此时的Docker项目令人惊讶的放弃了Swarm项目,而是想将容器的编排和集群的管理功能添加到Docker项目当中。
阶段6:
2017 年于 Austin 举办的 DockerCon 上开源Docker项目正式命名为 Moby 项目。与此同时,将Docker本身拆分为Docker-CE免费版和Docker-EE商业版。
Docker-CE目前是docker公司维护的开源项目,是一个基于Moby项目的免费的容器产品。
Docker-EE目前是docker公司维护的闭源项目,是docker公司的商业产品。
阶段7:
2018年3月 Docker 公司创始人Solomon Hykes 在 Docker 博客上宣布已正式从 Docker 公司离职,不再担任公司的日常运作工作。
阶段8:
2019年容器市场基本趋于稳定,一切都向着优化改进方向发展。Docker公司是底层容器引擎及运行时的。容器的编排进过几轮的激烈竞争,基本是GOOGLE的Kubernetes一家独大。
2.5 Docker架构
架构中主要的模块有:Docker Client、DockerDaemon、Docker Registry以及Docker Container。对用户而言,Docker Client是与Docker Daemon建立通信的最佳途径。用户通过Docker Client发起容器的管理请求,请求最终发往Docker Daemon。Docker Daemon作为Docker架构中的主体部分,首先具备服务端的功能,有能力接收Docker Client发起的请求;其次具备Docker Client请求的处理能力。
1.Docker Client
Docker Client是Docker架构中用户与Docker Daemon建立通信的客户端。在一台安装有Docker的机器上,用户可以使用可执行文件docker作为Docker Client,发起众多Docker容器的管理请求。
2.Docker Daemon
Docker Daemon是Docker架构中一个常驻在后台的系统进程。所谓的“运行Docker”,即代表运行Docker Daemon。总之,DockerDaemon的作用主要有以下两方面:
(1)接收并处理Docker Client发送的请求。
(2)管理所有的Docker容器。
镜像:是一个只读文件,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”。
容器:是镜像的实例,是有Docker来负责创建,容器之间彼此隔离。
3.Docker Registry
Docker Registry是一个存储容器镜像(Docker Image)的仓库。容器镜像(Docker Image)是容器创建时用来初始化容器rootfs的文件系统内容。Docker Registry将大量的容器镜像汇集在一起,并为分散的Docker Daemon提供镜像服务。
Docker的运行过程中,有三种情况可能与Docker Registry通信,分别为搜索镜像、下载镜像、上传镜像。这三种情况所对应的Job名称分别为search、pull和push。