1 Linux 容器简介 #
使用 Linux 内核的名称空间和内核控制组功能,可将容器与主机系统的其余组件和其他容器隔离开来。Linux 容器提供了轻量级虚拟化方法,可在单台主机上同时运行多个隔离环境。与 Xen 和 KVM 通过虚拟化层执行完整的 Guest 操作系统不同,Linux 容器共享并直接使用主机操作系统内核。与通用虚拟机环境相比,这可以减少访问操作系统资源所需的开销,并提供更好的整体性能。
使用容器可将应用程序隔离在自给性单元中。
容器提供接近本机的性能,因为与虚拟化和仿真相比,其内核开销更低。
可以通过内核控制组 (cgroup) 控制网络接口并在容器内部应用资源。
可以实现可移植性并简化应用程序开发,因为容器包含所有必要的库、依赖项和所需文件。
容器在主机系统的内核上运行,因此容器必须使用主机提供的特定内核版本。
只有基于 Linux 的应用程序才可容器化。
容器封装特定体系结构(例如 x86_64 或 aarch64)的二进制文件。因此,为 x86_64 制作的容器只能在 x86_64 系统主机上运行。
容器本身并不比在容器外部执行二进制文件更安全,容器的整体安全性取决于主机系统。虽然可以通过 AppArmor 或 SELinux 配置文件来保护容器化应用程序,但容器安全性需要部署工具和策略来确保容器基础结构和应用程序的安全性。
1.1 Podman 的重要概念和简介 #
尽管 Docker 开源引擎是用于处理映像和容器的流行解决方案,但具备诸多优势的 Podman 可以直接取代 Docker。有关 Podman 的详细信息,请参见第 11 章 “Podman 概述”。本章将会简要介绍重要概念,以及创建容器映像并使用它来运行容器的基本过程。
基本的 Podman 工作流程如下:
在本地计算机或云服务中运行容器通常涉及以下步骤:
提取基本映像,方法是将其从注册表中提取到本地计算机。
创建一个 Dockerfile,并使用它来基于基本映像构建一个自定义映像。
使用创建的映像启动一个或多个容器。
要运行容器,需要有一个映像。映像包含运行应用程序所需的全部依赖项。例如,SLE 基本映像包含选择了极少量软件包的 SLE 发行套件。
尽管可以从头开始创建映像,但很少有应用程序能够在这种空环境中正常运行。因此,在大多数情况下,使用现有的基本映像更为可行。基本映像没有父项,也就是说,它不以其他映像为基础。
尽管您可以使用基本映像来运行容器,但基本映像的主要用途是充当创建自定义映像的基础,自定义映像可以运行包含特定应用程序、服务器、服务等的容器。
基本映像和自定义映像通常都可以通过称作“注册表”的映像软件源获得。除非显式指定了注册表,否则 Podman 将从 Docker Hub 注册表中提取映像。尽管您可以手动提取基本映像,但 Podman 可以在构建自定义映像时自动提取基本映像。
要构建自定义映像,需要创建一个名为 Containerfile 或 Dockerfile 的特殊文件,其中包含构建指令。例如,Dockerfile 可以包含用于更新系统软件、安装所需应用程序、打开特定网络端口、运行命令等的指令
您不仅可以基于基本映像构建映像,而且可以基于自定义映像构建映像。因此您可以构建由多个层组成的映像:
1.1.1 实际示例 #
以下过程说明如何构建一个可用于运行容器的自定义 Docker 映像,该容器包含通过内置 PHP 开发服务器提供服务的简单 PHP 应用程序 example
。
安装 Podman:
>
sudo
zypper in podman切换到 PHP 项目所在的目录,并创建一个名为
Dockerfile
的文件:>
cd example>
touch Dockerfile打开
Dockerfile
文件进行编辑,在其中添加以下代码:FROM php:7.4-cli COPY . /usr/src/example WORKDIR /usr/src/example EXPOSE 8000 CMD [ "php", "-S", "0.0.0.0:8000" ]
构建容器映像:
>
sudo
podman build -t example .运行容器:
>
sudo
podman run -it -p 8000:8000 --rm example将浏览器指向
localhost:8000
以访问容器中运行的应用程序。
请注意,SUSE 不为第三方映像(例如本示例中使用的映像)提供支持。