【译】使用rust来写一个容器(一)

  1. 1. 容器介绍
    1. 1.1. 关于这个系列
    2. 1.2. 关于这个教程
    3. 1.3. 什么是容器?
      1. 1.3.1. 概述
        1. 1.3.1.1. 用途
      2. 1.3.2. 目标
        1. 1.3.2.1. 可移植性
        2. 1.3.2.2. 隔离性
      3. 1.3.3. 容器化的直观展示
      4. 1.3.4. 容器=隔离的软件
    4. 1.4. 常见容器
      1. 1.4.1. Docker
      2. 1.4.2. Linux Containers (LXC)

本文章为对 Litchi Pi《Writing a container in Rust》的翻译转载,不享受任何著作权利,不用于任何商业目的,不以任何许可证进行授权,不对任何转载行为尤其是商业转载行为负责。一切权利均由原作者 Litchi Pi 保有。个人翻译能力有限,如有疑问可查看原文。

容器介绍

关于这个系列

这个系列的博客文章的目标是理解什么是容器、它是如何工作的,我们将使用 Rust 从零开始创建和管理容器。
我们会在Linux containers in 500 lines of code系列的基础上,通过rust语言来重新实现自己的container容器 。
首先,为了让我们理解如何构建容器。我们先了解什么是容器以及为什么我们需要容器,然后我们再了解一下一些常见的容器。

关于这个教程

这个教程可以用以下形式选择性阅读:

  • 作为在构建有趣项目的同时熟练掌握 Rust 的编程指南。
    你不需要有任何经验就可以跟随这个指南来进行编程。请将这本书添加到您浏览器的书签中,在后续过程中,它可能对您理解正在进行的事情起到重要的辅助作用。
  • 作为如何使用 Linux 内核功能在容器中实现高级别安全性和隔离性的详细示例。
    如果你的目的是了解这些信息,那么你可以直接跳过代码部分,因为在代码部分之前我就会对这些内容做出解释。

    请记住,在创建这个项目时我(作者)也正在学习中,所以如果文章有错误的部分也是在所难免的,如果你对文章内容存在疑问,可以通过互联网以及我在文章中提供的参考链接地址来找到答案。

这个系列主要是我用于了解 Linux 安全措施、虚拟化功能、容器化工作原理以及使用 Rust 翻译用 C 语言编写的程序并与 Linux 内核交互的能力的一种方式。 对我来说幸运的是,这方面有很多文档、视频、文章等可以供我参考。

我建议我的读者把我的文章和原始文章来回对照,以获取更加精确的解释,以及各种外链(请检查脚注)

什么是容器?


概述

容器是一个隔离的执行环境,提供要执行的软件和底层操作系统之间的抽象。 它可以看作是一个软件虚拟化进程。
因此,我们基本上只需要告诉容器“嘿,在一个隔离的盒子里执行那个东西”,控制器就会创建一个看起来像系统的盒子,应用程序会在这个盒子中合理的进行配置并执行。

用途

许多服务器都使用了容器化方案,因为它为 DevOps 工程师提供了极大的灵活性和可靠性。
此外在容器化环境中,如果软件崩溃、资源紧张甚至被黑客入侵的情况发生也不会损害整个系统以及在其上运行的所有其他服务。
注意: 目前的服务器除了容器化方案,也广泛采用了虚拟机方案。

目标

Linux系统无处不在,并且掌控着数字世界,只不过即便同样是Linux系统,嵌入在汽车传感器上的Linux与桌面、Web服务器或超级计算机上的Linux也并不相同。

容器化解决了程序员的程序在微服务互联网、云以及在各种各样形式的计算机(台式机、笔记本电脑、智能手机、智能手表等智能设备)上运行的问题。

可移植性

可移植性是指软件可在各种环境下无兼容性问题运行的能力。容器是实现可移植性的一种解决方案,它常被用在不修改安装系统的情况下的软件移植工作。因此,可以在不安装软件的情况下运行那些软件,并对其进行配置以适应系统;只需要运行一个已安装在系统上的容器,让它来处理软件即可。

下文来自Docker官方网站

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.
容器是一个标准的软件单位,它将代码及其所有依赖项打包在一起,使得应用程序能在一个运行环境中快速可靠地运行到另一个运行环境中。Docker 容器镜像是一个轻量级、独立的可执行软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。

OK,这是一个在不考虑底层兼容性问题的前提下就可以我们的软件的好办法,它可以让我们在不同的服务器、笔记本电脑甚至嵌入式设备上开发和部署服务,而不会出现各种问题。这个功能至关重要。

隔离性

容器化应用程序与底层操作系统具有隔离的执行环境,类似于虚拟机。在Docker文档中也对容器和虚拟机的区别做了解释:

Containers and virtual machines have similar resource isolation and allocation benefits, but function differently because containers virtualize the operating system instead of hardware.
容器和虚拟机具有类似的资源隔离和分配作用,但它们的功能不同,因为容器对操作系统而非硬件做了虚拟化。

因此,我们可以以管理员权限运行软件,并且可以在不会损害我们的系统的情况下执行任何操作。尽管理论上来说这是安全的,但实际上安全将取决于很多因素。包括为了避免容器逃逸(就像我们希望避免虚拟机逃逸一样)做的实现。如果想深入了解这部分内容,有一篇很好的文章《理解 Docker 容器逃逸》可供参考。

容器化的直观展示

OK,其实这个图在很多方面都存在错误。但是我们也能直观的看出,一个系统可以通过不同的方式实现可移植性和隔离功能。实际上,CPU/SoC 硬件具有简化虚拟化的功能,Linux 内核下以及内部的软件栈也有相应的功能,这里我就不再详细讨论这些细节了。

另外有一点值得注意,我们可以通过一系列Linux的库和内核服务使用虚拟化功能,在我们这个系列的文章中也将广泛使用这些功能来进行实现。

不同的容器一般使用他们各自的不同的容器化类型,例如LXC能够执行系统级虚拟化,而Docker则实现应用程序级别的虚拟化。

容器=隔离的软件

我们所说的“软件隔离”,是指一系列让软件在系统内部运行,但不允许它改变那个系统的措施。因此,我们希望可以制定规则来禁止该软件访问未经授权的文件、使用未获许可的系统功能、修改系统配置、阻碍或改变性能等。
这个目的能通过很多种方式进行实现,不过总的来讲,都是通过在软件的环境中采取各种强安全措施来屏蔽软件对底层系统的感知来实现的。
所以容器本质上只是通过一组安全措施与系统隔离的应用程序而已。

常见容器

事实上,对于容器业界存在许多种不同的解决方案,用以创建、执行以及管理容器,我们这边只讨论最著名的两个软件:DockerLXC。 你也可以去维基百科查阅更多其他容器解决方案。

Docker

Docker是最流行的的容器技术,于 2013 年作为开源发布,一直是 DevOps 在微服务和云计算方面不可或缺的基础工具之一。
其关键特性之一是能够以单个镜像的形式创建容器,并且可以将其存储或发布在 DockerHub 等平台上。它的使用方式和API非常高级,添加特殊配置和外围设备访问相当简单,是一个专注于运行应用程序的容器。
如果你想了解更多信息,请访问其官方网站或查阅文档

Linux Containers (LXC)

LXC 曾经是Docker的骨干部分,它使用内核特性来隔离和容器化一个应用程序,而且能在不需要另一个Linux内核的情况下尽可能创建接近标准Linux发行版的运行环境。

若要获取更多信息,可以访问linuxcontainers.org网站,其中包括LXD、LXCFS和其他相关工具的信息。