保存成功
订阅成功
保存失败,请重试
提交成功

进阶:Dockerfile 高阶使用指南及镜像优化

网易有道资深运维开发,PyCon China 和 GITC 讲师,Kubernetes 成员,多个 Docker 官方镜像贡献者,《Kubernetes 从上手到实践》作者。知乎专栏:「k8s生态」 博客:https://moelove.info
查看本场Chat

在上次的 Chat 《高效构建 Docker 镜像的最佳实践》 中,我们重点深入内部介绍了 Docker 镜像是什么;以及构建 Docker 镜像的最佳实践等。本次 Chat 我们来分享 Dockerfile 的高阶使用指南和对构建系统的解读,希望能对你有所帮助。

Dockerfile 高阶使用及新特性解读

通过之前的学习,我们已经知道 Dockerfile 是一种可用于镜像构建,具备特定语法的文本文件。而 Docker 自身在使用此文件进行构建镜像的过程中,遵循其固定的行为。

比如在上次 Chat 提到的缓存

Docker 构建系统中,默认情况下为了加快构建的速度,会将构建过程中的每层都进行缓存,我们建议在编写 Dockerfile 的时候,将更新最为频繁的步骤写到最后面,以避免因为该步骤的内容变更,进而导致后续步骤的缓存失效(缓存的控制是 Docker 固定的行为,我们在之后的 Chat 中会进一步深入内部进行分析)。

而同时,我们通过深入到 Docker 镜像内部,发现了它内部的组织形式,对于镜像而言,它其实是使用配置元信息,将对应内容的层(layer)组织起来的一个集合。

那么在使用 Dockerfile 构建镜像的时候,除了上次 Chat 聊到的内容外,有哪些值得掌握的高级技巧呢? 我们来正式开始本次 Chat 。

打开 BuildKit 支持

在上次 Chat 的最后,我们提到可以通过 BuildKit 以提高构建效率,这里我们来对它进行更加详细的解读和分析。

首先,我们知道 Docker 是一个典型的 C/S 架构模型,我们平时使用的 docker 命令,是它的 CLI 客户端,而它的服务端是 dockerd ,在 Linux 系统中,通常它是由 systemd 进行管理的,我们可以通过 systemctl status docker 查看当前 dockerd 的运行状态。

对于构建镜像而言,它同样是需要将待构建的内容(我们称之为 context),发送给 dockerd,并由 dockerd 的特定模块最终完成构建。

builder

这里我们需要引入一个概念 builder .

builder 就是上面提到的特定模块,也就是说构建内容 context 是由 Docker CLI 发送给 dockerd;并最终由 builder 完成构建。

enter image description here

docker 的顶级命令中,我们可以看到有一个 builder 的命令组。它有一个子命令 prune 用于清理所有构建过程中的缓存。

以下是 Docker 18.09 的输出信息。

/ # docker builder

Usage:  docker builder COMMAND

Manage builds

Commands:
  prune       Remove build cache

Run 'docker builder COMMAND --help' for more information on a command.

而在 Docker 19.03 中,它新增了一个子命令:

/ # docker builder

Usage:  docker builder COMMAND

Manage builds

Commands:
  build       Build an image from a Dockerfile
  prune       Remove build cache

Run 'docker builder COMMAND --help' for more information on a command.

这里新增的这个 build 子命令,其实就是我们平时使用的 docker build 或者是 docker image build,现在将它放到 builder 的子目录下也是为了凸显 builder 的概念。

还没有评论
评论
查看更多