容器在云中运行。这是因为容器技术允许网站和 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 条评论