您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

如何将Docker的构建时间减少40%

时间:2023-11-07 13:23:08  来源:51CTO  作者:诺亚

作者丨Niels Claeys

编译丨诺亚

出品 | 51CTO技术栈(微信号:blog51cto)

 

与许多公司类似,我们为产品中使用的所有组件构建Docker映像。随着时间的推移,其中一些映像变得越来越大,我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间,就会降低开发人员的工作效率。

 

造成生产力损失的原因是:

1、开发人员需要等待构建完成,从而浪费时间。

2、开发人员开始做一些新的东西,并在晚些时候再回来做。切换必然耗时,这通常也会导致效率低下。

 

如何将Docker的构建时间减少40%图片

 

在这篇文章中,我想说明我们应用的2个小变化,两者极大地改善了我们的构建时间。当然,在关注这些改进之前,请确保你已经遵循编写dockerfile的最佳实践,比如尽量减少层数;使用多级构建;使用最小的基础图像等等。

1、Buildkit vs Buildx  

 

让我们从解释Buildkit和Buildx开始,因为这两个术语经常互换使用,但它们并不相同。

 

Builkit

Buildkit是经过改进的后端,用来取代旧的Docker构建器。它在2018年打包在Docker中,并成为docker engine 23.0的默认构建器。   

 

它提供了许多有趣的功能:

  • 改进的缓存功能
  • 并行构建不同的层
  • 延迟拉取基础镜像(≥Buildkit 0.9)

在使用Buildkit时,你很快就会注意到docker构建命令的输出看起来更清晰、更结构化。

 

在docker版本低于23.0的情况下使用Buildkit的典型方法是设置Buildkit参数。如下所示:

DOCKER_BUILDKIT=1 docker build --platform linux/amd64 . -t someImage:someVersion
DOCKER_BUILDKIT=1 docker push someImage:someVersion

 

Buildx

Buildx是Docker的一个插件,它使你能够在Docker中使用Buildkit的全部潜力。之所以创建它,是因为Buildkit支持许多新的配置选项,这些选项不能全部以向后兼容的方式集成到docker构建命令中。

 

除了构建镜像之外,Buildx还支持管理多个构建器。在CI中,这对于定义具有不同配置的作用域环境非常有用,因为它们不会修改共享Docker守护进程。

 

你可以像下面这样开始使用Buildx:

docker buildx create --bootstrap --name builder
docker buildx use builder

2、受益于远程缓存

 

加快构建速度的第一种方法是在远程注册表中缓存镜像。这样,即使在不同的机器上执行构建,也可以从构建缓存中获益,这是CI中的典型情况。作为一种解决方法,许多人在构建新映像版本之前提取了映像的最新版本。这样做的好处是,你可以缓存未更改的图层,而代价是最初提取完整的图像。拉取完整的图像可能需要一段时间,但也不能保证图层可以被重用。为了说明这一点,我们使用了以下命令:

 

如何将Docker的构建时间减少40%图片

 

使用Buildx,你可以将缓存信息存储在远程位置(例如容器注册表、blob存储等)。构建器检查给定层是否已经存在,如果是这种情况,它将重用它而不是再次创建它。这甚至可以在不拉动本地图层的情况下完成。为了从这个机制中受益,我们将之前的命令修改为:   

 

如何将Docker的构建时间减少40%图片

 

模式“max”意味着我们将存储每一层的构建信息,甚至是生成图像中未使用的层(例如,当使用多阶段构建时)。默认模式下使用“min”,它只存储最终映像中存在的层的构建信息。

 

缓存的一个特殊情况是“内联”存储缓存数据,这意味着它将与图像一起缓存。当使用Buildkit而不使用Buildx时,也支持此选项。它是最容易开始的,但在使用多阶段构建时就比较棘手了,而且它没有在工件输出和缓存之间提供明确的分离。内联存储缓存数据的命令如下:

 

如何将Docker的构建时间减少40%图片

3、添加文件到Docker镜像的新方法

 

Docker引入了新的dockerfile编写语法,即:

#syntax= docker /dockerfile:1.4。它支持COPY和ADD命令的额外链接选项。

 

以前,当你使用COPY或ADD命令时,构建器会创建一个新快照,它将新文件与现有文件系统合并。其结果是,在执行此操作之前,父层都需要存在,否则目标目录可能还不存在。最后,你的映像(构建命令的结果)将由每个层的tarball组成,其中包含各个快照之间的差异。

 

如何将Docker的构建时间减少40%图片

 

当使用link选项时,新文件将被放入它们自己的快照中,而不依赖于以前的层。链接的文件存储在它们自己的tarball中,不同的tarball被链接在一起,不依赖于现有的文件系统,如下图所示。

 

如何将Docker的构建时间减少40%

https://www.docker.com/blog/image-rebase-and-improved-remote-cache-support-in-new-buildkit/

 

如何将Docker的构建时间减少40%图片

 

主要优点是文件不再依赖于以前的层。只要文件没有改变,即使父层改变了,层也可以被重用。

 

此外,这还可以提高构建的速度,因为现在可以并行执行多层复制数据。

4、结论

 

本文描述了我们在优化CI管道后获得的一些新见解。我讨论了2个小的变化,导致我们的整体docker构建时间减少了40%:其一,远程存储构建缓存信息;其二,在添加、复制文件到docker镜像时使用link选项。

 

参考链接:https://medium.com/datamindedbe/how-we-reduced-our-docker-build-times-by-40-afea7b7f5fe7



Tags:Docker   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  Search: Docker  点击:(11)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: Docker  点击:(10)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  Search: Docker  点击:(22)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  Search: Docker  点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  Search: Docker  点击:(76)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04  Search: Docker  点击:(124)  评论:(0)  加入收藏
七个杀手级Docker命令
Docker是一个容器化平台,通过操作系统级别的虚拟化技术,实现软件的打包和容器化运行。借助Docker,开发人员能够将应用程序以容器的形式进行部署,但在此之前需要构建Docker镜像。...【详细内容】
2023-12-22  Search: Docker  点击:(140)  评论:(0)  加入收藏
Docker容器如何打包应用程序的代码和依赖项?
Docker容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。下面是Docker容器实现这一目标的步骤:打包应用程序:使用Docker工具将...【详细内容】
2023-12-20  Search: Docker  点击:(130)  评论:(0)  加入收藏
DBA视角:把数据库放入Docker是一个馊主意
对于无状态的应用服务而言,容器是一个相当完美的开发运维解决方案。然而对于带持久状态的服务 —— 数据库来说,事情就没有那么简单了。生产环境的数据库是否应当放...【详细内容】
2023-12-18  Search: Docker  点击:(197)  评论:(0)  加入收藏
Docker容器编排技术解析
一、容器编排介绍容器编排是现代云原生应用管理的核心,它涉及在大规模的环境中自动化部署、管理、扩展和网络配置容器。随着微服务架构的兴起和应用的复杂性增加,容器编排成为...【详细内容】
2023-12-15  Search: Docker  点击:(245)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(11)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(153)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(76)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条