如何使用Buildah构建OCI和Docker容器映像

这是续集。
请从下面的链接下载并以PDF格式支持本文。

以PDF格式下载指南

关门
这是续集。

这是续集。
这是续集。

前言

在我们开始使用Buildah构建图像的业务之前,我认为有必要让Bush感到有点疏远,因为在大多数文章的第一段中,容器化领域可能是术语的迷宫。首先,我将为您提供OCI,Buildah和Docker的概述。

开放式容器倡议(OCI)

嗯,由Docker,CoreOS和其他合作伙伴于2015年6月22日发起的开放容器计划(OCI),从OCI官方网站引用了该协议,它为容器格式和运行时创建了一个开放的行业标准。这是一个轻量级的项目,目的明确。

OCI当前包括两个规范:运行时规范(runtime-spec)和映像规范(image-spec)。运行时规范概述了如何在磁盘上运行解压缩的“文件系统包”。 “文件系统包”是一组以特定方式组织的文件,并包含合规运行时(例如Docker或CRI-O)执行标准操作所需的所有数据和元数据。 。

在较高的级别上,OCI实现下载OCI映像并将其解压缩到OCI运行时文件系统包中。此时,OCI运行时捆绑软件由OCI运行时(例如Docker或CRI-O)运行。现在移至Buildah。

Buildah

Buildah是一个命令行工具,可用于构建与开放容器倡议(OCI)兼容的映像。它可以与Docker,Podman,Kubernetes或任何您喜欢的容器工具一起使用。

Buildah命令类似于Dockerfile中的所有命令。 Buildah的目标是提供一个用于构建容器映像的低级coreutils接口,以便可以在不需要Dockerfile的情况下构建容器。使用Buildah的最强大方法是创建Bash脚本来创建映像,就像创建Dockerfile一样,不需要守护进程。

使用buildah命令,您可以:

  • 从Dockerfile构建容器映像(使用buildah bud)。
  • 从另一个基础映像(来自buildah)或从头开始构建容器(使用buildah from)
  • 检查容器或图像(使用buildah检查)
  • 挂载容器:挂载容器根文件系统以添加或修改内容(buildah挂载)。
  • 创建一个新的容器层(使用buildah commit)。
  • 卸载容器:卸载已安装的容器(buildah umount)。
  • 删除容器(使用buildah rm)或映像(使用buildah rmi)

OCI用简单的英语显示了构建映像的规则,以及运行时如何使用Buildah设置这些规则并使用它们来构建容器映像。那么Doc​​ker是什么?

码头工人

保持简单很难,但是阅读绝对有帮助

在Docker 1.11版本之前,它是一个整体式守护程序。 Monolith运行了一个容器映像下载,容器进程启动,远程API公开,充当日志收集后台程序,所有这些都在一个以root身份运行的集中化进程(源coreos)中打包在一起。尽管这样的集中式体系结构在部署方面具有一些优势,但它发现了其他基本问题。例如,您可能没有遵循Unix进程和特权分离的最佳实践。此外,对于整体式实施,Docker适用于Linux初始化系统(例如upstart和systemd https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html#rkt-vs-docker)难以融入。这将Docker分为多个部分,如Docker 1.11启动后的开篇段落所示。

“我们很高兴地宣布,第一个版本是基于runC™和containerd™构建的Docker Engine 1.11。在此版本中,Docker首次交付了基于OCI技术的运行时,该运行时于2015年6月启动。展示了自从在Linux Foundation下捐赠行业标准容器格式和运行时以来团队的进展。 码头r“。

根据他们(Docker)的观点,将Docker分为一个集中的,独立的工具意味着维护人员更加集中,最终将获得质量更高的软件。

从那时起,containerd处理以前由docker守护程序本身完成的容器的执行。这是确切的流程。用户从docker-cli运行命令。 Docker-cli与Docker守护程序进行通信。 Docker守护程序(dockerd)侦听请求并通过其连接到的容器管理容器生命周期。 containerd接收请求,通过runC启动容器,并运行主机中所有容器的生命周期。 runc是一个CLI工具,用于根据OCI规范创建和运行容器。

安装Buildah

在CentOS 8框中执行以下命令以安装Buildah。安装Podman,以便您可以从头开始运行映像。

sudo dnf update
sudo dnf -y install buildah podman

检查是否已成功安装

$ rpm -q buildah
buildah-1.11.6-4.module_el8.1.0+272+3e64ee36.x86_64

使用Buildah从零开始构建OCI映像

在这里,我们创建了一个仅包含少量容器元数据的映像,并添加了运行简单Apache Web服务器所需的一切。这使您可以逐块构建容器图像。

如前所述,我们使用buildah scratch命令来完成此任务。为了避免出现问题,我们将在此处使用“ root”用户帐户。

brandnewcontainer=$(buildah from scratch)
$ buildah containers

CONTAINER ID  BUILDER  IMAGE ID     IMAGE NAME                       CONTAINER NAME   
e6c2f7b0b567     *                  scratch                          working-container

-- You can also use podamn
$  podman images

上面的命令将创建一个空容器(无图像)。如下安装空容器:

scratchmnt=$(buildah mount $brandnewcontainer)
echo $scratchmnt

/var/lib/containers/storage/overlay/40e7215211b47e8de47991d0dc7be07e0b1b4f48eda25ebaf6ff8ff46c466be5/merged

您可以使用Buildah mount命令安装容器根文件系统。这允许主机访问容器。

然后将包安装到临时映像中。

yum -y group install "Minimal Install" --releasever=8 --installroot=$scratchmnt

安装软件包后。既然您拥有卸载映像并使其独立所需的一切,则可以将其作为单独的容器运行。

$ buildah umount $brandnewcontainer
e6c2f7b0b5679133ad6e0ad6bd74164dac7f357f0076cf6cc819f9ed664236d5

要将图像作为容器运行,您应该能够通过键入以下命令直接从头开始创建的新容器的臂降落:您可以在那里安装其他应用程序。

$ buildah run $brandnewcontainer bash
[[email protected] /]# ls 
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

从上面可以看到,所有目录均可按预期与标准容器一起使用。您可以安装Apache并测试一切正常。

[[email protected] /]# yum install httpd -y

将一个简单的HTML页面添加到默认的Apache文档根目录并退出该容器。

[[email protected] /]# echo "Testing Apache." > /var/www/html/index.html
[[email protected] /]# exit

与其返回主机系统并将httpd作为初始化服务运行,不如设置一些buildah config选项以直接从容器中运行httpd守护程序。

$ buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container
$ buildah config --port 80/tcp working-container
$ buildah commit working-container localhost/firstapache:latest

Getting image source signatures
Copying blob b34ab2705c68 done
Copying config a0c546bc39 done
Writing manifest to image destination
Storing signatures
a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543

一旦buildah完成了映像提交,就摆动Podman并运行:

首先,检查系统上所有可用的映像并获取您感兴趣的映像的ID。

$ podman images

REPOSITORY              TAG      IMAGE ID       CREATED         SIZE   
localhost/firstapache   latest   a0c546bc3927   8 minutes ago   1.68 GB

运行图像

$ podman run -p 8080:80 -d --name apache-server a0c546bc3927
b1d29603542c8f91a289127cee4fa9157962f8fcdda9baa82b335e08a94c0992

您需要做一些事情以确保Apache Web服务器正在提供您之前添加的页面。可以想象,您可以卷曲它并使用浏览器查看结果。请注意,容器端口80绑定到系统端口8080。您可以使用curl进行如下测试:

curl -ik "localhost:8080"
HTTP/1.1 200 OK
Date: Thu, 23 Apr 2020 22:21:54 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Thu, 23 Apr 2020 22:02:43 GMT
ETag: "f-5a3fc6872e6c0"
Accept-Ranges: bytes
Content-Length: 15
Content-Type: text/html; charset=UTF-8      

Testing Apache.

如您所见,Web服务器正在等待并返回预期的响应。正在移动。

Buildah有更多可用工具。您可以删除图像和容器并检查图像和容器。以检查为例,使用“ buildah images”命令列出所有图像,获取ID,然后获取要检查并运行该图像的ID。

$ buildah inspect a0c546bc3927
{
    "Type": "buildah 0.0.1",
    "FromImage": "localhost/firstapache:latest",
    "FromImageID": "a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543",
    "FromImageDigest": "sha256:2060eb441d905934f0aa1749b0d9ed065fd464b30483a963e5719b27836c844d",
    "Config": "{"created":"2020-04-23T22:09:50.515019063Z","architecture":"amd64","os":"linux","config":{"ExposedPorts":{"80/tcp":{}},"Cmd":["/usr/sbin/httpd","-DFOREGROUND"],"Labels":{"io.buildah.version":"1.11.6"}},"rootfs":{"type":"layers","diff_ids":["sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94"]},"history":[{"created":"2020-04-23T22:09:50.515019063Z","created_by":"/bin/sh"}]}",
    "Manifest": "{"schemaVersion":2,"config":{"mediaType":"application/vnd.oci.image.config.v1+json","digest":"sha256:a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543","size":396},"layers":[{"mediaType":"application/vnd.oci.image.layer.v1.tar","digest":"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94","size":1684295168}]}",  
    "Container": "",
    "ContainerID": "",
    "MountPoint": "",
    "ProcessLabel": "",
    "MountLabel": "",
    "ImageAnnotations": null,
    "ImageCreatedBy": "",
    "OCIv1": {
        "created": "2020-04-23T22:09:50.515019063Z",
        "architecture": "amd64",
        "os": "linux",
        "config": {
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Cmd": [
                "/usr/sbin/httpd",
                "-DFOREGROUND"
            ],
            "Labels": {
                "io.buildah.version": "1.11.6"
            }
        },
        "rootfs": {
            "type": "layers",
            "diff_ids": [
                "sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94"
            ]
        },
        "history": [
            {
                "created": "2020-04-23T22:09:50.515019063Z",
                "created_by": "/bin/sh"
            }
        ]
    },
    "Docker": {
        "created": "2020-04-23T22:09:50.515019063Z",
        "container_config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },

它应该会生成大量信息供您消化。

结论

Buildah是一个很酷的工具,可让您从头开始创建图像或将其他图像用作基础。您可以根据需要更改其他图像。到目前为止,我们已经讨论了从头开始构建。感谢您一直使用它。

您可能还会兴奋:

使用Podman设置Docker容器注册表并让我们加密SSL

如何在Ubuntu上安装Podman

在RHEL 7 Linux上安装Docker CE

运行Kubernetes的最小的容器操作系统

在CentOS 8 / CentOS 7上安装CRI-O容器运行时

如何使用Podman和Libpod运行Docker容器

Docker vs CRI-O vs容器

这是续集。
请从下面的链接下载并以PDF格式支持本文。

以PDF格式下载指南

关门
这是续集。

这是续集。
这是续集。

Sidebar