原来谷歌是这样构建 Docker 镜像的!

来自微信公众号:JFrog杰蛙DevOps
作者:王青
Matthew Moore 是谷歌公司的资深工程师,专注于谷歌 Docker 技术的应用,他是在谷歌最早落地 Docker 技术团队的核心成员。本次演讲他为大家介绍了谷歌使用 Docker 技术的心得。

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

  • 系统进程
  • SSH
  • 安装
  • Agent
  • 安装
  • Bash
  • 安装一大堆 libs

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

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

谷歌的 Docker 镜像构建实践

找到最小的基础镜像
Alpine Linux 是基于musl 和 BusyBox 的操作系统,目的是为了为用户提供更高效的资源使用效率。它的特性是体积小,最小的 Alpine Linux 体积可以只有5MB。谷歌某些团队使用 Alpine Linux 作为 Docker Build 的基础镜像。

目的:仅仅为了运行 Service
图片描述
谷歌认为,为了运行一个 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 内部用来构建自己的服务器端软件的工具。目前变成谷歌公司贡献的一个开源项目,目的是帮助开发者将软件的构建和测试变得更快,更可靠。
图片描述
从上图可以看到,Bazel 有 WORDSPACE 的概念,WORDSPACE 文件用来准备 Docker 镜像构建所依赖的所有材料和来源。BUILD 文件用来告诉 Bazel 这个镜像应该使用什么命令进行构建,以及如何构建,如何测试。

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

  1. 支持跨平台构建,分布式缓存,优化依赖解析,并行构建,增量构建。
  2. 支持多语言(Java, C++, Android, iOS, Go等等)。
  3. 跨平台。
  4. 水平扩展和自定义扩展。

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

谷歌提供的 Distroless 镜像构建文件
图片描述
Distroless (https://github.com/GoogleCloudPlatform/distroless) 是谷歌内部使用的镜像构建文件,包括 Java 镜像,Node,Python 等镜像构建文件,Distroless 仅仅只包含运行服务所需要的最小镜像,不包含包管理工具,shell 命令行等其他功能。

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

如何使用?Distroless 提供的构建镜像的 BUILD 文件,通过 Bazel 可以直接进行构建。
总结
谷歌为大家介绍了内部如何解决镜像过大的问题,以及进行大规模并发构建,测试所用到的构建工具 Bazel,并且开源了 Docker 镜像构建文件 Distroless 项目。如果你认为你的镜像也存在体积太大的问题,可以参考谷歌的实践,体验他们的工具。

参考文献:
https://www.bazel.build/
https://github.com/GoogleCloudPlatform/distroless


Docker最佳实战
随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛。该课程集中于Docker实践应用,不会过多纠结于细细微的理论分析,而是涵盖Docker最基本和常用的功能和命令,让学员在最短的时间内了解如何上手使用Docker,配合精心设计的范例,以及范例代码的演化过程,学员可以可以直观地看到Docker在实际项目中的应用,可能碰到的问题,如何解决,以及如何改进项目的开发过程。
图片描述

目前群已满100人,添加微信号:csdn01,备注“Docker”即可入群!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: 可以使用`docker images`命令查看本地的镜像库。 也可以使用`docker search`命令在 Docker Hub 上搜索镜像。 示例: ``` docker search ubuntu ``` 将会在Docker Hub搜索名称中包含"ubuntu"的镜像 ### 回答2: 要查看Docker镜像库,可以使用以下方法: 1. 使用Docker命令行界面(CLI): - 在终端中运行`docker search <镜像名称>`命令来搜索特定的镜像。例如,如果要搜索名为ubuntu的镜像,可以运行`docker search ubuntu`。 - 执行搜索后,将会显示与搜索条件匹配的镜像列表,包括镜像名称、描述、星级评分以及官方或非官方标签。 - 选择所需的镜像,然后通过运行`docker pull <镜像名称>`命令将其下载到本地。 2. 使用Docker Hub网站: - 打开Docker Hub网站(https://hub.docker.com)。 - 在搜索栏中输入想要查看的镜像名称,然后按下Enter键或点击搜索图标。 - 搜索结果将显示与查询条件相关的镜像列表。可以根据镜像的官方或非官方标签、星级评分、更新时间等进行筛选。 - 点击所需镜像的名称,将打开该镜像的详细页面,包括描述、Dockerfile、标签、使用示例等信息。 - 要下载镜像,可以在页面右侧的“Pull Command”部分找到对应的Docker pull命令。 3. 使用其他Docker镜像库: - 如果不想使用Docker Hub,还可以使用其他的Docker镜像库,如阿里云容器镜像服务、谷歌云存储库等。 - 类似于使用Docker Hub,可以在这些镜像库的网站上进行搜索和查看镜像,并使用相应的Docker pull命令将其下载到本地。 无论使用哪种方法,都可以通过查看Docker镜像库来获取所需的镜像,并将其用于构建和运行容器化应用程序。 ### 回答3: 要查看Docker镜像库,我们可以按照以下步骤进行: 1. 首先,需要确保已经安装并正确配置了Docker。可以通过在终端运行`docker --version`命令来检查Docker是否已经正确安装和配置。 2. 接下来,我们可以使用以下命令来登录到Docker镜像库中: ``` docker login ``` 运行上述命令后,系统会要求输入Docker的用户名和密码。如果成功登录,将显示“Login Succeeded”消息。 3. 登录成功后,我们可以使用以下命令来查看镜像库中可用的镜像列表: ``` docker search <关键字> ``` 用`<关键字>`替换为你想搜索的镜像名称或关键字。执行上述命令后,将显示与关键字相关的所有镜像的列表,包括镜像名称、描述和星级评分等信息。 4. 如果要查看镜像的详细信息,可以使用以下命令: ``` docker image inspect <镜像名称> ``` 这将显示有关特定镜像的详细信息,如镜像的唯一ID、作者、创建日期、标签等信息。 5. 如果要拉取(即下载)镜像到本地使用,可以使用以下命令: ``` docker pull <镜像名称> ``` 这将从镜像库中下载指定名称的镜像到本地。 通过以上步骤,我们可以方便地查看Docker镜像库中的镜像,并根据需要下载和使用这些镜像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值