除了 Docker,我们还有哪些选择?

来源 | CSDN
编译 | 弯月 责编 | 张文
头图 | CSDN下载于视觉中国

【编者按】所谓三十年河东,三十年河西,曾经在容器领域叱咤风云的 Docker 如今已风光不再。抛开情怀,我们不得不承认,Docker 已经被后浪拍死在沙滩上了……

大约 4 年前的容器领域,Docker 是唯一的选择。

然而,如今情况已然大不同,Docker 不再是是唯一的选择,它只不过是一个容器引擎而已。我们可以用 Docker 构建、运行、拉取、推送或检查容器镜像,但是这里的每一项任务,都可以用其他工具替代,甚至有些工具比 Docker 还好。

所以,下面就让我们来探索一下这个领域,然后卸载和忘记 Docker 吧。


为什么说不要用 Docker 了?

如果长期以来你一直在使用 Docker,那么说服你考虑其他工具可能需要多费点唇舌。

首先,Docker 是一个整体化的工具,它试图做好所有的事情,但往往只会适得其反。在大多数情况下,我们应该选择专门的工具,它可能只做一件事情,但会做到最好。

可能你因为担心需要学习使用不同的 CLI、不同的 API 或接受不同的概念,所以会害怕使用其他工具。但是,请不用担心。本文介绍的任何工具都可以完美地无缝衔接,因为它们(包括 Docker)都遵循同一个 OCI(OpenContainer Initiative,开放容器计划)规范。OCI 包括容器运行时、容器分发和容器镜像的规范,涵盖了使用容器所需的所有功能。

因为有了 OCI,所以你可以自由选择适合自己的需求的工具,与此同时,你可以继续使用与 Docker 相同的 API 和 CLI 命令。

因此,如果你愿意尝试新工具,那么我们就来比较一下 Docker 与其竞争对手的优缺点和功能,看看是否有必要考虑放弃 Docker,并尝试使用一些新鲜出炉的工具。

容器引擎

 

在比较 Docker 与其他工具时,我们需要分别讨论它的各个组件,首先要讨论的就是容器引擎。

容器引擎是一种工具,它提供了处理镜像与容器的用户界面,这样你就不需要与 SECCOMP 规则或 SELinux 策略苦苦纠缠了。除此之外,容器引擎还可以从远程仓库提取镜像,并将其解压到本地磁盘上。它似乎也运行容器,但是实际上,它的工作是创建容器清单以及镜像层的目录。接着,它将这些文件传递给 runc 或 crun 等容器运行时。

目前有很多容器引擎可供我们使用,不过 Docker 最主要的竞争对手是红帽开发的 Podman。与 Docker 不同,Podman 不需要运行守护进程,也不需要 root 特权,这些都是 Docker 长期以来一直备受关注的问题。从名字就可以看出来,Podman 不仅可以运行容器,还可以运行 pod。

如果你不熟悉 pod 的话,我可以简单介绍一下:pod 是 Kubernetes 的最小计算单元,由一个或多个容器 (主容器与负责支持主容器的 sidercar 容器) 组成。因此,Podman 用户以后可以很轻松地将他们的工作负载迁移到 Kubernetes。

下面,我们通过一个简单的演示来说明如何在一个 Pod 中运行两个容器:

~ $ podman pod create --name mypod~ $ podman pod listPOD ID        NAME    STATUS    CREATED         # OF CONTAINERS   INFRA ID211eaecd307b  mypod   Running   2 minutes ago   1                 a901868616a5 ~ $ podman run -d --pod mypod nginx  # First container~ $ podman run -d --pod mypod nginx  # Second container~ $ podman ps -a --pod CONTAINER ID IMAGE                          COMMAND               CREATED        STATUS            PORTS  NAMES               POD           POD NAME3b27d9eaa35c  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago Up 1 second ago         brave_ritchie      211eaecd307b  mypodd638ac011412 docker.io/library/nginx:latest nginx -g daemon o...  5 minutesago  Up 5 minutes ago         cool_albattani      211eaecd307b mypoda901868616a5 k8s.gcr.io/pause:3.2                                  6 minutesago  Up 5 minutes ago         211eaecd307b-infra  211eaecd307b mypod

最后一点,Podman 提供的 CLI 命令与 Docker 完全相同,因此你只需执行

alias docker=podman

然后就像什么都没有发生过一样。

除了 Docker 和 Podman 之外,还有其他容器引擎,但我并不看好它们的发展,或者不适合用于本地开发。

不过,如果你想对容器引擎有一个较为完整的了解,我也可以介绍一些:

  • LXD:LXD 是 LXC(Linux 容器)的容器管理器(守护进序)。这个工具提供了运行系统容器的能力,而这些系统容器提供了类似于虚拟机的容器环境。该工具比较小众,没有太多用户,所以除非你有非常特殊的用例,否则最好还是使用 Docker 或 Podman。

  • CRI-O:如果在网上搜索 cri-o 是什么,你可能会发现它被描述成了一种容器引擎。但实际上,它是一种容器运行时。它既不是容器引擎,也不适合“常规”使用。我的意思是说,它是专门作为 Kubernetes 运行时(CRI)而创建的,并不是给最终用户使用的。

  • rkt:rkt(读作“rocket”)是 CoreOS 开发的容器引擎。这里提到这个项目只是为了清单的完整性,因为这个项目已经结束了,它的开发也停止了,因此你不应该再使用它。

构建镜像

 

对于容器引擎,实际上 Docker 的替代品只有一种选择(即 Podman)。但是,在构建镜像方面,我们有很多选择。

首先,我们来看一看 Buildah。这也是一款红帽开发的工具,可以很好地与 Podman 协同工作。如果你已经安装了 Podman,可能会注意到 podman build 子命令,因为它的二进制文件已经包含在 Podman 中了,实际上这个命令只是经过包装的 Buildah。

至于功能,Buildah 沿用了 Podman 的方针:没有守护进程,不需要 root 特权,而且生成的是符合 OCI 的镜像,因此你的镜像的运行方式与使用 Docker 构建的镜像完全相同。它还能使用 Dockerfile 或 Containerfile 构建镜像, Dockerfile 与 Containerfile 实际上是同一个东西,只是叫法不同罢了。除此之外,Buildah 还提供了对镜像层更精细的控制,支持提交大量的变更到单个层。我认为,它与 Docker 之间有一个出乎意料的区别(但这个区别是好事),那就是使用 Buildah 构建的镜像特定于用户,因此你可以只列出自己构建的镜像。

你可能会问,既然 Podman CLI 中已经包含了 Buildah,为什么还要使用单独的 Buildah CLI 呢?其实,Buildah CLI 是 podman build 所包含的命令的超集,因此你可能不需要直接使用 BuildahCLI,但是通过使用它,你可能会发现一些额外的功能。

下面,我们来看一个示例:

~ $ buildah bud -f Dockerfile . ~ $ buildah from alpine:latest  # Create starting container - equivalent to"FROM alpine:latest"Getting image source signaturesCopying blob df20fa9351a1 doneCopying config a24bb40132 doneWriting manifest to image destinationStoring signaturesalpine-working-container # Name of the temporary container~ $ buildah run alpine-working-container -- apk add--update --no-cache python3  # equivalentto "RUN apk add --update --no-cache python3"fetchhttp://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gzfetchhttp://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz... ~ $ buildah commit alpine-working-containermy-final-image  # Create final imageGetting image source signaturesCopying blob 50644c29ef5a skipped: already existsCopying blob 362b9ae56246 doneCopying config 1ff90ec2e2 doneWriting manifest to image destinationStoring signatures1ff90ec2e26e7c0a6b45b2c62901956d0eda138fa6093d8cbb29a88f6b95124c ~ # buildah imagesREPOSITORY              TAG     IMAGE ID      CREATED         SIZElocalhost/my-final-image latest  1ff90ec2e26e 22 seconds ago  51.4 MB

从上面的脚本可以看出,你可以直接使用 buildah bud 构建镜像,其中 bud 代表使用 Dockerfile 进行构建,你也可以使用其他脚本化的方法,比如使用 Buildahs 的 from、run 和 copy,它们分别对应 Dockerfile 中的 FROM、RUN、COPY 命令。

接下来是 Google 的 Kaniko。Kaniko 也是利用 Dockerfile 构建容器镜像,而且与 Buildah 类似,它也不需要守护进程。但它与 Buildah 的主要区别在于,Kaniko 更加侧重于 Kubernetes 中的镜像构建。

Kaniko 本身也要作为镜像(gcr.io/kaniko-project/executor) 运行,这对于Kubernetes 来说是没有问题的,但对于本地构建来说不是很方便,并且在某种程度上违背了构建镜像的目的,因为你需要使用 Docker 运行 Kaniko 镜像才能构建镜像。话虽如此,如果你正在寻找在 Kubernetes 集群中构建镜像的工具 (例如在 CI/CD 管道中),那么 Kaniko 可能是一个不错的选择,因为它不需要守护进程,而且更安全。

以我个人的经验来看,我认为两者都能很好地完成工作,但是使用 Kaniko 时,我遇到了一些随机的构建故障,而且在将镜像推送到仓库时也出现了失败的情况。

我要介绍的第三个工具是 buildkit,也可以称之为 docker build 二代。它是 Moby 项目的一部分(与 Docker一样),只需设置 DOCKER_BUILDKIT=1 docker build,就可以启动这个工具,并作为 Docker 的一个实验性功能使用。那么,这个工具究竟能给你带来什么?它带来了很多改进和很酷的功能,包括并行构建、跳过未使用的阶段、更好的增量构建以及不需要 root 权限等构建。但是,它仍然需要运行守护进程 (buildkitd)。因此,如果你不想摆脱 Docker,同时又想要一些新的功能和改进,那么可以考虑一下 buildkit。

这里,我也会列出一些其他的工具,它们有各自的特定用途,但不是我的首选:

  • Source-To-Image(S2I):这是一个不使用 Dockerfile,直接根据源代码构建镜像的工具包。这个工具在简单的预期场景和工作流中表现良好,但如果你需要多一些自定义,如果你的项目的结构不符合预期,那么它就变得非常烦人和笨拙。如果你对 Docker 不太满意,或者你在 OpenShift 集群上构建镜像,则可以考虑使用 S2I,因为使用 S2I 构建镜像是它的一个内置功能。

  • Jib:这是一款由 Google 开发的工具,专门用于构建 Java 镜像。它提供了 Maven 和 Gradle 插件,可以让你轻松地构建镜像,而无需在意 Dockerfile。

  • Bazel:这也是一款由 Google 开发的工具。它不仅可用于构建容器镜像,而且是一个完整的构建系统。如果你只是想构建镜像,那么使用 Bazel 可能会有点大材小用,但绝对是一种不错的学习体验,如果你愿意,可以先从 rules_docker 着手。

容器运行时

 

最后我们来说说负责运行容器的容器运行时。容器运行时是整个容器生命周期的一部分,除非你对速度、安全性等有一些非常特殊的要求,否则请不要乱动它。

看到这里,如果你感到厌倦了,则可以跳过这一部分。但是,如果你想了解一下在容器运行时方面,都有哪些选择,则可以看看下面这些:

runc 是一款流行的容器运行时,且符合 OCI 容器运行时规范。Docker(通过containerd)、Podman 和 CRI-O 都在使用它,因此无需我多言。它几乎是所有容器引擎的默认设置,因此即便你在阅读本文后抛弃了 Docker,很可能仍然会使用 runc。

runc 的另一种替代品是 crun。这是一款由红帽开发的工具,全部用 C 语言编写(runc 是用 Go 编写的),所以它比 runc 更快,内存效率更高。由于它也是兼容 OCI 的运行时,所以如果你想试试看的话,应该能很快上手。虽然它现在还不是很流行,但是它即将作为 RHEL 8.3 版本的备选 OCI 运行时,出现在技术预览中,而且考虑到它是红帽的产品,所以最终很可能会成为 Podman 或 CRI-O 的默认配置。

说到 CRI-O,前面我说过,它并不是容器引擎,而是容器运行时。这是因为 CRI-O 没有推送镜像之类的功能,但这些功能是容器引擎应该具备的。CRI-O 内部使用 runc 来运行容器。你不应该在自己的机器上尝试使用这个运行时,因为它的设计就是 Kubernetes 节点上的运行时,而且它是“Kubernetes 所需的唯一的运行时”。因此,除非你要建立 Kubernetes 集群,否则就不应该考虑 CRI-O。

最后一个是 containerd,它是云原生计算基金会即将推出的一个项目。它是一个守护进程,可作为各种容器运行时和操作系统的 API 接口。它后台依赖于 runc,它是 Docker 引擎的默认运行时。Google Kubernetes Engine(GKE)和 IBM Kubernetes Service(IKS)也在使用它。它是 Kubernetes容器运行时接口的一个实现(与 CRI-O 一样),因此是 Kubernetes 集群运行时的理想选择。


镜像的检查与分发

 

最后一部分内容是镜像的检查与分发,主要是为了替代 docker inspect,并增加在远程仓库之间复制镜像的能力(可选)。

在这里,我要提到的唯一可以完成这些任务的工具是 Skopeo。它由红帽开发,是 Buildah、Podman 和 CRI-O 的附属工具。除了基本的 skopeo inspect(Docker 有相应的命令),Skopeo 还可以通过 skopeo copy 令来复制镜像,因此你可以直接在远程仓库之间复制镜像,无需将它们拉取到本地。如果你使用本地仓库,那么这个功能也可以作为拉取/推送。

另外,我还想提一下 Dive,这是一款检查、探索和分析镜像的工具。它更加人性化,提供了更加方便阅读的输出,而且还可以更深入地挖掘镜像,并分析和测量镜像的效率。此外,它也很适合在 CI 管道中使用,用于衡量你的镜像是否“足够高效”,或者换句话说,是否浪费了太多空间。

总结

 

本文的目的并不是要说服你完全抛弃 Docker,而是为了向你展示构建、运行、管理和分发容器及其镜像的整个过程以及所有备选工具。每个工具(包括 Docker)都有其优缺点,因此,评估哪些工具最适合你的工作流程和情况才是最重要的,希望本文能在这方面为你提供一些帮助。

参考链接:https://martinheinz.dev/blog/35

更多阅读推荐

  • 云原生体系下的技海浮沉与理论探索

  • 如何通过 Serverless 轻松识别验证码?

  • 5G与金融行业融合应用的场景探索

  • 打破“打工人”魔咒,RPA 来狙击!

  • 使用 SQL 语句实现一个年会抽奖程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库驱动

<!-- 达梦数据库驱动--><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.79</version></dependency>

阿里云李飞飞:今年将帮1000家企业“去O”,完成10000套传统数据仓库上云

阿里云直播回放头号云话题直播回放 “今年将帮1000家企业去O&#xff0c;完成10000套传统数据仓库上云。”6月9日&#xff0c;阿里云数据库负责人李飞飞在阿里云峰会上表示&#xff0c;经过多年技术演进&#xff0c;传统数据库上云已进入大规模攻坚阶段。 达摩院数据库首席科学…

系统架构设计师 - 23种设计模式(GOF)

文章目录总览创建型&#xff08;5种&#xff09;工厂方法 Factory Method抽象工厂 Abstract Factory生成器模式 Builder原型模式 Prototype单例模式 Singleton结构型&#xff08;7种&#xff09;适配器 Adapter桥接 Bridge组合模式 Composite装饰者模式 Decorator外观模式 Faca…

如何优雅的理解HBase和BigTable

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 学习 HBase 最难的地方在于要让你的脑子真正理解它是什么。 HBase&#xff1a;Google BigTable 的开源实现 我们经常会把关…

如何使用Trie树,设计实践Google一样的输入提示功能

来源 | 搜索技术责编 | 小白Google和百度都支持输入提示功能&#xff0c;辅助你快速准确的输入想要的内容。如下&#xff1a;输入“五一”&#xff0c;会提示“五一劳动节”等。那如何实现谷歌这样的输入提示功能呢&#xff1f;分析下输入提示的功能需求当输入前面的词A&#x…

计算机与网络

文章目录1.计算机组成2.操作系统进程管理存储管理设备管理文件管理3.数据库系统关系代数数据仓库4.计算机网络1.计算机组成 计算机组成&#xff1a;控制器、运算器、存储设备、输入设备、输出设备。 控制器功能程序计数器&#xff08;PC&#xff09;下条要执行指令的地址指令…

物联网与万物互联有什么区别?

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; IoE与IoT&#xff1a;有什么区别? 除非您是专家&#xff0c;否则物联网(IoT)和万物互联(IoE)之间几乎没有什么区别。但是&am…

宝兰德中间件同台机器多个实例安装

文章目录1. 启动多实例2. 修改实例13. 修改实例21. 启动多实例 同一台机器同时启动两个示例ins-1和ins-2需要修改和规划端口避免冲突&#xff0c;端口配置在中间件安装目录下的conf/server.conf文件中。示例端口规划如下&#xff1a; 只需要修改http管理端口、http服务端口、J…

5G网络打破专有系统的桎梏

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 随着技术的不断变迁&#xff0c;专有无线接入网络的时代正在逐渐消失。运营商希望能在降低成本的同时增加灵活性&#xff0c;…

为普及再助一把力!《2021年中国低代码/无代码市场研究报告》正式发布

开发能力“下放”&#xff0c;普通人也能通过“拖拉拽”快速搭建软件——在经历了大型套装软件、软件SaaS化之后&#xff0c;我国企业数字化进程即将迎来低代码/无代码开发的全新时代。 1月19日&#xff0c;海比研究院、中国软件网联合中国软件行业协会在北京举行《2021年中国…

微信小程序限制当前位置和目的地的距离

获取当前位置经纬度 onLoad: function (options) {var that this;campaign_id campaign_idwx.getLocation({type: wgs84,success: function (res) {console.log(res)lat1 res.latitude,lng1 res.longitude}})},通过点击事件打开地图选择位置 site: function () {var that …

软件设计师 - 数据库关系代数运算

文章目录1.交&#xff08;∩&#xff09;2.并&#xff08;∪&#xff09;3.差&#xff08;-&#xff09;4.投影&#xff08;π&#xff09;4.1.例子5.选择&#xff08;σ&#xff09;5.1.例子6.连接&#xff08;⋈&#xff09;6.1.等值连接6.2.自然连接6.4.外连接6.3.内连接7.笛…

阿里云CDN六大边缘安全能力,全力助推政企数字化转型

6月9日&#xff0c;2020年阿里云线上峰会召开。阿里云智能总裁张建锋认为&#xff0c;数字化已经成为中国经济的主要驱动力&#xff0c;疫情让政府、企业都认识到数字化的迫切性。在峰会上&#xff0c;阿里云CDN正式对外发布基于CDN构建的六大边缘安全能力&#xff0c;全力助推…

阿里云发布第七代云服务器ECS,整机算力提升160%

2020年6月9日&#xff0c;阿里云重磅发布第七代ECS企业级高主频实例以及新一代弹性裸金属云服务器&#xff0c;目前已启动邀测。 新一代的高主频实例搭载最新一代英特尔至强可扩展处理器&#xff08;代号Cedar Island&#xff09;以及阿里云自研的第三代神龙云服务器架构&…

PageHelper循环依赖 com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration

在用pageHelper的时候突然遇到个问题&#xff0c;启动项目后出现这个情况&#xff1a; springboot2.6好像禁止循环依赖还是啥的&#xff0c;翻来翻去没看到解决办法&#xff0c;后面去pageHelper github看&#xff0c;才看到最新版本已经解决了这个问题。 解决方案&#xff…

获奖名单出炉,快来看看有没有你!

这次千万别再错过&#xff01;周五福利日&#xff0c;人人都可免费领会员&#xff01;详情戳这里奖品多多&#xff0c;不仅有CSDN月卡会员、CSDN年卡会员&#xff0c;还有5w现金奖品等你瓜分&#xff01;邀请越多奖品越多&#xff01;本周五上午11:00&#xff0c;准点开放领取&…

看我如何用Dataphin实现自动化建模

前言&#xff1a;更多关于数智化转型、数据中台内容可扫码加群一起探讨 阿里云数据中台官网 https://dp.alibaba.com/index 作者&#xff1a;数据小海豚 随着大数据趋势的迅速增长&#xff0c;数据的重要性与日俱增&#xff0c;企业内看数据、用数据的诉求越来越强烈&#x…

EasyExcel 导出时 Converter转换器 注入 ExcelContentProperty 为null

异常现象&#xff1a; Converter转换器 注入 ExcelContentProperty 为null 直接原因&#xff1a; 调用**.head(&#xff09;**方法&#xff0c;重写表头样式&#xff0c;就导致ExcelContentProperty 注入失败。 源码原因&#xff1a; todo 解决办法&#xff1a; todo

SaaS模式云数据仓库:持续保护云上数据及服务安全

2020年6月9日&#xff0c;阿里云 MaxCompute 全新发布企业级新能力&#xff0c;在成本、性能、安全方面&#xff0c;持续定义企业级SaaS模式云数据仓库&#xff0c;通过 “云数据仓库” 的新模式&#xff0c;帮助企业实现数字经济新优势。 据介绍&#xff0c;最新发布的算力资…