一、什么是容器?
容器是一种自包含、轻量级、可移植的软件打包技术,它使得应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云上运行。
所谓的"自包含"是指容器镜像中完整的包含了应用程序自身及其所依赖的环境(包括库、其它软件、配置等),这样就解决了软件运行因为运行环境不一致而导致的各种问题,这就使得容器无需修改就可以在几乎任何地方以相同的方式运行。
使用了容器后你就再也不用担心像原先不使用容器那样因为运行环境的差异而导致软件运行出现各种问题,例如如下这样的经典问题------这个程序明明在开发环境跑的好好的,为什么在生产环境就跑不起来了?
图片
所谓的"轻量级"是指容器是一种进程级的轻量级虚拟化方案,它利用了Linux操作系统级别的命名空间(namespaces)、控制组(cgroups)等技术实现了容器与容器间的隔离和容器所使用资源(CPU、内存、I/O)数量的控制。
跟传统的使用虚拟机(如VMWare、KVM、Xen等)的虚拟化技术相比,容器不需要像虚拟机那样安装Guest操作系统,所有容器共享同一个Host操作系统,这使得容器的镜像在体积上要比传统虚拟机镜像小很多。
另外,因为不需要安装Guest操作系统,启动容器时也不需要像虚拟机那样启动整个Guest操作系统,所以跟传统虚拟机相比,容器的部署和启动速度更快,开销更小。
图片
所谓的"可移植"是指容器能够运行在几乎所有的操作系统上。例如,如果你的容器镜像不依赖于特定的Linux内核版本,那么你的容器镜像就能够在任何一台运行Linux的机器上运行。
当然,这里有两个限制:
1、如果一个容器化的应用需要一个特定的Linux内核版本,那它就可能不能在每台运行Linux的机器上运行;
2、一个在特定硬件架构上编译的容器化应用,只能在有相同架构的机器上运行。例如,不能将一个x86架构编译的应用容器化后,又期望它能运行在ARM架构的机器上。
容器本质上就是操作系统上运行的进程*。
容器跟我们大家所熟知的操作系统上运行的普通进程相比区别在于容器的静止态并不是二进制可执行文件,而是镜像。
容器的镜像由两部分组成:(1)应用程序自身;(2)依赖:比如应用程序需要的库或其它软件及配置。
*:进程是指二进制可执行文件运行时操作系统对其运行态的一种抽象,即二进制可执行文件的运行态就是进程,进程的静止态就是二进制可执行文件。
二、容器技术介绍
容器技术的一个流行实现是Docker,它提供了一套工具和平台来构建、发布和运行容器化应用程序。
此外,还有Kubernetes等容器编排工具,用于管理大规模的容器部署。
容器技术的特点
容器的特点,其实拿它与传统虚拟化技术对比就清楚了。
传统虚拟化技术是一种基于硬件的抽象,宿主机上配置一台虚拟机,等于购买了一台新的计算机。静态分配硬件资源,无法实现硬件资源的最大化。特别是在进行集群开发的时候,服务器需要配置到多个机器上,每个机器的配置都要一步步的完成。而进行更新后,也需要一台台更新,而系统的配置是程序开发人员、测试人员和运维人员都需要完成的工作。工作量大且复杂,还会因为操作系统其他底层配置的不同而可能出现未知的问题。
容器技术则是基于操作系统的抽象,只对操作系统必要的接口、配置文件进行虚拟化,构造了一种轻量的虚拟环境。极大地增加了配置效率。动态分配硬件资源,提高了资源利用率。
图片
传统的虚拟化技术,创建环境、部署应用、应用的移植性很繁琐,比如把vmware的虚拟机迁移到KVM里就很繁琐,需要做镜像格式的转换。有了容器技术以后,可以轻松实现实现各环境灵活迁移和部署,容器技术的特点可以总结为以下几点:
1.极其轻量:只打包了必要的Bin/Lib。
2.秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间就可以完成。
3.易于移植:一次构建,随处部署,实现各环境灵活迁移,Docker镜像可在所有主流 Linux 发行版、Microsoft 平台灵活迁移,极大减轻了开发和部署工作量,提高开发效率。
4.安全隔离:容器会在操作系统级别虚拟化 CPU、内存、存储和网络资源,为开发者提供在逻辑上与其他应用相隔离的沙盒化操作系统接口。
5.弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好用的容器管理平台有着非常强大的弹性管理能力,同时减少资源的消耗冲突。
6.版本控制:每个容器的镜像都有版本控制,可以对历史版本进行追踪和差异比较。
图片
三、容器的关键技术
1、镜像
容器的镜像通常包括操作系统文件、应用本身的文件、应用所依赖的软件包和库文件。为了提高容器镜像的管理效率,容器的镜像采用分层的形式存放。容器的镜像最底层通常是Linux的rootfs和系统文件,再往上则是各种软件包层。这些文件层在叠加后成为完整的只读文件系统,最终挂载到容器里面。在运行过程中,容器应用往往需要写入文件数据,容器引擎为此需再创建一个可写层,加在镜像的只读文件系统上面。使用分层的容器镜像之后,镜像的下载和传输更加便利,只需要在宿主机上把缺少的镜像文件层次下载即可,无需整个镜像传送。
2、容器编排
容器编排工具通过对容器服务的编排,决定容器服务之间如何进行交互。容器编排工具一般要处理以下几方面的内容:
· 容器的启动。选择启动的机器、镜像和启动参数等。
· 容器的应用部署。提供方法对应用进行部署。
· 容器应用的在线升级。提供方法可以平滑地切换到应用新版本。
容器的编排一般是通过描述性语言YAML或者JSON来定义编排的内容。目前主要的编排工具有Docker compose和基于Google的Kubernetes helm等。
3、容器集群
容器集群是将多台物理机抽象为逻辑上单一调度实体的技术,为容器化的应用提供资源调度、服务发现、弹性伸缩、负载均衡等功能,同时监控和管理整个服务器集群,提供高质量、不间断的应用服务。容器集群主要包含以下技术:
· 资源调度:主要以集中化的方式管理和调度资源,按需为容器提供 CPU、内存等资源。
· 服务发现:通过全局可访问的注册中心实现任何一个应用能够获取当前环境的细节,自动加入到当前的应用集群中。
· 弹性伸缩:在资源层面,监控集群资源使用情况,自动增减主机资源;在应用层面,可通过策略自动增减应用实例来实现业务能力的弹性伸缩。
· 负载均衡:当应用压力增加,集群自动扩展服务将负载均衡至每一个运行节点;当某个节点出现故障,应用实例重新部署运行到健康的节点上。
4、服务注册和发现
容器技术在构建自动化运维场景中,服务注册和发现是重要的两个环节,一般通过一个全局性的配置服务来实现。其基本原理类似公告牌信息发布系统,A 服务(容器应用或者普通应用)启动后在配置服务器(公告牌)上注册一些对外信息(比如IP和端口),B服务通过查询配置服务器(公告牌)来获取A注册的信息(IP和端口)。
5、热迁移
热迁移(Live Migration),又称为动态迁移或者实时迁移,是指将整容器的运行时状体完整保存下来,同时可以快速地在其他主机或平台上恢复运行。容器热迁移主要应用在两个方面:一是有多个操作单元执行任务,热迁移能迅速地复制与迁移容器,做到无感知运行作业;二是可以处理数据中心中集群的负载均衡,大量数据涌来无法运行计算时,可利用热迁移创建多个容器处理运算任务,调节信息数据处理峰谷,配置管理负载均衡比例,降低应用延迟。
四、容器的主要应用场景
容器技术的诞生其实主要解决了PAAS的层的技术实现。像OpenStack、Cloudstack这样的技术是解决IAAS层的问题。那么容器技术主要应用在哪些场景呢?目前主流的有以下几种:
1、容器化传统应用-容器不仅能提高现有应用的安全性和可移植性,还能节约成本。
每个企业的环境中都有一套较旧的应用来服务于客户或自动执行业务流程。即使是大规模的单体应用,通过容器隔离的增强安全性、以及可移植性特点,也能从 Docker 中获益,从而降低成本。一旦容器化之后,这些应用可以扩展额外的服务或者转变到微服务架构之上。
2、持续集成和持续部署 (CI/CD) - 通过 Docker 加速应用管道自动化和应用部署,交付速度提高至少 13 倍。
现代化开发流程快速、持续且具备自动执行能力,最终目标是开发出更加可靠的软件。通过持续集成 (CI) 和持续部署 (CD),每次开发人员签入代码并顺利测试之后,IT 团队都能够集成新代码。作为开发运维方法的基础,CI/CD 创造了一种实时反馈回路机制,持续地传输小型迭代更改,从而加速更改,提高质量。CI 环境通常是完全自动化的,通过 git 推送命令触发测试,测试成功时自动构建新镜像,然后推送到 Docker 镜像库。通过后续的自动化和脚本,可以将新镜像的容器部署到预演环境,从而进行进一步测试。
3、微服务-加速应用架构现代化进程。
应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker 允许开发人员选择最适合于每种服务的工具或技术栈,隔离服务以消除任何潜在的冲突,从而避免"地狱式的矩阵依赖"。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker 的端到端安全功能让团队能够构建和运行最低权限的微服务模型,服务所需的资源(其他应用、涉密信息、计算资源等)会适时被创建并被访问。
4、IT基础设施优化-充分利用基础设施,节省资金。
Docker和容器有助于优化 IT 基础设施的利用率和成本。优化不仅仅是指削减成本,还能确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以 Docker 允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得向云端的可迁移性,同时减少操作系统和服务器的维护工作。
容器解决了什么问题
容器主要要解决的问题是如何让一个包含各种软件、各种依赖、各种配置的需要运行在各种环境的应用能够在所有的部署环境中顺利运行。容器可以将任何应用及其依赖打包成一个自包含、轻量级、可移植的镜像,它可以运行在几乎所有的操作系统上。
五、容器技术与相关技术的关系
1、容器与云计算
虚拟化是云计算的重要基础,容器定义了一套从构建到执行的标准化体系,改变了传统的虚拟化技术,深度影响了云计算领域,容器是云计算的未来。以Docker 为代表的容器技术越来越深刻地影响云计算,也改变我们的日常开发、运维和测试。相比于虚拟机,容器的轻量、快速启动和低开销,以及基于此的按业务打包和微服务模式,这些特点被用来改进 DevOps,很多场景下更适合做大规模集群管理和搭建灵活的分布式系统。通过深度整合了IaaS、PaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决IT、架构及运维等问题,使企业更聚焦于业务,构建了新一代的云计算生态体系。
2、容器与大数据
大数据平台如果能采用容器方式发布,与Spark、Hadoop、Cassandra等相关技术的集成与对接,可降低整个系统的搭建难度,缩短交付和安装周期,减少安装失败风险。容器化后,各类大数据平台组件可以轻松实现迁移的目的,也能实现多复本控制和高可用。
3、容器与物联网
物联网(IoT)技术发展日新月异,而容器技术刚好遇到这样的机遇,将在几个方面促进物联网的发展。
首先,运用容器技术后,可通过容器封装,可简化下载、安装部署、启动和后续应用更新。这将大大加速物联网应用开发部署。其次,容器技术还可以满足物联网在自动监控,集中式维护管理方面的需求。最后,数据采集端环境千变万化,如果需要手动适配工作量巨大,如果采用容器化技术,只要打包几类典型的容器镜像,如ARM,X86,x86_64等,就可以事半功倍实现终端的发布工作。
4、容器与SDN
随着容器部署规模的增大,跨主机、跨网络的容器迁移成为常态。而容器更多地关注于轻量化本身,对于网络架构并没有太多关注。过于复杂的体系结构和管理过程,容易让整个容器网络和系统陷入不可控的非稳定状态。通过SDN和Overlay网络结合,将控制转发分离、集中控制管理理念应用于容器网络,还可以最大程度增强容器网络的弹性伸缩能力和简化网络管理。
另外,SDN与容器的配合,是相得益彰、互相促进的。业界的SDN控制器和系统一般都比较庞大,安装、运行都极为复杂。通过Docker技术,能够实现SDN控制器的轻量级快速部署、安装、运行。