大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
简单介绍 Linux 容器是一种轻量级“虚拟化”方法,用于在单个控制主机上同一时候执行多个虚拟装置(容器)。还有一个可用来描写叙述 Linux 容器所执行的操作的术语是“容器化”。 Linux 容器提供操作系统级别的虚拟化,当中的内核控制隔离的容器。容器通过内核控制组 (cgroup) 和内核命名空间进行隔离。通过 Xen 和 KVM 等其它完整虚拟化解决方式,虚拟化子系统可模拟完整的硬件环境。
Apache Web server就是一个 Linux 容器使用案例。通过 Xen 或 KVM 等超级管理程序,用户能够在虚拟机上安装 SUSE Linux Enterprise Server 和 Apache。虚拟机的引导方式与不论什么物理计算机的引导方式一样,首先进行开机自检 (POST) 以将控制传递给 bootloader (GRUB),然后,Bootloader 将载入 Linux 内核并启动 init 进程以针对定义的执行级别载入全部服务和守护程序,比如 Apache。
在 SUSE Linux Enterprise Server 上执行的 Apache Web server的 Linux 容器与超级管理程序演示样例大相径庭。对于 SUSE Linux Enterprise Server 和 Apache,须要在 Linux 容器中安装的软件包较少。最明显不须要安装的软件包是 Linux 内核。还有一个差别是引导进程。使用 Linux 容器,引导进程从 init 进程開始,该进程将针对定义的执行级别载入全部服务(比如网络)和守护程序(比如 Apache)。Linux 容器不须要硬件 POST(启动 GRUB 并载入 Linux 内核)就可以执行。
使用 Linux 容器有两大主要优点。首先,因为在容器引导进程中不须要 POST、Bootloader 和内核,因此容器能够很高速地启动。第二,相比执行超级管理程序的虚拟机,容器将使用更少的server物理资源。这意味着在单个物理系统中能够启动很多其它的容器。
Linux 容器的一个缺点是:容器须要使用主机系统的内核。也就是说,假设主机是 SUSE Linux Enterprise Server 时,容器将无法执行 Microsoft Windows。
本文将重点介绍与 Linux 容器相关的重要术语;阐述 SUSE Linux Enterprise Server 11 SP3 中 Linux 容器的体系结构;讨论 Linux 容器使用入门;还提供了一些有关 SUSE Linux Enterprise Server 中的 Linux 容器的未来的一些见解。
术语
- chroot — change root(chroot 或 change root jail)是文件系统中的一个部分,它与文件系统的其余部分相互隔离。基于此目的,chroot 命令用于更改文件系统的根。在此类“chroot jail”中执行的程序无法訪问指定文件夹树以外的文件。
- cgroups — 内核控制组(通常称为“cgroup”)是一种内核功能,同意将任务(进程)及其全部子项聚合或分区到按层次组织的组中,以隔离资源。
- 容器 — 主机server上的一个“虚拟机”,可执行不论什么 Linux 系统。比如 openSUSE、SUSE Linux Enterprise Desktop 或 SUSE Linux Enterprise Server。
- 容器名称 — 容器的名称。该名称由 lxc 命令使用。
- 内核命名空间 — 为一组进程隔离某些资源(比如文件系统、网络、用户及其它)的一项内核功能。
- Linux 容器主机server — 一种系统,包括 Linux 容器系统并通过 cgroup 提供容器和管理控制功能。
- 资源管理 — cgroup 子系统提供一些能够指派的參数,并控制容器使用内存、磁盘 I/O 和网络通讯等系统资源的方式。
结构概览
Linux 容器不须要超级管理程序。这与类型 1 或类型 2 超级管理程序不同,后两者中的超级管理程序层位于硬件层之上。从概念上讲,可将 Linux 容器视为经过改进的 chroot 技术,该技术利用 Linux 中的额外功能来创建强大但轻量的虚拟化选项,该选项差点儿可将全部容器内容与 Linux 容器主机server隔离开来。
chroot 环境可分隔文件系统,从而使容器看起来是在文件系统的根上执行,但实际上文件系统储存在 Linux 容器主机server内的文件夹中。SUSE Linux Enterprise Server 11 SP3 的默认位置是将容器文件系统储存在 /var/lib/lxc/<container name> 中。也能够将容器文件系统储存在虚拟磁盘映像中。这不是储存 rootfs 的默认方法,而是 lxc.conf 手冊页中介绍的高级配置选项。
lxc 手冊页会提到将 Linux 容器用作应用程序容器或系统容器。眼下,SUSE Linux Enterprise Server 11 SP3 仅支持设置系统容器。系统容器是安装大部分 SUSE Linux Enterprise Server 操作系统文件的位置,这些文件安装在即将成为容器的根的文件夹中。应用程序容器仅包括特定于要在容器中执行的应用程序的文件和库。全部其它文件和库将通过 Linux 容器主机文件系统使用。设置应用程序容器不如设置系统容器easy,但它是 SUSE Linux Enterprise Server 上的 Linux 容器的未来目标。
能够将 Linux 容器中的网络分隔,这意味着容器能够有自己的 IP 地址。网络分隔通过在 SUSE Linux Enterprise Server 中使用 Linux 桥接来实现。Linux 桥接技术与用于 SUSE Linux Enterprise Server 上的 Xen 和 KVM 中的网络的桥接技术同样。使用 brctl 命令询问并与 Linux 容器主机server上的网桥交互。
控制组是最有趣的组件。它们是 Linux 容器所使用的 Linux 内核中的一项功能,由于它能够提供容器资源管理和控制。控制组不是特定于 Linux 容器的,而是被加入�到 Linux 内核版本号 2.6.24 中的。与控制组的交互过程的第一步是将一个或多个控制组子系统安装为虚拟文件系统并使用回应命令定义单个控制组容器。能够启动 Linux 进程 ID(PID 或任务)或将其移动到新创建的 Cgroup 容器中。Cgroup 子系统能够控制指派给容器的进程的非常多方面。能够将特定设备和单个 CPU 隔离到容器中。控制子系统能够冻结/解冻并收集容器中的 CPU 使用信息。能够使用资源管理子系统在容器内动态定义容器的 CPU 使用、内存以及进程的块设备 IO。全部这些都能够通过将參数回应到容器的虚拟文件系统中的文件来完毕。使用控制组听起来非常困难。但 Linux 容器正是一个让控制组的使用变得简单的项目。您能够在“Linux 容器使用入门”部分阅读到相关内容。
在使用 Linux 容器时,还须要全然理解另外一个体系结构项,即“安全”。有一点须要提醒,Linux 主机server的内核供全部容器使用。这意味着:能够从容器内部使用 Linux 系统调用攻击,从而升级对 Linux 容器主机server的訪问。社区中有多个不同的选项能够帮助解决此问题。当中一个选项是称为 seccomp 的内核安全功能,seccomp 代表“security computing”(安全计算)。Linux 容器社区使用 seccomp2 和相关的 libseccomp2 库以环绕容器创建沙箱,从而限制容器使用系统调用。另外两个选项是使用 SELinux 和 AppArmor。全部三个选项都已通过 SUSE project部的批阅,可用于将来的 SUSE Linux Enterprise Server 版本号。
Linux 容器使用入门 首先从已经注冊和全然安装了增补程序的 SUSE Linux Enterprise Server 11 SP3 系统開始。安装 GNOME 这种 GUI 将使得 YaST 模块的使用变得easy简单,但不须要 GUI。有一项要点须要注意:创建 Linux 容器须要具备已定义的而且可用的储存库。建议您注冊 Linux 容器主机server,以便在创建容器时已正确设置安装和更新储存库,而且储存库可用。
Linux 容器须要在 Linux 容器主机上安装多个软件包。使用 YaST 或 Zypper 安装 lxc、yast2-lxc、sles-lxcquick_en-pdf 和 bridge-utils。YaST 或 Zypper 可能还会加入�另外一些相关软件包。虽然 sles-lxcquick_en-pdf 不是核心,但它包括 Linux 容器 quickstart PDF,该容器位于 /usr/share/doc/manual/sles-lxcquick_en-pdf/SLES-lxcquick_en.pdf。 使用 YaST 网络设置模块设置网桥。通常,主机上第一个网桥的默认名称是“br0”。
SUSE 已创建了 Linux 容器 YaST 模块。此模块使您能够轻松创建、删除、启动、停止容器以及连接到容器。启动 Linux 容器 YaST 模块时,它会自己主动报告来自 lxc-createconfig 的输出。除文件功能通常显示为禁用以外,全部功能都显示为已启用。假设报告不论什么错误或出现红色文字,则必须在创建和启动第一个容器之前解决这些问题。
假设更习惯使用命令行,则 Linux 管理员能够非常轻松地使用“lxc-”命令与不论什么容器进行交互。如前面提到的那样,lxc-checkconfig 命令能够验证控制组虚拟文件系统和子系统是否已正确安装,以及全部内容是否均已正确配置,能够执行容器。lxc-createconfig 和 lxc-create 可定义容器并基于 Linux 容器模板将 SUSE Linux Enterprise Server 安装到容器中。能够对模板进行自己定义,以加入�其它要安装到容器中的软件包。模板文件位于 /usr/share/lxc/templates 中。
lxc-start 和 lxc-stop 命令简单明了。管理员可以使用 lxc-console 连接到在后台启动的容器。lxc-ls、lxc-info 和 lxc-ps 命令使管理员可以列出容器中的进程、获取进程信息并查看进程。还有更多 lxc 命令,但最后一个须要重点介绍一下的 lxc 命令是 lxc-cgroup。此命令控制容器的资源管理环节,包含设置 CPU、内存和块 I/O 限制。
Outlook 借助 SUSE Linux Enterprise Server 12,我们将从“lxc”Linux 容器框架切换到 libvirt-lxc。这意味着:用于管理 Xen 和 KVM 的同样库和工具(比如 virt-manager)将用于管理 Linux 容器。
有关安全的一些补充。seccomp2 将是 SUSE Linux Enterprise Server 12 的一部分。使用 seccomp2,Linux 容器可以环绕容器创建沙箱,以限制应用程序可以在容器内实施的系统调用的类型。此外,还支持 SELinux 和 AppArmor,并可将其用于保护 Linux 容器对 SUSE Linux Enterprise Server 12 Linux 容器主机server的訪问。SUSE Linux Enterprise Server 12 将附带 AppArmor 配置文件。
SUSE Linux Enterprise Server 12 将支持应用程序容器。应用程序容器使用 libvirt-lxc 来创建容器和 seccomp2/SELinux/AppArmor 组合,以对在容器内执行的应用程序进行沙箱操作。
我们还会介绍 Docker 项目,这是一个基于 Linux 容器构建的框架。请看来自 Docker 项目站点的引言:“它是一个轻量级框架(具有功能强大的 API),可提供在容器中构建和部署应用程序的生命周期。”Docker 可提供映像储存库并简化容器使用。Docker 将成为 SUSE Linux Enterprise Server 12 中的一个技术概览,也就是说,能够对 Docker 进行測试,但不建议用于生产。
总结 Linux 容器提供了还有一个“虚拟化”选项,该选项既有优势也有局限。Linux 容器的优势包含:
- 通过容器隔离应用程序和操作系统
- 与全然虚拟化超级管理程序相比,没有虚拟化开销
- 提供接近本机的性能,由于 Linux 容器可以实时管理资源分配
- 通过 cgroup 控制网络接口并在容器内应用资源管理
Linux 容器的局限
- 在主机系统的内核中执行,不能使用不同的内核
- 仅同意“虚拟机”操作系统
- 不是完整的虚拟化堆栈,这与 SUSE Linux Enterprise Server 中相同包含的 Xen 或 KVM 不同,由于它们是完整的虚拟化堆栈
- 必须了解 SUSE Linux Enterprise Server 11 中 Linux 容器的安全性。假设您须要全然安全的系统,请将 KVM 或 Xen 与 SUSE Linux Enterprise 11 SP3 结合使用。SUSE Linux Enterprise Server 12 将为 Linux 容器加入�额外的安全功能。
下面是另外几个有关 Linux 容器的使用案例想法:
- 为用户/开发者 (root) 提供訪问权限,但不提供对“真实”系统的完整 (root) 訪问
- 对有获取系统上全部资源的倾向的应用程序进行限制,就像数据库通常对内存运行的操作一样,或者像计算敏感型应用程序对 CPU 所运行的操作一样
- 针对没有很多其它虚拟化技术的特定客户,保证一组应用程序有特定数量的资源 (SLA!)
- 当难以获取实验室硬件时,在低端server上运行 DHCP/DNS、安装server和 SMT(订购管理工具)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118857.html原文链接:https://javaforall.cn