近年来,容器迅速流行起来。然而,容器背后的技术已经存在了相对较长的时间。2001年,Linux引入了一个名为VServer的项目。VServer 是第一次尝试在高度隔离的单个服务器内运行完整的进程集。
从 VServer 开始,隔离进程的想法进一步发展,并围绕 Linux 内核的以下功能正式化:
-
Namespaces 命名空间隔离通常对所有进程可见的特定系统资源。在命名空间内,只有属于该命名空间成员的进程才能看到这些资源。命名空间可以包括网络接口、进程 ID 列表、挂载点、IPC 资源和系统的主机名信息等资源。
-
Control groups (cgroups) 控制组将进程集及其子进程划分为组,以管理和限制它们消耗的资源。控制组对进程可能使用的系统资源量进行限制。这些限制使一个进程不会在主机上使用太多资源。
-
Seccomp Seccomp 于 2005 年开发并于 2014 年左右引入容器,它限制了进程使用系统调用的方式。Seccomp 为进程定义了一个安全配置文件,其中列出了允许它们使用的系统调用、参数和文件描述符。
-
SELinux Security-Enhanced Linux (SELinux) 是进程的强制访问控制系统。Linux 内核使用 SELinux 来保护进程免受彼此的影响,并保护主机系统免受其正在运行的进程的影响。进程作为受限的 SELinux 类型运行,对主机系统资源的访问权限有限。
所有这些创新和功能都集中在一个基本概念上:使进程能够隔离运行,同时仍然访问系统资源。这个概念是容器技术的基础,也是所有容器实现的基础。如今,容器是 Linux 内核中的进程,利用这些安全功能来创建一个隔离的环境。该环境禁止隔离进程滥用系统或其他容器资源。
容器的一个常见用例是在同一主机中拥有同一服务(例如,数据库服务器)的多个副本。每个副本都有独立的资源(文件系统、端口、内存),因此服务不需要处理资源共享。隔离保证故障或有害服务不会影响同一主机或底层系统中的其他服务或容器。
从 Linux 内核的角度来看,容器是一个有限制的进程。但是,容器运行的不是单个二进制文件,而是一个镜像。映像是一个文件系统包,其中包含执行进程所需的所有依赖项:文件系统中的文件、已安装的包、可用资源、正在运行的进程和内核模块。
就像可执行文件是运行进程的基础一样,镜像是运行容器的基础。运行的容器使用镜像的不可变视图,允许多个容器同时重用同一个镜像。由于镜像是文件,它们可以通过版本控制系统进行管理,从而提高容器和镜像供应的自动化程度。
容器镜像需要在本地可用,以便容器运行时执行它们,但镜像通常存储和维护在镜像存储库中。镜像存储库只是一种服务(公共或私有),可以在其中存储、搜索和检索镜像。镜像存储库提供的其他功能包括远程访问、镜像元数据、授权或镜像版本控制。
有许多不同的镜像存储库可用,每一个都提供不同的功能:
- Red Hat Container Catalog
- Red Hat Quay
- Docker Hub
- Google Container Registry
- Amazon Elastic Container Registry
容器、镜像和镜像注册表需要能够相互交互。例如,您需要能够构建镜像并将它们放入镜像注册表中。您还需要能够从镜像注册表中检索镜像并从该镜像构建容器。
Podman 是一个开源工具,用于管理容器、容器镜像以及与镜像注册表交互。它提供以下主要功能:
它使用开放容器倡议(OCI)指定的镜像格式。这些规范定义了一种标准的、社区驱动的、非专有的镜像格式。
Podman 将本地镜像存储在本地文件系统中。这样做可以避免不必要的客户端/服务器架构或在本地机器上运行守护进程。
Podman 遵循与 Docker CLI 相同的命令模式,因此无需学习新的工具集。
Podman 与 Kubernetes 兼容。Kubernetes 可以使用 Podman 来管理其容器。
REFERENCES