本文最后更新于 257 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Linux容器(Container)发展史
一.容器(Container)技术概述
1.什么是容器(Container)
容器是一种基础工具;泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳,存储,运输物品;物体可以被放置在容器中,而容器则可以保护内容物。
人类使用容器的历史至少有十万年,甚至可能有数百万的历史。以下是我们生活中常见到的容器的类型:
瓶:
指口部比腹部窄小,颈长的容器。
罐:
指那些开口较大,一般为近圆筒形的器皿。
箱:
通常是立方体或圆柱体。形状固定。
篮:
以条形物编织而成。
桶:
一种圆柱形的容器。
袋:
柔性材料制成的容器,形状会受内容物而变化。
翁:
通常是指陶制,口小肚大的容器。
碗:
用来盛载食物的容器。
柜:
指由一个盒组成的家俱。
鞘:
用于装载刀刃的容器。
综上所述,想必大家对容器这个概念应该有所了解,说了这么多,我想表达的是: "计算机中的技术来源于现实生活"。
那计算机所指的容器(Container)到底是什么呢?可能你会说它是能装"东西"的一个技术,那这个"东西"到底是啥呢?自然是就是我们熟悉的所有应用程序(Application Program)啦。
我们以Linux容器为例,它是运行在操作系统上的一系列进程。运行这些进程所需的所有文件都由另一个只读镜像文件提供,这意味着从"开发 -> 测试 --> 生产"的整个过程中,Linux容器都具有可移植性和一致性。
换句话说,Linux容器技术能够让您对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而让您可以在不同环境(如开发、测试和生产等环境)之间轻松迁移应用,同时还可保留应用的全部功能。
因而,相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多。容器比较普遍也易于使用,因此也成了IT安全方面的重要组成部分。将安全性内置于容器管道,可以为您的基础架构增添防护,从而保障容器的可靠性、可扩展性和信赖度。
推荐阅读:
https://www.redhat.com/zh/topics/containers/whats-a-linux-container。
https://www.redhat.com/zh/topics/security/container-security
https://www.redhat.com/zh/topics/security
https://www.docker.com/resources/what-container
https://docs.docker.com/get-started/#what-is-a-container
2.为什么要用容器
场景:
假设您在使用一台笔记本电脑开发一个应用,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。您正在开发的应用不止依赖于您当前的配置,还需要某些特定的库、依赖项和文件。
与此同时,您的企业还拥有标准化的开发和生产环境,有着自己的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。
根据以上场景分析,您要考虑如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的各种依赖问题,也无需重新编写代码和进行故障修复呢?答案就是使用容器。
(1)容器可以确保您的应用拥有必需的库、依赖项和文件,让您可以在生产中自如地迁移这些应用,无需担心会出现任何负面影响。
(2)实际上,您可以将容器镜像中的内容,视为Linux发行版的一个安装实例,因为其中完整包含RPM软件包、配置文件等内容。但是,安装容器镜像发行版,要比安装新的操作系统副本容易得多。这样可以避免不必要的麻烦,做到皆大欢喜。
虽然这只是一个常见情况的示例,但在需要很高的可移植性、可配置性和隔离的情况下,我们可以利用Linux容器通过很多方式解决难题。 Linux容器的价值在于,它能加速开发并满足新出现的业务需求。
在某些情形中(如通过Apache Kafka进行实时数据流处理),容器是不可或缺的,因为它们是提供应用所需的可扩展性的唯一途径。 无论基础架构是在企业内部还是在云端,或者混合使用两者,容器都能满足您的需求。当然,选择正确的容器平台也同样重要。
在云服务范畴内,CaaS被认为是基础架构即服务(IaaS)的一种子集,介于IaaS和平台即服务(PaaS)之间。 CaaS的基本资源为容器,它是云原生应用和微服务的常见部署机制。此外,CaaS还可以提高环境之间的可移植性,无论是混合环境还是多云环境。
使用容器有很多好处,以下是比较容器可圈可点的特性:
(1)可移植性:
用容器开发的应用拥有运行所需的一切,并可以部署在包括私有云和公共云在内的多种环境中。
可移植性也意味着灵活性,因为您可以更轻松地在环境和提供商之间移动工作负载。
(2)可扩展性:
容器具有水平扩展的功能,这意味着用户可以在同一集群中成倍增加相同容器的数量,从而根据需要进行扩展。
通过仅在需要时使用和运行所需的内容,可以大大降低成本。
(3)高效性:
容器所需的资源要少于虚拟机(VM),因为它们不需要虚拟单独的操作系统。
您可以在单个服务器上运行多个容器,而且它们需要较少的裸机硬件,这意味着成本更低。
(4)更高的安全性:
容器之间彼此隔离,这意味着在一个容器遭到破坏的情况下,其他容器并不会受到影响。
(5)速度:
由于容器相对于操作系统具有自主性,因此其启动和停止仅需几秒钟的时间。这也加快了开发和运维工作,同时带来了更快、更流畅的用户体验。
二.常见的容器管理技术概述
1.Unix chroot
容器的概念始于1979年前后的UNIX chroot,它是一个UNIX操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。
这个功能的想法是为每个进程提供独立的磁盘空间。其后在1982年前后,它被加入到了BSD系统中。
温馨提示:
BSD是Unix的扩展版本,FreeBSD是BSD发行版最流行的系统。
2.Unix FreeBSD jail
在2000年前后,FreeBSD jail这种技术可将FreeBSD系统分区为多个子系统(也称为Jail)。Jail是作为安全环境而开发的,系统管理员可与企业内部或外部的多个用户共享这些Jail。
Jail的目的是让进程在经过修改的chroot环境中创建,而不会脱离和影响整个系统。在chroot环境中,对文件系统、网络和用户的访问都实现了虚拟化。
尽管Jail在实施方面存在局限性,但最终人们找到了脱离这种隔离环境的方法。但这个概念非常有吸引力。
推荐阅读:
https://www.freebsd.org/doc/handbook/jails.html
https://www.freebsd.org/
3.Linux-VServer
2001年前后,通过Jacques Gélinas的VServer项目,隔离环境的实施进入了Linux领域。正如Gélinas所说:"这项工作的目的是高度独立且安全的单一环境中运行多个通用Linux服务器"。
Linux-VServer也是一个操作系统级虚拟化解决方案。Linux-VServer对Linux内核进行虚拟化,这样多个用户空间环境又称为"Virtual Private Server"(简称"VPS")就可以单独运行,而不需要互相了解。
Linux-VServer通过修改Linux内核实现用户空间的隔离。Linux VServer也使用了chroot来为每个VPS隔离root目录。虽然chroot允许指定新root目录,但还是需要其他一些功能(称为Chroot-Barrier)来限制VPS脱离其隔离的root目录回到上级目录。
给定一个隔离的root目录之后,每个VPS就可以拥有自己的用户列表和root密码。在完成了这项针对Linux中多个受控制用户空间的基础性工作后,Linux容器开始逐渐成形并最终发展成了现在的模样。
如下图所示,2.4和2.6版本的Linux内核支持Linux-VServer,它可以运行于很多平台之上,包括 x86、x86-64、SPARC、MIPS、ARM 和 PowerPC。
温馨提示:
同年时间(即2001年),Parallels公司发布了Virtuozzo Container产品,只不过该版本是商用版本。直到2005年才基于Virtuozzo Containers研发了OpenVZ进行开源。
推荐阅读:
http://linux-vserver.org/Welcome_to_Linux-VServer.org
4.Oracle Solaris Container(Sun公司的Solaris与FreeBSD,Mac系统一样,均是Unix扩展版(即BSD)的发行版)
2004年前后,作为Solaris 10中具有突破性意义的关键技术之一,由Sun公司虚拟化专家Joost Pronk van Hoogeveen、Jeff Victor和Chien-Hua Yen等研发的Solaris Containers能够促进服务器整合,并提高应用程序可用性和易管理性。
Solaris网格容器由两个主要组件构成:Solaris区域(Zone)和Solaris资源管理器(SRM)。SRM 管理每个容器接收到的物理系统资源,而Solaris区域则控制名称空间隔离。"区域"和SRM一起构成Solaris容器的基础。
在2008年前后Sun以10亿美元收购开源数据库公司MySQL,做为一个开源的关系型数据库管理系统,MySQL在市场上受到了广泛的欢迎,并成为流行的网站架构方式LAMP(Linux+Apache+MySQL+PHP)的一部分。
2009年4月20日,加利福尼亚州圣克拉拉市Sun Microsystems(NASDAQ:JAVA)和Oracle Corporation(NASDAQ:ORCL)今天宣布,他们已达成最终协议,根据该协议,Oracle将以每股9.50美元的现金价格收购Sun普通股。
交易总价值约为74亿美元,扣除Sun的现金和债务后为56亿美元。曾经的工作站之王、Unix之王和缔造了Solaris、Java传奇的巨人Sun倒下了
Java和JavaScript啥关系?
Java由SUN公司研发,SUN公司和网景(Netscape)公司的是合作关系。JavaScript在1995年由Netscape公司(该公司成立于1994年)的Brendan Eich,在网景导航者浏览器上首次设计实现而成。
因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。JavaScript的标准是ECMAScript 。
1998年11月,网景被美国在线(American OnLine,AOL)收购,而后来美国在线和时代华纳合并,之后再独立。美国在线依然使用网景这品牌。
2007年12月28日,美国在线在博客表示将停止网景浏览器的开发,并于2008年3月1日停止安全更新和所有的技术支持,并建议用户转移使用Mozilla Firefox浏览器。
这就意味着于1994年问世的Netscape将正式退出历史舞台。于2008年3月1日停止支持的网景浏览器后,保留了门户网站Netscape。此外也有经营着一个以网景为名的廉价互联网服务。
推荐阅读:
https://www.lampchina.net/ask/MTM3MTkwMg.html
https://www.fujitsu.com/global/products/computing/servers/unix/sparc-enterprise/software/solaris10/container/
https://baike.baidu.com/item/%E7%BD%91%E6%99%AF/70176?fromtitle=netscape&fromid=2778944
5.Parallels Virtuozzo/OpenVZ
2005年前后,前面我们提到过,Virtuozzo(2001年发布)是SWsoft公司(目前SWsoft已经改名为Parallels)的操作系统虚拟化软件的命名,Virtuozzo是商业解决方案,而OpenVZ是以Virtuozzo为基础的开源项目,它们采用的也是操作系统级虚拟化技术。
OpenVZ类似于Linux-VServer,它通过对Linux内核进行补丁来提供虚拟化、隔离、资源管理和状态检查。每个OpenVZ容器都有一套隔离的文件系统、用户及用户组等。
OpenVZ是Linux的基于容器的虚拟化。OpenVZ在单个物理服务器上创建多个安全的,隔离的Linux容器(也称为VE或VPS),以提高服务器利用率并确保应用程序不冲突。
每个容器的执行和执行都完全像独立服务器一样。容器可以独立地重新引导,并且具有root用户访问权限,用户,IP地址,内存,进程,文件,应用程序,系统库和配置文件。
推荐阅读:
https://wiki.openvz.org/Main_Page
https://wiki.openvz.org/Quick_installation
https://wiki.openvz.org/Download
6.Linux Kernel支持Cgroup(控制组)和NameSpace(命名空间)技术
早期,Jail和VServer基本上都是在chroot概念之上稍作改进和其他一些标准工具的组合来实现此特定的虚拟服务器模型。很快,更多技术结合进来,让这种隔离方法从构想变为现实。
2007年前后,Linux内核支持Cgroup和NameSpace技术,这两种技术在增加对Linux的整体控制的同时,也成为了保持环境隔离的重要框架。
NameSpace(命名空间)主要包含以下六种技术:
MNT Namespace(提供磁盘挂载点和文件系统的隔离能力):
每个容器都要有独立的根文件系统用户空间,以实现在容器里面启动服务并且使用容器的运行环境。换句话说,就是在容器里面不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指的运行目录里面。
举个例子:
一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境。
IPC Namespace(提供进程间通信的隔离能力):
一个容器内的进程间通信,允许一个容器内的不同进程的(内存,缓存等)数据访问,但是不能跨容器访问其他容器的数据 。
UTS Namespace(提供主机名隔离能力):
用于系统标识,其中包含了hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的他容器 。
PID Namespace(提供进程隔离能力):
CentOS Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父。
在每个容器内也要有一个父进程来管理其下属的子进程,多个容器进程的PID namespace进程隔离(比如PID编号重复、容器内的主进程与回收子进程等)。
Net Namespace(提供网络隔离能力):
每一个容器都类似于虚拟机一样有自己的网卡,监听端口,TCP/IP协议栈等。
以Docker为例,使用network namespace启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0。
上面提到的docker0本质上是Linux的虚拟网桥(Virtual Bridge),网桥是在OSI七层模型的数据链路网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
User Namespace(提供用户隔离能力):
各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎隔离各个容器内的用户空间呢?
User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会用户的作用范围限制在每个容器内。
即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离,互不影响,永不相见。
Cgroups:
一个容器如果不对其做任何资源限制,则宿主机(也称为物理机,英文名称为:"Physical machine")会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完。
综上所述,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU,内存,磁盘等。
Linux Cgroups的全称是Linux Control Groups,它最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等等。
此外,Linux Cgroups还能够对进程优先级设置,以及将进程挂起和恢复等操作。
温馨提示:
如下图所示,有关的NameSpace(命名空间)各种核心技术所支持的Linux Kernel的发行版本。因此推荐大家使用Linux Kernel 3.8+的版本哟~
如果您使用的是Ubuntu就不用担心Linux Kernel版本啦,因为它使用的Kernel版本要比CentOS的新,但如果您要是想使用CentOS发行,推荐使用CentOS 7.6+版本。
参考连接:
https://www.cnblogs.com/yinzhengjie/p/12183066.html
7.LXC/LXD
由于Linux Kernel支持Cgroup(控制组)和NameSpace(命名空间)技术,这意味着一切都可在Linux内核中实现虚拟化,因此推动了容器的进一步发展。
LXC:
2008年前后,作为一个开源容器平台,Linux容器项目LXC是众所周知的工具,模板,库和语言绑定集。它的级别很低,非常灵活,几乎涵盖了上游内核支持的每个遏制功能。同年,RedHat公司发布了用于管理虚拟化平台的Libvirt工具。
LXC是Linux内核包含功能的用户空间接口。通过功能强大的API和简单的工具,它使Linux用户可以轻松地创建和管理系统或应用程序容器。LXC采用简单的命令行界面,可改善容器启动时的用户体验。
LXC提供了一个操作系统级的虚拟化环境,可在许多基于Linux的系统上安装。在Linux发行版中,可能会通过其软件包存储库来提供LXC。
当前的LXC使用以下内核功能来包含进程:
(1)Kernel namespaces (ipc, uts, mount, pid, network and user);
(2)Apparmor and SELinux profiles;
(3)Seccomp policies;
(4)Chroots (using pivot_root);
(5)Kernel capabilities;
(6)CGroups (control groups);
LXC容器通常被认为是chroot和成熟的虚拟机之间的中间对象。LXC的目标是创建一个与标准Linux安装尽可能接近的环境,而不需要单独的内核。
LXC的意思是LinuX Containers,它是第一个最完善的Linux容器管理器的实现方案,是通过cgroups和Linux名字空间namespace实现的。
LXC存在于liblxc库中,提供了各种编程语言的API实现,包括Python3、Python2、Lua、Go、Ruby和Haskell等。
与其它容器技术不同的是,LXC可以工作在普通的Linux内核上,而不需要增加补丁。现在LXC project是由Canonical Ltd.赞助的项目,目前由Canonical公司赞助并托管的。
LXD:
虽然LXC使得用户能够通过简单的命令行界面轻松地启动使用容器,但是和我们过去使用的虚拟机来讲,它的复杂程度并没有多大降低,而且其隔离性依旧没有虚拟机好。
LXC最大的好处就是在性能和资源上有所节约,但是在大规模容器使用上LXC依然没有找到很好的突破口,于是后来就出现了LXD,Docker等技术。
LXD是新的LXC体验。它使用一个命令行工具来管理容器,从而提供了全新的直观用户体验。可以通过REST API以透明方式通过网络管理容器。通过与OpenNebula和OpenStack等云平台集成,它还可以用于大规模部署。
LXD是下一代系统容器管理器。它提供类似于虚拟机的用户体验,但是使用Linux容器。它基于映像,并带有可用于各种Linux发行版的预制映像,并且基于非常强大但非常简单的REST API构建。
推荐阅读:
https://www.freedesktop.org/wiki/Software/systemd/
https://linuxcontainers.org/
https://linuxcontainers.org/lxc/introduction/
https://linuxcontainers.org/lxd/introduction/
http://www.canonical.com/
https://libvirt.org/
8.Docker
2013年dotCloud公司首次在pycon官网首次公布了Docker开源版本。Docker带来了一种先进的软件交付方式,即通过容器进行进行软件的交付。并对外宣传的是Build(本地编译),Ship(传输到其他服务器节点),Run(可以移植到指定的服务器运行)。
实际上我们可以使用docker build将代码的运行环境制作成镜像,通过dock push将镜像发布至私有或共有的docker仓库。其他人可以通过dock pull下载你提交的镜像,而后使用docker run将指定在镜像启动。此过程可以排除环境依赖等问题。
docker这款开源软件可以有效的解决(程序员开发的)程序在运行时环境差异而带来的一系列问题,达到"Build once, Run anywhere"的目标。
此后docker也称为了容器的代名词(就想Hadoop成了大数据的代名词一样),并成为容器时代的引领者。关于Docker容器的历史,架构,应用场景等我这里不做赘述,感兴趣的小伙伴可参考我另外一篇笔记。
Docker容器的应用场景:
(1)应用程序打包和发布;
(2)应用程序隔离;
(3)持续集成;
(4)部署微服务;
(5)快速搭建测试环境;
(6)提供CAAS产品;
推荐阅读:
https://www.cnblogs.com/yinzhengjie2020/p/14017860.html
https://www.cnblogs.com/yinzhengjie2020/p/14022268.html
https://us.pycon.org/2013/
9.RedHat(已被IBM收购)的CoreOS rkt容器技术
Rkt诞生于2014年11月末,我在GitHub上发现他在2014年11月27日就发布了"v0.0.0"版本,"v0.1.0"版本是在同年的12月1日发布的。
Rkt是一种与Docker类似的容器引擎,由CoreOS公司主导,得到了Redhat、Google、Vmware等公司的支持,更加专注于解决安全、兼容、执行效率等方面的问题。
CoreOS公司最早是Docker的支持者,其产品CoreOS操作系统是适用于企业的轻量级容器化的Linux发行版,是Docker生态圈的重要一员。
随着Docker在容器行业变得逐渐强大,Docker也越来越臃肿,CoreOS公司希望有一个更加开放和中立的容器标准,因此推出了自己的容器计划,很明显CoreOS公司也想在容器方面有一席之地。
就这样,CoreOS公司成为了Docker公司的容器引擎竞争对手。由于Docker已经深入人心,尽管Rkt也很优秀,但很少有人愿意将Docker技术栈迁移到Rkt技术栈。最终容器之战Docker占领了大部分市场。
2018年4月16日是发布的最新rkt容器工具,目前该项目已经停止维护,因此生产环境中不推荐大家使用该容器技术。推荐使用主流的容器工具,如Docker,Pouch,podman。
参考链接:
https://github.com/rkt/rkt/releases
https://www.sohu.com/a/216850450_468741
10.阿里开源的Pouch容器技术
2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于Apache 2.0协议的容器技术Pouch。
Pouch Container是阿里巴巴集团创建的一个开源项目,旨在促进集装箱技术的发展。
Pouch Container的愿景是改善容器生态系统并促进容器标准OCI(开放容器计划),从而使容器技术成为云时代应用程序开发的基础。
Pouch Container可以打包,交付和运行任何应用程序。它为应用程序提供了轻量级的运行时环境,具有强大的隔离性和最小的开销。Pouch Container将应用程序与变化的运行时环境隔离开来,并最大程度地减少了操作工作量。
Pouch Container可以最大程度地减少应用程序开发人员编写本机应用程序或将旧版应用程序迁移到Cloud平台的工作。
Pouch是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率。
温馨提示:
上图是Pouch容器的内部实现架构图,下图是Pouch容器的生态系统图。
在Pouch Container的路线图中,我们将拥抱生态系统作为主要目标。对于上层业务流程层,Pouch Container支持Kubernetes和Swarm。
对于底层运行时层,Pouch Container支持runC,runV(该容器引擎由音速神童公司2015年5月左右发起的,同年发布的还有Intel公司发起的Clear Container),runlxc等。为了使存储和网络大为补充,CNI和CSI就在其中。
推荐阅读:
https://github.com/alibaba/pouch
https://github.com/opencontainers
https://www.infoq.cn/article/alibaba-pouch
https://github.com/alibaba/pouch/blob/master/docs/architecture.md
https://github.com/opencontainers/runc
https://github.com/hyperhq/runv
https://github.com/containernetworking/cni
https://github.com/container-storage-interface
11.音速神童kata-containers
技术创业公司音速神童成立于2015年,由两位中国开发者赵鹏和王旭创建。经过两年的发展,成长为全球容器行业的的重要技术和力量,
2017年12月,音速神童在KubeCon上对外发布了Kata Containers安全容器项目,这个项目的两个前身是:音速神童的自研容器产品runV和Inter公司的容器产品Clear Container,而这两个项目均发布于2015年5月。
kata COntainers其支持者包括99cloud、AWcloud、Canonical、中国移动、City Network、CoreOS、Dell/EMS、EasyStack、Fiberhome、谷歌、华为、京东、Mirantis、NetApp、Red Hat、SUSE、腾讯、Ucloud、UnitedStack 和中兴。
自2017年12月启动以来,kata COntainers该社区成功地将Intel Clear Containers的最佳部分与Hyper.sh RunV合并,并进行了扩展,以包括对主要架构的支持,包括x86_64之外的AMD64,ARM,IBM p系列和IBM z系列。
Kata Containers是一个开放源代码社区,致力于通过轻量级虚拟机来构建安全的容器运行时,这些虚拟机的感觉和性能类似于容器,但是使用硬件虚拟化技术作为第二防御层,可以提供更强的工作负载隔离。
Kata Containers还支持多个虚拟机管理程序,包括QEMU,NEMU和Firecracker,并与其他容器化项目集成。
Kata Containers社区由开放基础设施基金会管理,该基金会支持全球开放基础设施的开发和采用。该代码在Apache 2许可下托管在GitHub上。
综上所述,Kata容器与容器一样轻便,快速,并与容器管理层集成在一起,包括流行的编排工具,如Docker和Kubernetes(k8s),同时还具有VM的安全优势。Kata Container具有以下几个优势:
(1)安全:
在专用内核中运行,提供网络,I/O和内存的隔离,并可以通过虚拟化VT扩展利用硬件强制隔离。
(2)兼容性:
支持行业标准,包括OCI容器格式,Kubernetes CRI接口以及旧版虚拟化技术。
(3)性能:
提供与标准Linux容器一致的性能;提高隔离度,而无需增加标准虚拟机的性能。
(4)简单:
消除了在完整的虚拟机内部嵌套容器的要求;标准接口使插入和入门变得容易。
温馨提示:
这一容器引擎其中一个特殊之处在于,它试图解决传统运维体验的问题,让容器可以像传统虚拟机一样操作。这其实就是VM与容器的结合,也正是Kata的用武之地。
在之前,蚂蚁金服自研了一套技术来做到这点,而现在它们可以结合Kata的长处做到更好,同时又能保持和国内外主流技术保持同步。
据InfoQ独家消息,技术创业公司音速神童创始人赵鹏王旭加入蚂蚁金服,打造虚拟机级别的安全容器技术。这也是为什么你所看到的pouch container是支持runV容器引擎的一个原因吧,因为runV研发团队核心成员已经入职阿里的蚂蚁金服!
音速神童加入蚂蚁金服这件事在容器和云原生领域掀起新的波澜,它意味着云计算基础技术仍有可挖掘的的地方,而随着互联网大公司和云计算厂商的介入,未来的技术演进的竞争将更加激烈。
参考链接:
https://github.com/kata-containers/kata-containers
https://github.com/hyperhq/runv
https://katacontainers.io/
https://katacontainers.io/learn/
https://www.infoq.cn/article/OI-CCUqPe82xKUwtVoA2
https://blog.csdn.net/weixin_44326589/article/details/103726445
https://www.kubernetes.org.cn/tags/kubecon
12.podman
Podman是一个无守护进程的容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无根模式运行。简而言之:alias docker = podman。
2018年2月,PodMan的v0.2版本发布。Podman(POD管理器)是一种基于Apache-2.0 License开源工具,用于管理容器和镜像,安装在这些容器中的体积以及由容器组制成的容器。
Podman基于libpod,libpod是一个用于容器生命周期管理的库,该库也包含在其中。libpod库提供用于管理容器,pod,容器映像和卷的API。
推荐阅读:
https://podman.io/
https://github.com/containers/podman
三.容器技术改变了传统部署应用程序的方式
1.容器和虚拟机之间的架构差异
我们通常会说容器和虚拟化技术实现了一个互补,接下来我们来简单列举一下容器(Container)和虚拟机(virtual machine)直接的差别。
启动速度:
Docker Container只需加载镜像文件,通常情况下是秒级(除非你的镜像不在本地,而是在公网上,这需要一个下载镜像的过程)。
而virtual machine需要启动宿主机,速度较慢。
运行性能:
接近原生物理系统,因为Docker Container和原生操作系统使用的是同一个kernel。
而virtual machine使用的宿主机的虚拟kernel,这意味着需要将虚拟kernel的指令经过编译,翻译成机器码交由物理kernel取执行。因此会多占用一些资源。
镜像体积:
Docker Container镜像基本上都是MB级别。
virtual machine就需要ISO镜像来安装,官方有900MB+(Minimal的ISO镜像),4GB+(DVD的ISO镜像),10GB+(Everything的ISO镜像)等等。
可管理性:
Docker Container单进程(即进程级隔离)
virtual machine是虚拟完整的系统管理(即系统级隔离,相对来隔离更彻底)
资源利用率:
一台物理机可以运行数百个容器Docker Container,但是一般只能运行数十多个virtual machine。
封装程度:
Docker Container只打包项目代码及其运行环境所依赖的关系
virtual machine虚拟完整的操作系统。
2.容器改变了部署方式
传统部署时代:
早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。
例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果,另一个应用程序的性能将下降。
解决方案是在不同的物理服务器上运行每个应用程序。但是,这并没有随着资源利用不足而扩展,并且组织维护许多物理服务器的成本很高。
虚拟化部署时代:
作为解决方案,引入了虚拟化。
它允许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化允许在VM之间隔离应用程序,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由访问。
虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。借助虚拟化,您可以将一组物理资源呈现为一组一次性虚拟机。
每个VM都是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:
容器类似于VM,但是它们具有轻松的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻质的。
与VM相似,容器具有自己的文件系统,CPU,内存,进程空间等的共享。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。
参考连接:
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
四.chroot工具使用(了解即可)
1.chroot概述
chroot(全称为:"change root directory")命令用来在指定的根目录下运行指令。在linux系统中,系统默认的目录结构都是以/,即是以根(root)开始的。而在使用chroot之后,系统的目录结构将以指定的位置作为/位置。
其实chroot的概念我们并不是第一次接触了,还记得我们讲解的kafka在zookeeper的元数据znode位置吗?我们也为其指定了根znode哟~
在经过chroot之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:
(1)增加了系统的安全性,限制了用户的权力;
在经过chroot之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。
这个一般是在登录(login)前使用chroot,以此达到用户不能访问一些特定的文件。
(2)建立一个与原系统隔离的系统目录结构,方便用户的开发;
使用chroot后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。
在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
(3)切换系统的根目录位置,引导Linux系统启动以及急救系统等。
chroot的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始RAM磁盘 (initrd) 切换系统的根位置并执行真正的init。
另外,当系统出现一些问题时,我们也可以使用chroot来切换到一个临时的系统。
2.centos测试
[root@docker201.oldboyedu.com ~]# mkdir -pv oldboyedu/linux
[root@docker201.oldboyedu.com ~]#
[root@docker201.oldboyedu.com ~]# scp -r /usr/{bin,lib64} oldboyedu/linux/
3.ubuntu测试
mkdir -pv oldboyedu/linux/{bin,lib,lib64}
cp /bin/bash oldboyedu/linux/bin/
cp /lib/x86_64-linux-gnu/{libtinfo.so.5,libdl.so.2,libc.so.6} oldboyedu/linux/lib
cp /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 oldboyedu/linux/lib64/
4.创建文件
bash-4.2# echo "oldboyedu linux 2021" > /oldboyedu.log
5.chroot的局限性
从chroot的用法可以看出它的使用场景有一定的局限性,首先它依赖于一台现成的unix系统(根目录必须存在于某台现有系统上)。
其次chroot仅仅是在系统目录上进行了隔离,并没有对进程、环境变量,网络等层面进行隔离。因此我们说chroot并不能完全保证系统安全。
温馨提示:
(1)如下图所示,演示了进程和环境变量并没有实现隔离;
(2)此处的chroot中无法使用ping命令或者ifconfig相关的命令,否则就可以进一步验证网络也没有隔离哟~
五.LXC容器管理工具使用(了解即可)
1.centos按照lxc,lxd(比较麻烦)
[root@docker201.oldboyedu.com ~]# yum -y install lxc lxd
推荐阅读:
https://bbs.huaweicloud.com/blogs/150538
温馨提示:
lxc:
客户端。
lxd:
服务端。
2.ubuntu安装lxc,lxd
apt-get -y install lxc lxd
lxd:
服务端。
lxc:
客户端
3.检查内核对lxc的支持情况
[root@docker201.oldboyedu.com ~]# lxc-checkconfig
4.下载镜像
lxc-create -t download --name my_alpine2021 -- --dist alpine --release lates
t --arch adm64 --keyserver hkp://keyserver.ubuntu.com
相关参数说明:
-t:
指定模板名称,我们这里指定download模板,就会调用"/usr/share/lxc/templates/lxc-download"脚本,该脚本说明我们目前没有自己的模板,需要下载官方的模板。
--name:
指定容器名称,即为创建的容器命名。
--:
用来说明后面的参数是传递给download脚本的,告诉脚本需要下载什么养的模板。
--dist:
操作系统名称,即指定操作系统。
--release:
指定操作系统的发行版本。可以是各种Linux的变种。
--arch:
指定CPU架构,是x86还是arm,是32位还是64位。
5.管理lxc容器命令
lxc-start my_alpine2021:
启动lxc容器。
lxc-attach my_alpine2021:
进入lxc容器。
6.lxc启动容器依赖于模板
lxc启动容器依赖于模板,清华模板源:
https://mirrors.tuna.tsinghua.edu.cn/help/lxc-images/
但是做模板相对较难,需要手动一步步构建文件系统,准备基础目录及可执行程序等,而且在大规模使用容器的场景很难横向扩展,另外后期代码升级也需要重新从头构建模板,基于以上种种原因便有了docker容器管理工具。
六.可能会遇到的报错
1.chroot: failed to run command ‘/bin/bash’: No such file or directory
报错原因:
指定的chroot目录中没有‘/bin/bash’文件。
解决方案:
如下图所示,拷贝‘/bin/bash’文件到指定的目录结构并将其依赖的库文件也要拷贝过去。此处我为了偷懒,就没进行拷贝。
2.ERROR: Unable to fetch GPG key from keyserver
故障原因:
无法从密钥服务器获取GPG密钥。
解决方案:
方案一:
vim ~/.bashrc
export DOWNLOAD_KEYSERVER="keyserver.ubuntu.com"
方案二:
DOWNLOAD_KEYSERVER="keyserver.ubuntu.com" lxc-create -t download ...
方案三:
lxc-create -t download ... --keyserver hkp://keyserver.ubuntu.com