容器在云中运行。这是因为容器技术允许网站和 Web 应用程序随着需求的增加而产生自己的新副本。它们是数亿人可以使用热门网站而这些网站不会在全球流量的压力下崩溃的原因。容器是一种 Linux 技术,这意味着它们依赖于 Linux 内核特有的代码(特别是cgroups
和命名空间),因此当您运行容器时,您实际上是在运行 Linux。使用来自 quay.io 和 dockerhub.io 等站点的容器镜像,大多数人构建特定于其应用程序或用例的新容器。但这让一些人想知道:如果我的容器来自构建在另一个开发人员的容器之上的开发人员,那么这些容器来自哪里?不用担心,这不是无限循环。您可以从头开始构建容器,并且有一个很棒的开源工具叫做Buildah来帮助您完成它。
容器规范
容器发展于 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
目录(或以 root 身份运行时为/var/lib/containers/
),您可以使用包管理器添加包。 --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、定义作者、架构和主机名等等。 例如,假设您添加了一个包含名为motd.sh
的 shell 脚本的包,并且您希望它在容器启动时运行
$ 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 是要使用的工具。
3 条评论