2 SLE 基本容器映像 #
2.1 SLE 基本容器映像简介 #
SLE 基本容器映像 (SLE BCI) 是基于 SUSE Linux Enterprise Server 15 的精简映像,可用于开发、部署和共享应用程序。SLE BCI 有两种类型:
通用 SLE BCI 可用于构建自定义容器映像和部署应用程序。
语言堆栈 SLE BCI 为以特定编程语言开发应用程序和部署这些应用程序提供精简的环境。
除此之外,我们还提供基于 SLE BCI 的应用程序容器镜像,其中包含 Nginx、PostgreSQL、MariaDB 和 RMT 等流行的容器化应用程序。
2.1.1 高亮显示数 #
SLE BCI 与 SUSE Linux Enterprise Server 完全兼容,但无需订阅即可运行和分发。
当主机操作系统以 FIPS 模式运行时,SLE BCI 会自动以 FIPS 兼容模式运行。
每个 SLE BCI 都包含 RPM 数据库,因此可以审计容器映像的内容。您可以使用 RPM 数据库来确定任意给定文件所属的 RPM 软件包的特定版本。这可以确保容器映像不容易受到已知漏洞和已修复漏洞的影响。
所有 SLE BCI(不包含
zypper
的 SLE BCI 除外)都附带container-suseconnect
服务。因此,在已注册的 SLES 主机上运行的容器可以访问完整的 SLES 软件源。当您首次运行zypper
时会自动调用container-suseconnect
,该服务会将正确的 SLES 软件源添加到正在运行的容器中。在未注册的 SLES 主机或非 SLES 主机上,该服务不执行任何操作。
2.1.2 通用 SLE BCI #
有四个通用 SLE BCI,其中每个容器映像附带最少量的一组软件包,以保持较小的大小。可将通用 SLE BCI 用作构建自定义容器映像的起点,或用作部署特定软件的平台。有关通用 SLE BCI 的详细信息,请参见第 2.3 节 “BCI-Base、BCI-Minimal、BCI-Micro 和 BCI-BusyBox”。
2.1.3 语言堆栈 SLE BCI #
语言堆栈 SLE BCI 构建在 BCI-Base 通用 SLE BCI 的基础之上。每个容器映像附带 zypper
堆栈和免费的 SLE_BCI
软件源。此外,每个映像包含用于在特定语言环境中构建和部署应用程序的最常用工具。这包括编译器或解释器等工具,以及特定于语言的软件包管理器。有关语言堆栈 SLE BCI 的详细信息,请参见第 2.4 节 “语言堆栈 SLE 基本容器映像”。
2.1.4 有关状态和生命周期的重要说明 #
除基本映像以外的其他所有容器映像目前都分类为技术预览,SUSE 不为它们提供官方支持。此信息会在 registry.suse.com 网站上显示。此外,还会通过 com.suse.supportlevel
标签来指示某个容器映像是否仍处于技术预览状态。可以使用 skopeo 和 jq 实用程序检查所需 SLE BCI 的状态,如下所示:
❯ skopeo inspect docker://registry.suse.com/bci/bci-micro:15.4 | jq '.Labels["com.suse.supportlevel"]' "techpreview" ❯ skopeo inspect docker://registry.suse.com/bci/bci-base:15.4 | jq '.Labels["com.suse.supportlevel"]' "l3"
在上面的示例中,bci-micro
容器映像中的 com.suse.supportlevel
标签设置为 techpreview
,表示该映像仍处于技术预览状态。另一方面,bci-base
容器映像完全支持 l3。与通用 SLE BCI 不同,语言堆栈 SLE BCI 可能不遵循 SLE 分发包的生命周期:只要相应的语言堆栈能够获得支持,语言堆栈 SLE BCI 就受支持。换言之,新版本的 SLE BCI(由 OCI 标记表示)可能会在 SLE Service Pack 的生命周期内发布,而旧版本可能不受支持。请访问 suse.com/lifecycle 确定相关容器是否仍受支持。
2.1.5 入门 #
可以直接从 registry.suse.com 以 OCI 兼容容器映像的形式获取 SLE BCI,并可以像使用任何其他容器映像一样使用它们。例如,使用某个通用容器:
>
podman run --rm -it registry.suse.com/bci/bci-base:15.4 grep '^NAME' /etc/os-release
NAME="SLES"
或者,可以如下所示在 Dockerfile 中使用 SLE BCI:
FROM registry.suse.com/bci/bci-base:15.4 RUN zypper -n in python3 && \ echo "Hello Green World!" > index.html ENTRYPOINT ["/usr/bin/python3", "-m", "http.server"] EXPOSE 8000
然后可以构建容器映像,方法是使用 docker build .
或 buildah bud .
命令:
>
docker build . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM registry.suse.com/bci/bci-base:15.4 ---> e34487b4c4e1 Step 2/4 : RUN zypper -n in python3 && echo "Hello Green World!" > index.html ---> Using cache ---> 9b527dfa45e8 Step 3/4 : ENTRYPOINT ["/usr/bin/python3", "-m", "http.server"] ---> Using cache ---> 953080e91e1e Step 4/4 : EXPOSE 8000 ---> Using cache ---> 48b33ec590a6 Successfully built 48b33ec590a6>
docker run -p 8000:8000 --rm -d 48b33ec590a6 575ad7edf43e11c2c9474055f7f6b7a221078739fc8ce5765b0e34a0c899b46a>
curl localhost:8000 Hello Green World!
2.2 为何使用选择 SLE 基本容器映像 #
SLE BCI 提供一个平台用于创建基于 SLE 的自定义容器映像和可任意分发的容器化应用程序。SLE BCI 具有与 SLES 相同的可预测企业生命周期。SLE_BCI 15 SP3 和 SP4 软件源(SLE 软件源的子集)使 SLE BCI 能够访问 4,000 个适用于 AMD64/Intel 64、AArch64、ppc64le 和 s390x 体系结构的软件包。软件源中的软件包享有 SUSE 的质量保证并接受其安全审计。以 FIPS 模式在主机上运行时,容器映像符合 FIPS 规范。除此之外,SUSE 还可以通过 SUSE 订阅计划为 SLE BCI 提供官方支持。
- 安全性
SLE_BCI 软件源中的每个软件包都接受安全审计,SLE BCI 受益于与 SLES 相同的 CVE 处理机制。所有发现和修复的漏洞将通过电子邮件、专门的 CVE 页面以 OVAL 和 CVRF 数据的形式公布。为确保供应链的安全,所有容器映像均已使用 Notary v1、Podman 的 GPG 签名和 Sigstore Cosign 进行签名。
- 可靠性
由于 SLE BCI 基于 SLE,因此它们的稳定性和质量保证级别与 SUSE Linux Enterprise Server 相同。类似于 SLES,SLE BCI 可以通过维护更新来获得 bug 修复、改进和安全补丁。
- 工具和集成
SLE BCI 旨在为 hub.docker.com 上的流行容器映像提供直接替代项。您可以使用通用 SLE BCI 及其提供的现成工具来创建自定义容器映像,而语言堆栈 SLE BCI 为构建容器化应用程序提供基础和所需的工具。
- 重新分发
BCI 的 EULA 规定较为宽松,您可以基于 BCI 重新分发自定义容器映像。
2.3 BCI-Base、BCI-Minimal、BCI-Micro 和 BCI-BusyBox #
SUSE 提供多个通用 SLE 基本容器映像,这些映像可用作部署目标或用作创建自定义映像的基础:BCI-Base、BCI-Minimal、BCI-Micro 和 BCI-BusyBox。这些映像采用通用的 SLES 基础,并且它们都不随附特定的语言或应用程序堆栈。所有映像具有 RPM 数据库(即使特定的映像不包含 RPM 软件包管理器),该数据库可用于校验映像中每个文件的来源。每个映像包含 SLES 证书分发包,已部署的应用程序可以通过该分发包使用系统的证书来校验 TLS 连接。
2.3.1 快速概览 #
下表提供了 BCI-Base、BCI-Minimal、BCI-Micro 和 BCI-BusyBox 之间的差异的快速概览。
2.3.2 BCI-Base 和 BCI-Init:需要灵活性时 #
此 SLE BCI 附带 Zypper 软件包管理器和一个免费的 SLE-BCI 软件源。这样,您便可以安装软件源中提供的软件并在构建期间自定义映像。该映像的缺点在于其大小。它是最大的通用 SLE BCI,因此它不一定是最佳的部署映像选项。
名为 BCI-Init 的 BCI-Base 变体中预安装了 systemd。在需要通过 systemd 在单个容器中管理服务的方案中,BCI-Init 容器映像可能很有用。
2.3.3 BCI-Minimal:不需要 Zypper 时 #
这是 BCI-Base 映像的精简版本。BCI-Minimal 不包含 Zypper,不过其中安装了 RPM 软件包管理器。这样就大幅减小了该映像的大小。但是,虽然 RPM 可以安装和去除软件包,但它缺乏对软件源和自动依赖项解析的支持。因此,BCI-Minimal 映像旨在用于创建部署容器,然后在容器中安装所需的 RPM 软件包。尽管您可以安装所需的依赖项,但需要手动下载和解析这些依赖项。不过,不建议采用这种方法,因为它很容易出错。
2.3.4 BCI-Micro:需要部署静态二进制文件时 #
此映像类似于 BCI-Minimal,但不包含 RPM 软件包管理器。该映像的主要用例是部署在外部生成的或者在多阶段构建期间生成的静态二进制文件。由于没有直截了当的方法可以在容器映像中安装其他依赖项,因此我们建议仅在最终构建工件捆绑了所有依赖项并且不存在外部运行时要求(例如 Python 或 Ruby)时,才使用 BCI-Minimal 映像来部署项目。
2.3.5 BCI-BusyBox:需要最小的映像且无需 GPLv3 授权时 #
类似于 BCI-Micro,BCI-BusyBox 映像仅附带最基本的工具。但是,这些工具是由 BusyBox 项目提供的。其好处是可以进一步减小大小。此外,该映像不包含 GPLv3 授权的软件。使用该映像时,请记住 BusyBox 工具和 GNU Coreutils 之间存在一些差异。因此,针对使用 GNU Coreutils 的系统编写的脚本可能需要经过修改才可用于 BusyBox。
2.3.6 大致大小 #
以下列表提供了每个 SLE BCI 的大致大小供您参考。请记住,提供的数字是粗略估计值。
BCI-Base
~94 MBBCI-Minimal
~42 MBBCI-Micro
~26 MBBCI-BusyBox
~14 MB
2.4 语言堆栈 SLE 基本容器映像 #
如果您在容器方面有一定的实践知识,那么使用 SLE BCI 就不会有任何难度。但是,SLE BCI 有一些与类似产品(例如基于 Debian 或 Alpine Linux 的映像)不同的特性。了解细节有助于在尽可能短的时间内发挥 SLE BCI 的最大作用。
2.4.1 语言堆栈 SLE BCI #
语言堆栈 SLE BCI 构建在 BCI-Base 的基础之上。下面是可用语言堆栈 SLE BCI 的概览。
- python
标记:3.6、3.9、3.10
随附标记中指定的 python3 版本和 pip3、curl、git 工具。
- 节点
标记:12、14、16
随附标记中指定的 nodejs 版本,以及 npm 和 git。可以使用
npm install -g yarn
命令安装 yarn 软件包管理器。
- openjdk
标记:11、17
随附 OpenJDK 运行时。旨在用于部署 Java 应用程序。
- openjdk-devel
标记:11、17
除了 OpenJDK 运行时之外,还包括 OpenJDK 的开发部分。默认入口点是
jshell
外壳,而不是 Bash。
- ruby
标记:2.5
基于 Ruby 2.5 的标准开发环境,包含 ruby、gem 和 bundler,以及 git 和 curl。
- golang
标记:1.16、1.17、1.18
随附标记中指定的 go 编译器版本。
- dotnet-runtime
标记:3.1、5.0、6.0
包括 Microsoft 的 .NET 运行时和 Microsoft .NET 软件源。
- dotnet-aspnet
标记:3.1、5.0、6.0
随附 Microsoft 的 ASP.NET 运行时和 Microsoft .NET 软件源。
- dotnet-sdk
标记:3.1、5.0、6.0
随附 Microsoft 的 .NET 和 ASP.NET SDK,以及 Microsoft .NET 软件源。
- rust
标记:1.56、1.57、1.58、1.59
随附 Rust 编译器和 cargo 软件包管理器。
2.4.2 软件包管理器 #
SUSE Linux Enterprise 中的默认软件包管理器是 Zypper。与 Debian 中的 APT 和 Alpine Linux 中的 APK 类似,Zypper 为所有软件包管理任务提供一个命令行界面。下面是常用的容器相关 Zypper 命令的简要概览。
- 安装包
zypper --non-interactive install 软件包名称
- 添加软件源
zypper --non-interactive addrepo 软件源 URL;
zypper --non-interactive refresh
- 更新所有软件包
zypper --non-interactive update
- 去除软件包
zypper --non-interactive remove --clean-deps 软件包名称
(--clean-deps
标志确保同时去除不再需要的依赖项)- 清理临时文件
zypper clean
有关使用 Zypper 的详细信息,请参见 https://documentation.suse.com/sles-15/html/SLES-all/cha-sw-cl.html#sec-zypper。
所述的所有命令都使用 --non-interactive
标志来跳过确认,因为在容器构建期间您无法手动同意这些提示。请记住,必须将该标志与任何修改系统的命令一起使用。另请注意,--non-interactive
不是一个“全部为是”标志。--non-interactive
确认用户的意图。例如,如果某个附带 --non-interactive
选项的安装命令需要导入新的软件源签名密钥,则该命令将会失败,因为该操作应该由用户自己来校验。
2.4.3 常用软件集 #
下面几个示例可让您大致了解如何在 SLE BCI 中以不同于 Debian 的方式完成某些任务。
- 去除孤立的软件包
Debian:
apt-get autoremove -y
SLE BCI:只要您使用
zypper --non-interactive remove --clean-deps 软件包名称
去除已安装的软件包,就不需要去除孤立的软件包
- 获取容器的体系结构
Debian:
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"
SLE BCI:
arch="$(uname -p|sed 's/x86_64/amd64/')"
- 安装编译所需的软件包
Debian:
apt-get install -y build-essential
SLE BCI:
zypper -n in gcc gcc-c++ make
- 校验 GnuPG 签名
Debian:
gpg --batch --verify 签名 URL 要校验的文件
SLE BCI:
zypper -n in dirmngr; gpg --batch --verify 签名 URL 要校验的文件; zypper -n remove --clean-deps dirmngr; zypper -n clean
2.4.4 软件包命名约定 #
SUSE Linux Enterprise 软件包命名约定不同于 Debian、Ubuntu 和 Alpine,而是更类似于 Red Hat Enterprise Linux。主要差别在于库的开发软件包(即包含报头和构建描述文件的软件包)在 SUSE Linux Enterprise 中命名为 PACKAGE-devel,而在 Debian 和 Ubuntu 中则是命名为 PACKAGE-dev。如有疑问,请直接使用以下命令搜索软件包:docker run --rm registry.suse.com/bci/bci-base:OS_VERSION zypper search 软件包名称
(请将 OS_VERSION 替换为相应的服务版本号,例如:15.3
或 15.4
)。
2.4.5 添加 GPG 签名密钥 #
将外部软件源添加到容器或容器映像通常需要导入用于对软件包进行签名的 GPG 密钥。可以使用 rpm --import 密钥 URL
命令来执行导入操作。这会将密钥添加到 RPM 数据库,然后可以安装软件源中的所有软件包。