容器在云中运行,这是因为容器技术允许网站和 Web 应用程序随着需求的增加而产生新的副本,它们是数以亿计的人可以使用热门网站而不会让这些网站在全球流量压力下崩溃的原因。

容器是一种 Linux 技术,这意味着它们依赖于cgroups Linux 内核独有的代码(特别是命名空间),因此当您运行容器时,您就是在运行 Linux,使用来自 quay.io 和 dockerhub.io 等站点的容器镜像,大多数人构建特定于他们的应用程序或用例的新容器。

但这让一些人想知道:如果我的容器来自一个开发人员构建在另一个开发人员的容器之上,那么这些在哪里?

容器从何而来?

您可以从头开始构建容器,并且有一个很棒的开源工具Buildah 可以帮助您完成它。

如何使用Buildah在 Linux 上构建自己的容器_linux

容器规格

容器源于 Linux 容器 (LXC) 和 Docker 等项目,而开放容器倡议 (OCI) 维护了容器的正式规范,符合 OCI 定义的正确组装的容器可以在任何符合 OCI 的容器引擎上运行,例如 Podman、Docker、CRI-O 等。

安装 Buildah

在 Fedora 和 CentOS 上,您可能已经安装了 Buildah。如果没有,您可以使用包管理器安装它:

$ sudo dnf install buildah

在 Debian 和基于 Debian 的系统上:

$ sudo apt install buildah

配置 Buildah

因为 Buildah 创建容器,所以为它配置环境与为 Podman 配置相同。无论您是否使用 Podman,在继续之前将您的系统配置为“无根”podman 。

从无到有构建容器

要构建一个全新的容器,以任何人以前的工作为基础,您使用特殊名称scratch 告诉 Buildah 您要创建一个空容器。该scratch 名称不是图像名称。这是您使用现有图像作为工作基础的豁免。

$ buildah from scratch

这个默认命名working-container 的新容器包含少量元数据,几乎没有其他内容,现在它在后台秘密运行。您可以使用containers 子命令查看它:

$ buildah containers
CONTAINER ID BUILDER ID IMAGE NAME CONTAINER NAME
dafc77921c0c * scratch working-container

要运行容器,您必须首先使用unshare 子命令(除非您以 root 身份运行 Buildah):

$ buildah unshare

确认您的工作容器没有任何功能(在这种情况下预期响应失败):

$ buildah run working-container sh
ERRO[0000] container_linux.go:349: starting container process caused "exec: \"sh\": executable file not found in $PATH"

添加到您的容器

要将命令添加到您的容器,您必须先挂载它。~/.local 默认情况下,容器图像存储在您的目录中:

$ buildah mount working-container
~/.local/share/containers/storage/overlay/b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f/merged

将容器安装到您的~/.local 目录(或/var/lib/containers/ 以 root 身份运行)后,您可以使用包管理器添加包。–releasever 必须与您在构建容器时运行的发行版相匹配。

[ Fedora ] $ sudo dnf install --installroot \
~ / .local / share / containers / storage / overlay / b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f / merged\
--releasever 33 \
bash coreutils\
--setopt install_weak_deps = false -y

添加包的确切方法取决于您的发行版和它使用的包管理器。例如,在我的 Slackware 桌面上,我使用installpkg:

[Slack]$ installpkg --root ~/.local/share/containers/storage/overlay/b76940e6fe4efad7a0adca3b5399ee12055ddd733bbe273120dcae36a2e6c12f/merged \
/tmp/bash-5.0.17-x86_64-1_SMi.txz

现在你可以运行容器并尝试一些简单的事情,比如启动一个 shell:

$ buildah run working-container bash
# bash --version
GNU bash, version 5.0.17(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

配置你的容器

该buildah config 子命令使您可以访问常用属性,例如您希望容器在启动时运行的默认命令、设置环境变量、设置默认 shell、定义作者、架构和主机名等等。例如,假设您添加了一个包含名为 的 shell 脚本的包motd.sh,并且您希望它在容器启动时运行:

$ buildah config --author "Seth Kenlon" \
--os "Slackware" --shell /bin/bash \
--cmd /usr/bin/motd.sh working-container

分发你的容器

构建完容器后,可以使用commit 子命令将其保存为图像。

$ buildah commit working-container my_image

用 Buildah 构建它

容器有时看起来很神奇,但它们并不神奇,它们是从头开始构建的,并且足够灵活,一旦图像存在,其他人就可以使用它来构建新的容器和容器图像,以填补不同的利基。没有必要从头开始,但如果您好奇图像是如何开始的,或者您想尝试创建一个特定于您的要求的图像,那么 Buildah 是可以使用的工具。