1 Linux 容器简介 #
Linux 容器提供了轻量级虚拟化方法,可在单台主机上同时运行多个虚拟环境(容器)。在 Xen 或 KVM 之类的技术中,处理器会模拟整个硬件环境,超级管理程序会控制虚拟机。而容器则与此不同,它在操作系统级别提供虚拟化,在该级别,内核会控制隔离的容器。
使用容器可将应用程序隔离在自给性单元中。
容器提供近乎本机的性能。容器可以根据运行时环境直接使用主机内核,因而可最大程度地减少开销。
可以通过内核控制组(参见第 9 章 “内核控制组”)控制网络接口并在容器内部应用资源。
容器在主机系统的内核中运行,因此无法使用不同的内核或不同的内核版本。
只有基于 Linux 的应用程序才可容器化。
容器不安全,总体安全性取决于主机系统。可以通过 AppArmor 或 SELinux 配置文件保护容器化应用程序。容器比虚拟机更难以保护,因为容器的受攻击面更大。
1.1 Podman 的重要概念和简介 #
尽管 Docker 开源引擎是用于处理映像和容器的流行解决方案,但具备诸多优势的 Podman 可以直接取代 Docker。有关 Podman 的详细信息,请参见第 10 章 “Podman 概述”。本章将会简要介绍重要概念,以及创建容器映像并使用它来运行容器的基本过程。
基本的 Podman 工作流程如下:
在本地计算机或云服务中运行容器通常涉及以下步骤:
提取基本映像,方法是将其从注册表中提取到本地计算机。
创建一个 Dockerfile,并使用它来基于基本映像构建一个自定义映像。
使用创建的映像启动一个或多个容器。
要运行容器,需要有一个映像。映像包含运行应用程序所需的全部依赖项。例如,SLE 基本映像包含选择了极少量软件包的 SLE 发行套件。
尽管可以从头开始创建映像,但很少有应用程序能够在这种空环境中正常运行。因此,在大多数情况下,使用现有的基本映像更为可行。基本映像没有父项,也就是说,它不以其他映像为基础。
尽管您可以使用基本映像来运行容器,但基本映像的主要用途是充当创建自定义映像的基础,自定义映像可以运行包含特定应用程序、服务器、服务等的容器。
基本映像和自定义映像通常都可以通过称作“注册表”的映像储存库获得。除非显式指定了注册表,否则 Podman 将从 Docker Hub 注册表中提取映像。尽管您可以手动提取基本映像,但 Podman 可以在构建自定义映像时自动提取基本映像。
要构建自定义映像,需要创建一个名为 Containerfile 或 Dockerfile 的特殊文件,其中包含构建指令。例如,Dockerfile 可以包含用于更新系统软件、安装所需应用程序、打开特定网络端口、运行命令等的指令。
您不仅可以基于基本映像构建映像,而且可以基于自定义映像构建映像。因此您可以构建由多个层组成的映像:
1.1.1 实际示例 #
以下过程说明如何构建一个可用于运行容器的自定义 Docker 映像,该容器包含通过内置 PHP 开发服务器提供服务的简单 PHP 应用程序 example
。
安装 Podman:
tux >
sudo
zypper in podman切换到 PHP 项目所在的目录,并创建一个名为
Dockerfile
的文件:tux >
cd exampletux >
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" ]
构建容器映像:
tux >
sudo
podman build -t example .运行容器:
tux >
sudo
podman run -it -p8000:8000 --rm example将浏览器指向
localhost:8000
以访问容器中运行的应用程序。
请注意,SUSE 不为第三方映像(例如本示例中使用的映像)提供支持。