如何使用Buildah构建OCI和Docker容器图像
在我们进入建筑物的楼宇的业务之前,我相信灌木的一点清除是值得的,因为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": {} },