书修订之 《容器 Container》

容器 Container 章节

Posted by 董江 on Monday, July 11, 2022

容器(Container)

什么是容器(Container)?

容器,第一眼看它或许脑子里想到的东西:瓶瓶罐罐、装东西的工具。 生活中:水缸、矿泉水瓶、杯子的…

而IT里的容器技术是英文单词Linux Container的直译。Container这个单词有集装箱、容器的含义。

Container集装箱

如上图,海边码头里的集装箱是运载货物用的,它是一种按规格标准化的钢制箱子。集装箱的特色,在于其格式划一,并可以层层重叠,所以可以大量叠置规格化方便统一调度,特别适合远洋运输

如果对IT软硬件开发资源,和远洋货运运输进行类比。 货物 类比于 应用Application远洋运输 类比于 流量、应用多实例调度;而集装箱 这个工具就是我们主角容器 Container

而在IT中容器技术(Linux Container)将被承载的对象(Application) 通过某种虚拟化隔离技术,将硬件分割成不同大小

然而,容器 Container 并不是特定的一种技术,它是虚拟化技术一种理念.

  • 硬件抽象层:基于hypervisor的虚拟化方式, 可以最大程度上提供虚拟化管理的灵活性。

    各种不同操作系统的虚拟机都能通过hypervisor(KVM、XEN等)来衍生、运行、销毁。然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。

  • 软件抽象层 :LXC软件技术,将底层多余的操作系统、环境等共享和复用。

    部署一个应用运行好后,想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境。这就像集装箱运载一样,我将一个包裹(应用Application),打包放到一容器集装箱里,它通过货轮可以轻而易举的从上海码头(CentOS OS)运送到纽约码头(Ubuntu OS)。而且运输期间,我的包裹(应用Application)没有受到任何的损坏(文件没有丢失),在另外一个码头卸货后,依然可以完美使用(启动正常)。

2008年, Linux Container(简称LXC)实现了内核轻量级的操作系统层虚拟化技术。 标志着一个时代的里程碑开始

Linux Container主要由NamespaceCgroup两大机制来保证实现。 那么NamespaceCgroup是什么呢?刚才我们上面提到了集装箱,集装箱的作用当然是可以对货物进行打包隔离了,不让A公司的货跟B公司的货混在一起,不然卸货就分不清楚了。 那么Namespace也是一样的作用,做隔离。光有隔离还没用,我们还需要对货物进行资源管理。同样的,航运码头也有这样的管理机制:货物用什么样规格大小的集装箱,货物用多少个集装箱,货物哪些优先运走,遇到极端天气怎么暂停运输服务怎么改航道等等… 通用的,与此对应的Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM限制进程组优先级控制,进程组挂起和恢复等等。

LXC虚拟化技术井喷式发展, 为容器技术、云原生、云计算强力推动作用

容器技术发展背景

容器技术避不开云原生,聊云原生也避不开容器技术。容器技术和云原生就是一对双螺旋体,容器技术催生了云原生思潮,云原生生态推动了容器技术发展。 从 2013年 docker(container)技术诞生,到 2015 年 CNCF 这个云原生领域重量级联盟便成立,这不是历史的巧合而是历史的必然。作为云原生关键技术之一的容器,从 2013 年诞生以来一直是行业关注的焦点之一。借用一张业界广泛引用的云原生容器技术进阶图来了解一下容器技术和云原生诞生的历史背景。

先让我们一起来看看容器技术发展的历史纪年表,先直观感受一下这片如火如荼的热土吧!

gantt dateFormat YYYY title 容器发展历史 excludes year 1979 section 历史纪年表 技术萌芽 期 :done, des1, 1979, 2012 技术并发 期 :done, des2, 2013, 2017 商业探索 期 :done, des3, 2017, 2018 商业拓展 期 :done, des4, 2019, 2026
  • 1979 年 ~ 2008 年,Unix/Linux OS 虚拟化技术出现
  • 2004 年 ~ 2007 年,Google 内部大规模使用 Cgroups 等的 OS 虚拟化技术。2006年,Google 开源内部使用的 process container 技术,后续更名为 cgroup。最核心隔离管理组件
  • 2008 年,Cgroups 进入了 Linux 内核主线。
  • 2008 年,LXC(Linux Container)项目具备了 Linux 容器的雏型。
  • 2011 年 ~ 2013 年,CloudFoundry 的 Warden 系统;Google的 LMCTFY 系统。完整的开源容器系统出现
  • 2013 年,Docker 项目正式发布,让 Linux 容器技术逐步席卷天下。
  • 2014 年,Kubernetes 项目正式发布,容器技术开始和编排系统起头并进。
  • 2015 年,由 Google,Redhat、Microsoft 及一些大型云厂商共同创立了 CNCF
  • 2016 年 - 2017 年,容器生态开始模块化、规范化。CNCF 接受 Containerd、阿里Pouch、rkt项目,OCI 发布 1.0,CRI/CNI 得到广泛支持。
  • 2017 年 - 2018 年,容器服务商业化。AWS ECS,Google EKS,Alibaba ACK/ASK/ECI,华为 CCE/CCI,Oracle Container Engine for Kubernetes;VMware,Redhat 和 Rancher 开始提供基于 Kubernetes 的商业服务产品。
  • 2017 年 - 2019 年,容器引擎技术飞速发展,新技术不断涌现。2017 年底 Kata Containers 社区成立,2018 年 5 月 Google 开源 gVisor 代码,2018 年 11 月 AWS 开源 firecracker,阿里云发布安全沙箱 1.0。
  • 2020 年 - 202x 年,容器引擎技术升级,Kata Containers 开始 2.0 架构,阿里云发布沙箱容器 2.0….

容器技术的特点

容器技术,对比硬件抽象层虚拟化hypervisor技术就清楚了。 我们之前也提到过,传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。

那么有了容器技术就简单了,总结下容器技术主要有三个特点:

  • 极其轻量:只打包了必要的Bin/Lib;
  • 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
  • 易于移植:一次构建,随处部署;
  • 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

over

如上图,Application in Docker on kubernetes on Openstack on Mesos on DC/OS on VMs on Bare Metal

容器将应用一次次包装叠加,一层层的将应该打包成Container,最终运行在硬件上。

容器的标准化

docker几乎是容器的代名词,但容器不仅仅是docker一种实现。 业界还有 Containerd、Pouch、rkt等等 任何技术出现都需要一个标准来规范它,不然各搞各的很容易导致技术实现的碎片化,出现大量的冲突和冗余。

因此,在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。

标准主要包括runtime运行时标准image镜像标准。标准的推出,有助于替成长中市场带来稳定性,让企业能放心采用容器技术,用户在打包、部署应用程序后,可以自由选择不同的容器Runtime;同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范来做。

两种标准主要包含以下内容:

容器运行时标准 (runtime spec)

  • creating:使用 create 命令创建容器,这个过程称为创建中
  • created:容器创建出来,但是还没有运行,表示镜像和配置没有错误,容器能够运行在当前平台
  • running:容器的运行状态,里面的进程处于 up 状态,正在执行用户设定的任务
  • stopped:容器运行完成,或者运行出错,或者 stop 命令之后,容器处于暂停状态。这个状态,容器还有很多信息保存在平台中,并没有完全被删除

容器镜像标准(image spec)

  • 文件系统:以 layer 保存的文件系统,每个 layer 保存了和上层之间变化的部分,layer 应该保存哪些文件,怎么表示增加、修改和删除的文件等;
  • config 文件:保存了文件系统的层级信息(每个层级的 hash 值,以及历史信息),以及容器运行时需要的一些信息(比如环境变量、工作目录、命令参数、mount 列表),指定了镜像在某个特定平台和系统的配置。比较接近我们使用 docker inspect <image_id> 看到的内容;
  • manifest 文件:镜像的 config 文件索引,有哪些 layer,额外的 annotation 信息,manifest 文件中保存了很多和当前平台有关的信息;
  • index 文件:可选的文件,指向不同平台的 manifest 文件,这个文件能保证一个镜像可以跨平台使用,每个平台拥有不同的 manifest 文件,使用 index 作为索引。

容器的主要应用场景

container

容器技术是云原生基础的核心底座

容器技术的诞生其实主要解决了PaaS的层的技术实现。像OpenStack、Cloudstack这样的技术是解决IaaS层的问题。IAAS层和PAAS层大家估计也听得很多了,关于他们的区别和特性我这里不在描述。那么容器技术主要应用在哪些场景呢?目前主流的有以下几种:

容器化传统应用: 容器不仅能提高现有应用的安全性和可移植性,还能节约成本。

每个企业的环境中都有一套较旧的应用来服务于客户或自动执行业务流程。即使是大规模的单体应用,通过容器隔离的增强安全性、以及可移植性特点,也能从 Docker 中获益,从而降低成本。一旦容器化之后,这些应用可以扩展额外的服务或者转变到微服务架构之上。

持续集成和持续部署 (CI/CD): 通过 Docker 加速应用管道自动化和应用部署,交付速度提高至少 13 倍。

现代化开发流程快速、持续且具备自动执行能力,最终目标是开发出更加可靠的软件。通过持续集成 (CI) 和持续部署 (CD),每次开发人员签入代码并顺利测试之后,IT 团队都能够集成新代码。作为开发运维方法的基础,CI/CD 创造了一种实时反馈回路机制,持续地传输小型迭代更改,从而加速更改,提高质量。CI 环境通常是完全自动化的,通过 git 推送命令触发测试,测试成功时自动构建新镜像,然后推送到 Docker 镜像库。通过后续的自动化和脚本,可以将新镜像的容器部署到预演环境,从而进行进一步测试。

微服务: 加速应用架构现代化进程。

应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker 允许开发人员选择最适合于每种服务的工具或技术栈,隔离服务以消除任何潜在的冲突,从而避免“地狱式的矩阵依赖”。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker 的端到端安全功能让团队能够构建和运行最低权限的微服务模型,服务所需的资源(其他应用、涉密信息、计算资源等)会适时被创建并被访问。

IT 基础设施优化:充分利用基础设施,节省资金。

Docker 和容器有助于优化 IT 基础设施的利用率和成本。优化不仅仅是指削减成本,还能确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以 Docker 允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得向云端的可迁移性,同时减少操作系统和服务器的维护工作。

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付