2 Linux 容器简介 #
Linux 容器提供了轻量级虚拟化方法,可在单台主机上同时运行多个隔离的虚拟环境。此技术基于用于进程隔离的 Linux 内核命名空间,以及用于资源(CPU、内存、磁盘 I/O、网络等)管理的内核控制组 (cgroup)。
与 Xen 和 KVM 通过虚拟化层执行完整的 Guest 操作系统不同,Linux 容器共享并直接使用主机操作系统内核。
- 使用容器的优势
大小:容器映像应该只包含运行应用程序所需的内容,而虚拟机则包含整个操作系统。
性能:容器提供接近本机的性能,因为与虚拟化和仿真相比,其内核开销更低。
安全性:使用容器可以将应用程序隔离成自给性单元,使其与主机系统的其余组件分开。
资源管理:可以精细控制容器内的 CPU、内存、磁盘 I/O、网络接口等组件(通过 cgroup)。
灵活性:容器映像包含运行应用程序所需的所有必要库、依赖项和文件,因此可以轻松地在多个主机上进行开发和部署。
- 容器的限制
容器共享主机系统的内核,因此容器必须使用主机提供的特定内核版本。
在 Linux 主机上只能容器化基于 Linux 的应用程序。
容器封装特定体系结构(例如 AMD64/Intel 64 或 AArch64)的二进制文件。因此,在不使用仿真的情况下,为 AMD64/Intel 64 创建的容器只能在 AMD64/Intel 64 系统主机上运行。
容器本身并不比在容器外部执行二进制文件更安全,容器的整体安全性取决于主机系统。虽然可以通过 AppArmor 或 SELinux 配置文件来保护容器化应用程序,但容器安全性需要部署工具和策略来确保容器基础架构和应用程序的安全性。
2.1 Podman 的重要概念和简介 #
尽管 Docker 开源引擎是用于处理映像和容器的流行解决方案,但具备诸多优势的 Podman 可以直接取代 Docker。有关 Podman 的详细信息,请参见第 6 章 “Podman 概述”。本章将会简要介绍重要概念,以及创建容器映像并使用 Podman 来运行容器的基本过程。
基本的 Podman 工作流程如下:
在本地计算机或云服务中运行容器通常涉及以下步骤:
提取基本映像,方法是将其从注册表中提取到本地计算机。
创建一个
Dockerfile
,并使用它来基于基本映像构建一个自定义映像。使用创建的映像启动一个或多个容器。
要运行容器,需要有一个映像。映像包含运行应用程序所需的全部依赖项。例如,SLE SLE BCI 基本映像包含选择了极少量软件包的 SLE 发行套件。
尽管可以从头开始创建映像,但很少有应用程序能够在这种空环境中正常运行。因此,在大多数情况下,使用现有的基本映像更为可行。基本映像没有父项,也就是说,它不以其他映像为基础。
尽管您可以使用基本映像来运行容器,但基本映像的主要用途是充当创建自定义映像的基础,自定义映像可以运行包含特定应用程序、服务器、服务等的容器。
基本映像和自定义映像通常都可以通过称作“注册表”的映像储存库获得。除非显式指定了注册表,否则 Podman 将从 openSUSE 和 Docker Hub 注册表中提取映像。尽管您可以手动提取基本映像,但 Podman 可以在构建自定义映像时自动提取基本映像。
要构建自定义映像,必须创建一个名为 Containerfile
或 Dockerfile
的特殊文件,其中包含构建指令。例如,Dockerfile
可以包含用于更新系统软件、安装所需应用程序、打开特定网络端口、运行命令等的指令
您不仅可以基于基本映像构建映像,而且可以基于自定义映像构建映像。因此您可以构建由多个层组成的映像。有关详细信息,请参考第 11 章 “创建自定义容器映像”。