基本上,几乎所有主流软件,甚至是开源软件,都是在基于镜像的容器技术出现之前设计的。这意味着把软件放到容器里就相当于一个平台端口。这也意味着有些程序可以很容易地迁移,而另一些则比较困难。大约三年半前,我开始使用基于图像的容器。到目前为止,我已经容器化了很多应用程序。我了解了什么是现实,什么是迷信。今天,我想简单介绍下Linux容器是如何设计的,并谈谈镜像签名。Linux容器是如何设计的让大多数人对基于镜像的Linux容器感到困惑的是,它将操作系统分为两部分:内核空间和用户空间。在传统操作系统中,内核运行在您无法直接与之交互的硬件上。用户空间是你真正可以交互的地方,包括所有你可以通过文件浏览器或运行ls命令可以看到的文件、类库和程序。当你使用ifconfig命令调整IP地址时,实际上是在使用一个用户空间程序,让内核根据TCP协议栈发生变化。这常常让没有学习过Linux/Unix基础知识的人感到惊讶。过去,用户空间中的类库支持与内核交互的程序(如ifconfig、sysctl、tuned-adm)和面向用户的程序,如网络服务器和数据库。所有这些东西都堆积在一个文件系统结构中。用户可以在/sbin或/lib文件夹中找到所有操作系统本身支持的程序和类库,或者所有面向用户的程序或类库都可以在/usr/sbin或/usr/lib文件夹中找到(参见文件系统层次结构标准)。这种模式的问题是操作系统程序和业务支持程序之间没有绝对的分离。/usr/bin中的程序可能依赖于/lib中的库。如果应用程序所有者需要更改某些内容,则很可能会破坏操作系统。相反,如果负责安全更新的团队需要更改类库,它(通常)有可能破坏面向业务的应用程序。真是一团糟。借助Docker、LXD、RKT等基于图像的容器,应用程序所有者可以打包和调整放置在/sbin、/lib、/usr/bin和/usr/lib中的所有依赖项,而不必担心破坏底层操作系统。本质上,容器技术再次干净利落地将操作系统分为两部分:内核空间和用户空间。现在开发者和运营者可以独立更新自己的东西。然而,有一些令人不安的事情。通常,每个应用程序所有者(或开发人员)都不想负责更新这些应用程序依赖项:如openssl、glibc或非常低级的基础结构组件,如XML解析器、JVM,或处理与性能相关的设置。过去,这些问题委托给运营团队。由于我们在容器中打包了很多依赖项,因此对许多组织而言,对容器内的所有内容负责仍然是一个严重的问题。将现有应用程序迁移到Linux容器将应用程序放入容器就是平台移植,我将重点说明为什么将某些应用程序移植到容器如此困难。(使用容器)开发人员现在可以完全控制/sbin、/lib、/usr/bin、/usr/lib中的内容。然而,他们面临的挑战是,他们仍然需要将数据和配置放在/etc或/var/lib文件夹中。对于基于图像的容器来说,这是一个糟糕的主意。我们真正需要的是代码、配置和数据的分离。我们希望开发人员将代码放在容器中,而数据和配置则通过不同的环境(例如开发、测试或生产环境)获取。这意味着当我们(或平台)实例化容器时,我们需要在/etc或/var/lib中挂载一些文件或文件夹。这将允许我们移动容器并仍然从环境中获取数据和配置。听起来很酷吧?这就是问题所在,我们需要能够清楚地分离配置和数据。许多现代开源软件,如Apache、MySQL、MongoDB、Nginx默认都这样做。但许多自主开发的、遗留的或专有的程序默认情况下并不是这样设计的。对于许多组织来说,这是一个主要的痛点。开发人员的最佳实践是开始构建新的应用程序并移植遗留代码以完成配置和数据的完全隔离。介绍ImageSigningTrust机制是容器的一个重要课题。容器镜像签名允许用户为镜像添加数字指纹。然后可以通过密码算法测试来验证此指纹。这允许容器镜像的用户验证其来源和信任。容器社区经常使用“容器镜像”这个词,但这个术语可能会让人很困惑。Docker、LXD和RKT提倡获取远程文件以作为容器运行的概念。这些技术各自以不同的方式处理容器镜像。LXD使用单层来捕获单个容器,而Docker和RKT使用基于开放容器映像(OCI)的格式,它可以由多个层组成。不幸的是,在某些情况下,不同的团队和组织负责容器镜像中的不同层。隐含在容器镜像概念中的是容器镜像格式的概念。拥有OCI等标准图像格式将使容器生态系统围绕图像扫描、签名和在不同云服务提供商之间传输而蓬勃发展。现在是签名。容器有问题,我们在里面放了一堆代码、二进制文件和库。打包代码后,我们将其与必要的文件服务器(注册服务器)共享。只要代码是共享的,它基本上是匿名的,缺少某种加密签名。更糟糕的是,容器镜像通常由不同的人或团队控制的单个镜像层组成。每个团队都需要能够检查前一个团队的工作,添加自己的工作,并在上面盖上自己的批准印章。然后他们需要移动到下一个团队。容器镜像(由许多镜像组成)的最终用户需要检查监管链。他们需要验证向其添加文件的每个团队的可信度。对于最终用户来说,对容器镜像中的每一层都有信心是非常重要的。
