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

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 的概念。

builder 其实很早就存在于 Docker 当中了,我们之前在使用或者说默认在使用的就是 builder 的 v1 版本(在 Docker 内部也将它的版本号定为 1),但是由于它太久了,有一些功能缺失和不足,由此诞生了 builder 的 v2 版本,该项目被称之为 BuildKit 。

BuildKit

BuildKit 的产生主要是由于 v1 版本的 builder 的性能,存储管理和扩展性方面都有不足(毕竟它已经产生了很久,而且近些年 Docker 火热,问题也就逐步暴露出来了), 所以它的重点也在于解决这些问题,关键的功能列在下面:

  • 支持自动化的垃圾回收
  • 可扩展的构建格式
  • 并发依赖解决
  • 高效的缓存系统
  • 插件化的架构

这些功能我们暂且略过,先回到我们的主线上来。

BuildKit 在 Docker v18.06 版本之后可通过 export DOCKER_BUILDKIT=1 环境变量来设置是否启用。对于 Docker v18.06 需要将 dockerd 也以实现性模式运行。即,修改 /etc/docker/daemon.json 文件,增加 "experimental": true 配置,然后使用 systemctl restart docker 重启 dockerd 。

如果将 /etc/docker/daemon.json 文件中添加以下配置:

{
   
  "experimental": true,
  "features": {
   
    "buildkit": true
  }
}

则会默认使用 BuildKit 进行构建,就不再需要指定环境了。

小结
  • 在上面的内容中,我们知道了 Docker 是 C/S 架构,而我们通常使用的 docker 命令便是它的 CLI 客户端,服务端是 dockerd 通常由 systemd 进行管理;
  • 我们介绍了一个概念 builder,它是 Docker 构建系统中的实际执行者;用于将构建的上下文 context 按照 Dockerfile 的描述最终生成 Docker 镜像(image);
  • BuildKit 是 v2 版本的 builder ;
  • 我们可以通过增加 export DOCKER_BUILDKIT=1 的环境变量,或是修改 dockerd 的配置文件来临时启用或者默认启用 BuildKit 作为 builder。

我们来体验一下开启 BuildKit 的镜像构建:

(MoeLove)~ docker build -t local/spring-boot:buildkit https://github.com/tao12345666333/spring-boot-hello-world.git
[+] Building 0.2s (0/1)
[+] Building 0.6s (0/1) 
...
[+] Building 6.4s (0/1)
 => [internal] load git source https://github.com/tao12345666333/spring-boot-hello-world.git                6.4s 
 => => # 已初始化空的 Git 仓库于 /var/lib/docker/overlay2/xieo69jwu3qd18uqmuwa6er9l/diff/
         898cc478c6bbec5dab019a36fdfdd2dd172cee9erefs/heads/master
[+] Building 394.0s (12/12) FINISHED
 => [internal] load git source https://github.com/tao12345666333/spring-boot-hello-world.git                6.4s 
 => [internal] load metadata for docker.io/library/openjdk:8-jre-alpine                                     3.6s
 => [internal] load metadata for docker.io/library/maven:3.6.1-jdk-8-alpine                                 3.3s 
 => CACHED [stage-2 1/2] FROM docker.io/library/openjdk:8-jre-alpine@sha256:f362b165b870ef129cbe730f29065f  0.0s
 => => resolve docker.io/library/openjdk:8-jre-alpine@sha256:f362b165b870ef129cbe730f29065ff37399c0aa8bcab  0.0s
 => [builder 1/6] FROM docker.io/library/maven:3.6.1-jdk-8-alpine@sha256:16691dc7e18e5311ee7ae38b40dcf98e  14.3s
 => => resolve docker.io/library/maven:3.6.1-jdk-8-alpine@sha256:16691dc7e18e5311ee7ae38b40dcf98ee1cfe4a48  0.0s
 => => sha256:e4ef40f7698347c89ee64b2e5c237d214cae777f33735c52039824eb44feb796 2.18MB / 2.18MB              2.7s
...
 => => extracting sha256:c2274a1a0e2786ee9101b08f76111f9ab8019e368dce1e325d3c284a0ca33397                   0.7s
 => [builder 2/6] WORKDIR /app                                                                              0.3s
 => [builder 3/6] COPY pom.xml /app/                                                                        0.0s
 => [builder 4/6] RUN mvn dependency:go-offline                                                           352.4s
 => [builder 5/6] COPY src /app/src                                                                         0.1s
 => [builder 6/6] RUN mvn -e -B package                                                                    16.3s
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker是一种容器化技术,用于隔离应用程序和它们的依赖,并以轻量级和可移植的方式进行分发和部署。而Docker Compose和DockerfileDocker生态系统中常用的工具,用于管理和构建多个容器化应用程序。 Docker Compose是一个命令行工具,通过一个简单的文本文件(通常是YAML格式)来定义、配置和运行多个Docker容器。它提供了一种非常简便的方式来描述和管理各个容器之间的关联性,同时还能够一次性启动、停止和删除整个应用程序的所有容器。通过Docker Compose,我们可以轻松地创建和管理包含多个服务的复杂应用程序,例如前端应用程序和后端数据库。 Dockerfile是一个用于定义Docker镜像的文本文件,其中包含了构建镜像所需的指令和配置。通过编写Dockerfile,我们可以描述应用程序的运行环境、依赖关系和启动命令等信息。Docker通过读取Dockerfile并按照其中的指令逐步构建镜像,最终生成一个可执行的容器化应用程序。对于一个基于Nginx的Web应用程序,我们可以使用Dockerfile来定义Nginx的配置和静态资源,然后通过构建镜像来打包应用程序。 综上所述,docker-compose、Dockerfile和Nginx可以结合使用,实现多个容器之间的协同工作和复杂应用程序的构建。我们可以使用Docker Compose来管理包含Nginx容器的应用程序,通过Dockerfile来定义Nginx镜像的构建过程,最终实现一个可部署的Nginx容器化应用程序。这种方式能够提高应用程序的可移植性、可复用性和易于管理性,为开发人员和运维人员带来许多便利。 ### 回答2: docker-compose是一个可以管理多个容器的工具,它使用一个YAML文件来定义容器的配置信息。dockerfile是用来构建镜像的脚本文件,它包含了一系列的命令来描述容器的构建过程。nginx是一个开源的高性能的Web服务器和反向代理服务器。 使用docker-compose可以很方便地定义和管理多个容器之间的关系和依赖。可以在docker-compose.yaml文件中定义多个服务,每个服务对应一个容器,而这些容器可以通过互联网络进行通信。例如,可以定义一个nginx服务,同时还可以定义一个后端应用程序的服务,并且将两个服务连接在一起。使用docker-compose up命令可以启动所有定义的服务,并且可以使用docker-compose logs命令来查看日志信息。 dockerfile是一个用来描述构建镜像过程的文件,它包含了一系列的命令来指定容器中的操作。在dockerfile中可以使用FROM命令指定基础镜像,然后使用RUN命令来执行一些操作,比如安装软件包、配置环境等。对于nginx这个容器,可以使用dockerfile来构建自定义的镜像,并且可以在其中配置nginx的相关设置,例如端口、路由规则等。 通过使用docker-compose和dockerfile,可以很轻松地将nginx部署到容器中,并且可以定义nginx和其他服务之间的联系和依赖关系。这样可以更加方便地进行应用程序的部署和管理,同时也可以通过容器的隔离性和易于移植性来提高应用程序的安全性和可靠性。 ### 回答3: Docker Compose和Dockerfile是两个与Docker相关的重要概念,而Nginx则是一款常用的高性能Web服务器和反向代理服务器软件。 Docker Compose是一个用于定义和运行多个Docker容器的工具。它通过一个单独的YAML配置文件,可以定义容器之间的关系和依赖,并且可以一键式地启动、停止和管理这些容器。使用Docker Compose,我们可以方便地把多个服务组合在一起,比如前端应用、后端应用和数据库等。 Dockerfile是一个用于构建Docker镜像的文本文件。它包含一系列的指令,用于告诉Docker引擎如何构建镜像。通过Dockerfile,我们可以自定义镜像的内容和配置,包括基础镜像选择、软件安装、文件复制、环境变量设置等。Dockerfile的编写可以帮助我们实现镜像的自动化构建和版本管理。 Nginx是一款轻量级的高性能Web服务器和反向代理服务器软件。它具有占用资源少、处理并发请求能力强等特点,被广泛用于构建高性能的Web应用架构。通过使用Nginx,我们可以实现负载均衡、反向代理、静态文件缓存、SSL加密等功能。 结合这三个概念,我们可以运用Docker Compose来定义和管理多个容器,比如前端应用容器和Nginx容器。通过Dockerfile,我们可以定义Nginx容器的自定义镜像,包括选择基础镜像、安装Nginx和相关依赖、设置Nginx配置文件等。然后,通过Docker Compose一键式地启动这些容器,实现前端应用和Nginx服务器的整合。 总之,Docker Compose、Dockerfile和Nginx是三个在Docker应用开发和部署中非常重要的概念和工具。它们可以帮助我们方便地管理和构建容器,实现应用的快速部署和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值