欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

谷歌技术人员解决Docker镜像体积太大问题的方法

程序员文章站 2022-07-20 21:59:02
虚拟机的问题 最初,大家都使用虚拟机作为软件的运行环境,对外提供服务。为了在虚拟机上运行你的 service,你不得不运行一大堆程序: 系统进程 定时任务 ss...

虚拟机的问题

谷歌技术人员解决Docker镜像体积太大问题的方法

最初,大家都使用虚拟机作为软件的运行环境,对外提供服务。为了在虚拟机上运行你的 service,你不得不运行一大堆程序:

系统进程
定时任务
ssh
安装 agent
安装 bash
安装一大堆 libs

其实,你仅仅只是想让你的 service运行起来,但你不得不维护一个 40gb的虚拟机。

然后你开始试用 docker

谷歌技术人员解决Docker镜像体积太大问题的方法

开始试用 docker,你毫不犹豫选择了和之前虚拟机一样的镜像:ubuntu 1404,将之前的虚机的内容复制到了 docker镜像,安装了一堆软件,最后发现你的 docker镜像有 8gb。

谷歌的 docker镜像构建实践

找到最小的基础镜像

alpine linux是基于 musl和 busybox的操作系统,目的是为了为用户提供更高效的资源使用效率。它的特性是体积小,最小的 alpine linux体积可以只有 5mb。谷歌某些团队使用 alpine linux作为 docker build的基础镜像。

目的:仅仅为了运行 service

谷歌技术人员解决Docker镜像体积太大问题的方法

谷歌认为,为了运行一个 service,并不需要将那些无关联的包、程序打包到容器里,换句话说,docker镜像里只留下需要用到的,其他的都删除,从而得到一个最小的镜像。这需要考虑以下几点:

1、程序编译后的二进制文件(从 artifactory获取)

2、程序的所有依赖(从 artifactory获取)

3、程序语言的运行时(libc,jre,node,…)

4、任何程序和 kernel之间的中间件

其实这一切的信息,构建工具都已经知道。

谷歌的构建工具 bazel

介绍 bazel之前,先介绍下谷歌的开发模式,对于服务器端代码库,谷歌的开发流程如下:

1、所有的服务器端代码库都在一个巨大的版本控制系统里

2、每个人都用 bazel构建软件

3、不同的组负责源码树的不同部分,所有的组件都是作为 build目标来用

4、分支主要是用来管理发布,所以每个人都在最新版本上开发软件

bazel(https://bazel.build/)是 google内部用来构建自己的服务器端软件的工具。目前变成谷歌公司贡献的一个开源项目,目的是帮助开发者将软件的构建和测试变得更快、更可靠。

谷歌技术人员解决Docker镜像体积太大问题的方法

从上图可以看到,bazel有 wordspace的概念,wordspace文件用来准备 docker镜像构建所依赖的所有材料和来源。build文件用来告诉 bazel这个镜像应该使用什么命令进行构建,以及如何构建、如何测试。

使用 bazel的声明式语言: workspace和 build,开发者可以用文件描述整个构建和部署的环境。谷歌使用 bazel进行 docker的构建已经很多年,它为谷歌带来以下收益:

1、支持跨平台构建,分布式缓存,优化依赖解析,并行构建,增量构建。

2、支持多语言(java, c++, android, ios, go等等)。

3、跨平台。

4、水平扩展和自定义扩展。

bazel是以下理念的奠基石:由于 bazel需要所有的依赖都被完整地指定,我们可以预测改动影响了哪些程序和测试,并在提交前执行他们。

谷歌提供的 distroless镜像构建文件

谷歌技术人员解决Docker镜像体积太大问题的方法

distroless (https://github.com/googlecloudplatform/distroless)是谷歌内部使用的镜像构建文件,包括 java、node、python等镜像构建文件,distroless仅仅只包含运行服务所需要的最小镜像,不包含包管理工具、shell命令行等其他功能。

为什么你需要这些镜像?这些镜像是谷歌和其他大公司的最佳实践的产物,经过了漏洞扫描,镜像会持续更新,保持安全性。

如何使用?distroless提供的构建镜像的 build文件,通过 bazel可以直接进行构建。

谷歌为大家介绍了内部如何解决镜像过大的问题,以及进行大规模并发构建、测试所用到的构建工具 bazel,并且开源了 docker镜像构建文件 distroless项目。如果你认为你的镜像也存在体积太大的问题,可以参考谷歌的实践,体验他们的工具。

总结

以上就是本文关于谷歌技术人员解决docker镜像体积太大问题的方法的全部内容,希望对大家有所帮助。感兴趣的朋友可以可以继续参阅本站:

docker探索namespace详解

详解docker使用linux iptables 和 interfaces管理容器网络

浅谈docker安全机制内核安全与容器之间的网络安全

如有不足之处,欢迎留言指出。