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

时间:2020-02-23 14:30:26  来源:igfitidea点击:

在我们进入建筑物的楼宇的业务之前,我相信灌木的一点清除是值得的,因为Docker化领域可以成为大多数文章的第一个开放段落中的令人迷宫。
首先让我们了解OCI,Buildah和Docker所有这些问题。

开放Docker倡议(OCI)

嗯,从OCI offical引用,由Docker,CoreO和其他合作伙伴于2014年6月22日推出的开放Docker倡议(OCI)是一个轻量级项目,以表达在Docker格式和运行时创建开放行业标准的表达目的。

OCI目前包含两个规格:运行时规范(Runtime-spec)和图像规范(图像规范)。
运行时规范概述了如何运行未包装在磁盘上的"文件系统束"。
"文件系统套写"是一组以某种方式组织的文件,并包含任何兼容运行时(例如Docker和CRI-O)的所有必要数据和元数据,以对其执行所有标准操作。

在高级别的OCI实现下将下载OCI图像,然后将该图像解压缩到OCI运行时文件系统束。
此时,OCI运行时捆绑包将由OCI运行时(例如Docker和CRI-O)运行。
现在搬到了苏拉。

Buildah

Buildah是一个命令行工具,可用于构建符合打开容器计划(OCI)的图像。
它可以与Docker,Podman,Kubernetes或者我们最喜欢的任何容器工具一起使用。

Buildah的命令类似于我们可以在Dockerfile中找到的所有命令。
Buildah的目标也是提供一个较低级Coreutils界面来构建容器图像,允许人们在不需要Dockerfile的情况下构建容器。
最强大的使用方法是编写Bash脚本,以创建图像 - 以类似的方式,我们将在不需要守护程序的情况下编写Dockerfile。

我们可以通过Buildah命令实现以下几点,更重要

从DockerFile(使用Buildah Bud)构建一个容器图像.Build从另一个基础图像(来自墓地)或者从划痕(使用刮擦)检查容器或者图像(使用Buildah检查)安装容器:安装a容器的根文件系统添加或者更改内容(Buildah Mount)。
创建一个新的容器层(使用buildah提交).unmount一个容器:卸载挂载的容器(buildah umount).delete容器(使用buildah rm)或者图像(使用Buildah RMI)

在简单的英语中,OCI列出了构建图像的规则以及CURTIMES应该如何消耗它WHIND Bigherah将其设置并用于构建容器图像。
现在码头是什么?

Docker.

很难保持简洁,但通过肯定会帮助阅读

在Docker版本1.11之前,实施是一款单片守护程序。
Monolith Dit As作为一个包,例如下载容器图像,启动容器进程,开启远程API,并充当日志收集守护程序,所有内容都在作为root(源核心)运行的集中进程中。
这种集中式架构在部署时具有一些好处,但却无法解决其他基本问题。
一个例子是它不遵循UNIX进程和特权分离的最佳实践。
此外,整体实施使Docker难以与Linux Init系统进行适当集成,例如Upstart和Systemd https://coreos.com/rkt/docs/latest/rkt-vs-ot-projects.html#rkt-vs-docker。
这导致Docker分成了不同的部件,可以在推出Docker 1.11之后在下面的开头段落中所示。

"我们很高兴推出Docker Engine 1.11,我们的第一个在RunC™和ContainTD™上构建。
通过此版本,Docker是第一个根据OCI技术发货的运行时,展示团队自2014年6月在Linux基金会下捐赠业界标准的Docker格式和运行时以来的进展。
源码码头"。

根据他们(Docker),将Docker分成专注的独立工具意味着更具专注的维护者和最终的质量软件。

从那时起,ContaintD现在处理先前由Docker守护程序本身完成的容器的执行。
这是精确的流量,用户从Docker-CLI运行命令。
Docker-CLI与Docker守护程序交谈。
Docker守护程序(Dockerd)侦听请求,并通过IT与其接触的Contains管理容器的生命周期。
ContainerD获取请求并通过RUNC启动容器,并在主机内完成所有容器寿命。
RONC简单的是根据OCI规范的用于产卵和运行容器的CLI工具。

安装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

用岩石创建一个OCI图像

其中我们将建立一个没有任何东西的图像,但少量的容器元数据,然后添加它需要运行一个简单的apache webserver的一切。
执行此操作允许我们按块构建容器图像块。

正如早期解释的那样,我们使用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

要将图像作为viewer运行,请提供下面的命令,我们应该能够将其落在我们从头开始创建的新容器的武器中。
我们可以在那里安装其他应用程序。

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

我们可以从上面看到,所有目录都可以在标准容器中期望时提供。
我们可以安装Apache以测试是否正常工作正常。

[Hyman@theitroad /]# yum install httpd -y

在默认Apache文档root中添加一个简单HTML页面并退出容器

[Hyman@theitroad /]# echo "Testing Apache." > /var/www/html/index.html
[Hyman@theitroad /]# exit

回到我们的主机系统,而不是将httpd作为init服务运行,设置一些buildah配置选项以直接从容器运行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 WebServer正在为之前添加的页面提供服务,我们必须做点什么。
我们猜到了,我们可以卷曲甚至使用我们的浏览器来查看结果。
请记住,容器中的端口80已绑定到系统上的端口8080。
我们可以使用卷曲如下测试。

curl -ik "localhost:8080"
HTTP/1.1 200 OK
Date: Thu, 23 Apr 2017 22:21:54 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Thu, 23 Apr 2017 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图像"命令获取其ID,然后捕捉我们希望检查的ID,然后运行:

$buildah inspect a0c546bc3927
{
    "Type": "buildah 0.0.1",
    "FromImage": "localhost/firstapache:latest",
    "FromImageID": "a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543",
    "FromImageDigest": "sha256:2060eb441d905934f0aa1749b0d9ed065fd464b30483a963e5719b27836c844d",
    "Config": "{\"created\":\"2017-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\":\"2017-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": "2017-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": "2017-04-23T22:09:50.515019063Z",
                "created_by": "/bin/sh"
            }
        ]
    },
    "Docker": {
        "created": "2017-04-23T22:09:50.515019063Z",
        "container_config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },