面向Docker用户的Podman和Buildah

尽管有很多关于Podman和Buildah的优秀博客和教程,但是Docker用户显然缺乏关于如何切换到Podman的清晰明了的解释,为什么在其他此类问题中也需要Buildah。



我们将尝试回答这些问题,并告诉您如何从Docker无缝迁移到Podman。

Docker如何工作


让我们首先阐明Docker的工作原理,以了解Podman和Buildah为何诞生。 如您所知,Docker命令仅在Docker守护进程运行时才起作用。 恶魔的想法似乎是在一个地方收集Docker所做的所有很棒的工作,同时组织有用的API以便将来使用。 如下图所示,Docker守护程序包含执行以下任务所需的所有功能:

  • 使用图像注册表时的推拉操作;
  • 在本地容器存储中创建图像副本,并在这些容器中添加图层;
  • 提交容器更改并从主机上的本地存储库中删除容器映像;
  • 请求OS内核在相应的名称空间,cgroup等中启动容器。

本质上,Docker守护进程负责处理注册表,映像,容器和内核的所有工作。 您只需通过命令行界面(CLI)告诉他该怎么做。



当一切都在一个恶魔过程中组装时,这里我们不会权衡这种方法的利弊。 可以提出许多有利于他的论点,并且在Docker出现时,它是非常合理的。 但是,随着Docker的积极使用,他开始出现疑问,例如:

  • 单一过程意味着单一故障点。
  • 守护进程拥有所有子进程(正在运行的容器)。
  • 当恶魔离开时,子进程仍然是孤儿。
  • 容器组件上有安全孔;
  • 要执行任何Docker操作,用户需要完整的root特权。

还有其他投诉。 有人可能不同意这一说法,或者说这些缺点已经消除,但我们不会争论。 Podman开发人员认为他们已经设法解决了许多此类问题,如果您想利用Podman的优势,那么本文非常适合您。

Podman的本质是不通过守护程序而是直接通过负责启动容器的runC进程与映像注册表,容器和映像存储以及Linux内核进行交互。



既然我们已经部分了解了Podman开发人员的动机,那么现在该讨论向Podman过渡对用户意味着什么。 在这里,我们需要了解和阐明(我们将在下面做)以下内容:

  • Podman取代了Docker。 同时,不再需要启动某种守护进程,例如Docker守护进程。
  • 熟悉的Docker命令在Podman中的工作方式相同。
  • Podman不会将容器和映像存储在与Docker相同的位置。
  • Podman和Docker映像兼容;
  • 在Kubernetes环境中,Podman的功能不只是Docker。
  • 我们还将分析Buildah是什么以及为什么需要它。

Podman安装


如果您使用Docker,则可以在决定进行切换时将其删除。 但是,您可以在尝试Podman时离开Docker。 这里有一些有用的课程和出色的演示 ,对于初学者来说可能很有用,以帮助您更好地理解过渡过程。 该演示中的一个示例要求Docker显示兼容性。

要在Red Hat Enterprise Linux 7.6或更高版本上安装Podman,请使用以下命令: 如果您使用的是Fedora,则将yum替换为dnf:

# yum -y install podman 

Podman使用与Docker相同的命令


Podman的设计易于从Docker切换到。 因此,您从Docker认识的所有团队在Podman中的工作方式都相同。 此外,有人认为,如果您创建适当的别名,则Docker调用脚本应该可以正常工作,例如:alias docker = podman-试试看。 当然,在此之前,您需要停止Docker(systemctl停止docker)。 此外,您可以安装podman-docker软件包,该软件包将为您进行所有必要的转换。 它只是将一个脚本放入/ usr / bin / docker中,该脚本使用与Docker使用相同的参数来运行Podman。

常见的Docker命令(例如pull,push,build,run,commit,tag等)都在Podman中。 有关更多信息,请参见Podman手册。 一个重要的区别是,在Podman中,某些团队添加了方便标记,例如,podman rm和podman rmi命令的--all(-a)标志,很多人会发现它们非常有用。

此外,Podman可以以普通用户身份运行,而无需root特权。 是的,到目前为止,这仅在Fedora和Podman 1.0中有效,并且在RHEL中应该从7.7和8.1版本开始出现。 由于用户空间保护方面的改进,使之成为可能。 以普通用户身份运行意味着默认情况下Podman将图像和容器存储在用户的主目录中,我们将在下一部分中对此进行详细讨论。 要了解有关如何在没有root特权的情况下运行Podman的更多信息,请参阅Dan Walsh的文章无根Podman如何工作?

Podman和容器图片


当您第一次输入podman images命令时,您很可能会灰心,因为您不会看到之前已经下载到计算机上的任何Docker映像。 事实是,本地Podman存储库位于/ var / lib / docker文件夹中,而不位于/ var / lib / docker目录中。 这样做不仅是这样,而且是满足OCI(开放容器倡议)标准的新存储结构的一部分。

2015年,Docker,Red Hat,CoreOS,SUSE,Google和其他Linux容器趋势创建者创建了Open Container Initiative,这是一个独立的机构,负责管理容器映像格式及其运行时的标准规范。 作为OCI的一部分,在GitHub上创建了容器/映像和容器/存储项目。

由于Podman可以在没有root特权的情况下运行,因此需要一个单独的位置来记录图像。 因此,Podman存储库位于〜/ .local / share / containers用户主目录中。 这有助于避免出现这样的情况:他们可以在/ var / lib /容器中编写所有内容,并且与其他从安全角度来看很危险的做法有关。 另外,现在每个用户都有自己的独立容器集,以便多个用户可以同时在主机上同时工作。 完成工作后,用户可以将其推送到通用注册表,以使其他人可以使用其图像。

从Docker切换到Podman时,在调试时以及要使用rm -rf / var / lib / containers命令清除本地存储库以重新开始时,了解新的容器位置路径将非常有用。 但是,通过切换到Podman,您很可能会开始对podman rm和podman rmi命令而不是此命令使用新的-all选项。

Podman与其他运行时之间的容器兼容性


尽管本地存储库的位置不同,但Docker和Podman都创建了与OCI标准兼容的容器映像。 Podman可以使用常用的容器注册表,例如Quay.io或Docker Hub,以及双向(推和拉)的私有注册表。 例如,使用Podman,您可以从Docker Hub下载并运行最新的Fedora映像。 如果未指定注册表,默认情况下,Podman将按照该文件中指定的顺序搜索registries.conf。文件中列出的注册表。 最初,此文件中的第一个是Docker Hub注册表。

 $ podman pull fedora:latest $ podman run -it fedora bash 

可以使用Podman下载并运行已使用Docker上传到注册表的图像。 例如,如果我们使用Docker创建了myfedora映像并将其上传到我们的Quay.io(ipbabble)存储库,则可以使用Podman下载它,方法如下:

 $ podman pull quay.io/ipbabble/myfedora:latest $ podman run -it myfedora bash 

Podman允许您使用push和pull命令在/ var / lib / docker和/ var / lib / containers目录之间轻松优雅地移动图像,例如:

 $ podman push myfedora docker-daemon:myfedora:latest 

显然,如果在此示例中省略了docker-daemon,则推送发送将进入Docker Hub。 如果您指定quay.io/myquayid/myfedora,则图像将上传到Quay.io注册表(此处myquayid是我们在Quay.io上的帐户名称):

 $ podman push myfedora quay.io/myquayid/myfedora:latest 

如果您决定准备放弃Docker,则要卸载它,只需关闭守护程序,然后使用软件包管理器删除Docker软件包。 但是在此之前,请确保使用Docker将所需的所有映像下载到外部(而非本地)注册表,以便以后可以从那里下载它们。 或者,您可以使用Podman将它们从本地Docker存储库下载到本地Podman OCI存储库。 例如,在RHEL中,像下面这样完成一个fedora映像的传输:

 # systemctl stop docker # podman pull docker-daemon:fedora:latest # yum -y remove docker # optional 

使用Podman可以轻松切换到Kubernetes


与Docker相比,Podman提供了许多附加功能,这些功能对于使用Kubernetes的开发人员和IT运营商非常有用,特别是Docker根本没有的有用命令。 如果您熟悉Docker并考虑将Kubernetes / OpenShift用作容器平台,那么Podman将派上用场。

Podman可以使用podman generate kube命令基于正在运行的容器生成Kubernetes YAML文件。 在调试运行的Pod时,除了用于处理容器的标准命令外,还可以使用podman pod命令。 有关Podman如何帮助切换到Kubernetes的更多信息,请参见Brent Baude的文章Podman现在可以简化向Kubernetes和CRI-O的过渡。

Buildah-它是什么,为什么


Buildah的出现早于Podman。 这有时使Docker用户感到沮丧:“为什么Podman辩护者突然谈论Buildah? Podman不知道如何建造?”

Podman可以放心地做到这一点,就像Docker一样。 也就是说,可以使用Dockerfile和podman build命令执行组装,也可以启动容器,进行必要的更改,然后提交(执行提交),在容器映像中创建新标签。 在我们的解释中,Buildah是用于创建和管理容器映像的扩展命令集,因此在处理映像时它提供了更好的控制。 Podman构建命令部分包含Buildah功能,并且使用与Buildah本身相同的程序代码进行构建。

使用Buildah的最有效方法是编写Bash脚本来创建映像,就像您为Dockerfile编写的一样。

至于Buildah和Podman出现的时间顺序,事件大致发生如下。 当Kubernetes学习基于OCI标准的CRI-O进行容器运行时时,不再需要Docker守护程序。 也就是说,不再需要在Kubernetes集群的所有节点上安装Docker来运行Pod和容器。 Kubernetes现在可以调用CRI-O,并且它可以直接运行RunC,从而启动容器进程。 但是,如果同时我们不仅要使用相同的Kubernetes集群进行启动,还希望将其用于容器组装(例如,在OpenShift中),那么我们需要一个不依赖Docker守护进程和,因此不需要安装Docker。 此外,这种基于容器/存储和容器/映像项目创建的工具将消除在组装过程中与Docker守护进程的开放套接字相关的安全风险,许多Docker用户都担心这些风险。

Buildah成为了这样一个新工具(名称读作“ build”,模仿项目经理Dan Walsh在波士顿的口音,但发音为“ builder”)。 可以在buildah.io上找到有关Buildah的更多信息,以及本文末尾的博客和链接指南。

如果要使用Buildah,还需要了解更多详细信息:

  1. 创建图像层时,它提供了更精确的控制。 特别是,它允许您执行许多容器用户长期以来一直想做的事情-仅在一层上一次提交许多更改。
  2. Buildah的运行和Podman的运行是两回事。 由于Buildah旨在构建映像,因此它的run命令与Dockerfile中的RUN命令本质上相同。 Buildah的开发商之一威廉·亨利(William Henry)回忆起这种解决方案是如何产生的:“我有点不高兴地发现某些端口或安装架根本无法按我的预期工作。 Dan Walsh(@rhatdan)权衡了一切,并说Buildah根本不应该以这种方式使用容器。 全部,不再有端口映射,也没有安装卷。 我们删除了这些标志,而是使用buildah run来运行构建容器映像时所需的命令,例如buildah run dnf -y install nginx。
  3. Buildah可以从头开始创建图像(临时图像)。 也就是说,从字面上看什么都没有的图像。 实际上,如果您从头开始查看由于buildah而创建的容器存储,将有一个空目录。 从创建仅包含运行应用程序所需的程序包的超轻量级映像的角度来看,这非常有用。

为什么要从头开始构建? 让我们将Java应用程序的开发映像与其在生产环境或登台环境中的映像进行比较。 在开发阶段,映像可能包含Java编译器,Maven和开发人员需要的其他工具。 但是当转换为生产时,只有Java运行时和您的程序包应保留在映像中。 顺便说一句,要删除多余的文件,您根本不需要像DNF / YUM这样的软件包管理器,甚至不需要Bash-您可以通过Buildah CLI界面进行所有操作,如下图所示,传统的多层容器在左侧,单层容器在右侧刮擦图像。 有关更多 详细信息,请参见为Kubernetes构建Buildah容器映像Buildah简介演示



回到年代。 因此,Kubernetes学会了与CRI-O和runC一起工作,在构建过程中,我们堆积了Buildah-一切,从Kubernetes主机上的Docker,您可以拒绝吗? 不,调试仍然存在。 如果主机没有适当的工具,如何解决容器问题? 不要将Docker放在上面,否则我们将再次回到恶魔手中,所有的努力都是徒劳的。 然后Podman进入现场。

即,Podman同时解决了两个问题。 首先,它允许IT操作人员使用熟悉的命令检查容器和图像。 其次,他将这些工具提供给开发人员。 结果,所有Docker用户(无论是开发人员还是操作员)都可以切换到Podman,从容地执行以前使用Docker的任务,并解决一系列新任务。

所需资源:


  • Podman.io和Buildah.io项目的网站。
  • github.com/containers上的项目(建立连接,研究源代码并查看开发中的内容:
    • libpod(Podman);
    • 建筑物
    • 图像(用于处理容器OCI图像的代码);
    • 存储(用于本地存储容器映像的代码)。


有用的链接:


Source: https://habr.com/ru/post/zh-CN467105/


All Articles