维基百科,自由的百科全书  

操作系统层虚拟化英语:Operating system–level virtualization),亦称容器化英语:Containerization),是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。

这个软件实例,也被称为是一个容器(containers),虚拟引擎(Virtualization engine),虚拟专用服务器(virtual private servers)或是 jails。对每个行程的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

操作系统层虚拟化之后,可以实现软件的即时迁移(Live migration),使一个软件容器中的实例,即时移动到另一个操作系统下,再重新运行起来。但是在这种技术下,软件即时迁移,只能在同样的操作系统下进行。

类Unix操作系统中,这个技术最早起源于标准的chroot机制,再进一步演化而成。除了将软件独立化的机制之外,内核通常也提供资源管理功能,使得单一软件容器在运作时,对于其他软件容器的造成的交互影响最小化。

相对于传统的虚拟化(Virtualization),容器化的优势在于占用服务器空间少,通常几秒内即可引导。同时容器的弹性可以在资源需求增加时瞬时复制增容,在资源需求减小时释放空间以供其他用户使用。由于在同一台服务器上的容器实例共享同一个系统内核,因此在运行上不会存在实例与主机操作系统争夺RAM的问题发生,从而能够保证实例的性能。

 

相关技术

 

LXC

 

 操作系统层虚拟化 随笔

LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。[1]

在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要引导任何虚拟机。

LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件Docker被用来管理LXC的环境。

 

OpenVZ

OpenVZ是基于Linux内核操作系统操作系统级虚拟化技术。OpenVZ允许物理服务器运行多个操作系统,被称虚拟专用服务器(VPS,Virtual Private Server)或虚拟环境(VE,Virtual Environment)。

VMware这种虚拟机Xen这种硬件辅助虚拟化技术相比,OpenVZ的主机与客户系统都必须是Linux(虽然在不同的虚拟环境里可以用不同的Linux发行版)。但是,OpenVZ声称这样做有性能上的优势。根据OpenVZ网站的说法,使用OpenVZ与使用独立的实体服务器相比,性能只会有1-3%的损失。

OpenVZ的Linux客户系统其实是共享OpenVZ主机Linux系统的内核,也就意味着OpenVZ的Linux客户系统不能升级内核。

OpenVZ是SWsoft, Inc.公司开发的专有软件Virtuozzo(Virtuozzo虚拟机还支持Windows客户系统)的基础。OpenVZ的授权为GPLv2

OpenVZ由两部分组成,一个经修改过的操作系统核心与一套用户工具。

但是,基于OpenVZ的Linux虚拟机/Linux VPS可能配置起来不如基于KVM的Linux虚拟机/Linux VPS灵活。例如,OpenVZ虚拟机/VPS无法更新内核;不支持部分软件;其不能升级内核的限制也可能会给Linux的发行版升级带来麻烦。

 

Docker

Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]

Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirtLXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,

依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。

 

 

chroot 技术

hroot是在unix系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。chroot这一特殊表达可能指chroot(2)系统调用或chroot(8)前端程序。

由chroot创造出的那个根目录,叫做“chroot监狱”(chroot jail,或chroot prison)。

 

FreeBSD jail

FreeBSD jail,一种操作系统层虚拟化技术,在FreeBSD操作系统中运作。利用这个技术,FreeBSD的系统管理者,可以创造出几个小型的软件系统,这些软件系统被称为监狱(jails)。

这个技术被Poul-Henning Kamp采纳,加入FreeBSD系统中。2000年,伴随FreeBSD 4.0版的发布,正式对外公开。系统管理者可以使用jail(8)这个命令来调用这个服务。

这个技术的目标是:

  1. 虚拟化:每个软件监狱(jail)都是在主机机器上执行的一个虚拟环境,有它自己的档案系统,行程,使用者与超级使用者的账户。在软件监狱内运行的行程,它面对的环境,跟实际的操作系统环境几乎是一样的。
  2. 安全性:每个软件监狱都是独立运作,与其他软件监狱隔离,因此能够提供额外的安全层级。
  3. 容易删除及创建:因为每个软件监狱的运作范围有限,这使得系统管理者可以在不影响整体系统的前提下,以超级使用者的权限,来删除在软件监狱下运作的行程。

这个技术是基于类Unix系统下的chroot机制,进一步发展而来。chroot jail限制行程只能存取某个部分的档案系统,但是FreeBSD jail机制限制了在软件监狱中运作的行程,不能够影响操作系统的其他部分。也就是说,在软件监狱中的行程,是运作在一个沙盒上。

 

 

cgroups

cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个行程组群资源(如CPU、内存、磁盘输入输出等)。

这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为行程容器(process containers)[1]。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去[2]。自那以后,又添加了很多功能。

功能

cgroups的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程(像nice)到操作系统层虚拟化(像OpenVZLinux-VServerLXC)。cgroups提供:

  • 资源限制:组可以被设置不超过设定的内存限制;这也包括虚拟内存[3] [4]
  • 优先级:一些组可能会得到大量的CPU[5] 或磁盘IO吞吐量。[6]
  • 结算:用来衡量系统确实把多少资源用到适合的目的上。[7]
  • 控制:冻结组或检查点和重启动。

 

Linux Namespace

Linux Namespace是Linux提供的一种内核级别环境隔离的方法。不知道你是否还记得很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。

Namespace

系统调用参数

隔离内容

UTS

CLONE_NEWUTS

主机名与域名

IPC

CLONE_NEWIPC

信号量、消息队列和共享内存

PID

CLONE_NEWPID

进程编号

Network

CLONE_NEWNET

网络设备、网络栈、端口等等

Mount

CLONE_NEWNS

挂载点(文件系统)

User

CLONE_NEWUSER

用户和用户组

 

 

 

 

Linux内的各种层,还显示了在用户空间内核空间之间的分离。
用户模态 用户应用 例如:BashLibreOfficeGIMPBlender0 A.D.Mozilla Firefox
低层系统构件 系统守护进程
systemdrunit,logind,networkd,PulseAudio
窗口系统
X11WaylandSurfaceFlinger
其他库
GTK+QtEFLSDLSFMLFLTKGNUstep
图形
MesaAMD Catalyst
C标准库 open(),exec(),sbrk(),socket(),fopen(),calloc(),... (直到2000个子例程)
glibc目标为POSIX/SUS兼容,uClibc目标为嵌入式系统,bionic
内核模态 Linux内核 statsplicedupreadopenioctlwritemmapcloseexit等(大约380个系统调用)
Linux内核系统调用接口(SCI,目标为POSIX/SUS兼容)
进程调度子系统 IPC子系统 内存管理子系统 虚拟文件子系统 网络子系统
其他构件:ALSADRIevdevLVMdevice mapperLinux Network SchedulerNetfilter
Linux安全模块SELinuxTOMOYOAppArmorSmack
硬件(CPU内存数据存储设备等。)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄