跳到主要内容

Docker 的 Layer 是什么详解

· 阅读需 3 分钟
素明诚
Full stack development

Docker 镜像由多个层组成,每个层代表镜像构建过程中的一个步骤。当执行 Dockerfile 中的指令(如 FROM, RUN, COPY 等)时,每条指令基本上都会创建一个新的层。这些层按顺序叠加,每一层都是前一层的基础上进行的更改。

例如,我们在构建镜像的时候

  1. FROM ubuntu:20.04 创建了一个基础层,包括 Ubuntu 20.04 的所有文件。
  2. RUN apt-get update && apt-get install -y nginx 添加了一个新层,包含了安装 Nginx 后的变化。
  3. COPY . /app 又添加了一层,将应用代码复制到镜像中。

层的好处

重用和缓存

使用层可以提高资源的重用。如果多个镜像基于同一个基础镜像,它们都可以重用这个基础镜像的层,节省存储空间,并加快镜像的下载和部署速度。Docker 会缓存每一层,当重新构建镜像时,如果某一层之前已被构建并且指令没有变化,Docker 会重用这个缓存层。

效率和速度

分层也允许更快的迭代开发。因为每次只需要重新构建那些发生变化的层。这使得构建、测试和推送更改到生产变得更快。

减少风险

每一层的独立性有助于安全性,因为可以精确控制和审查每一层的内容,从而降低引入不安全或不稳定代码的风险。

层的存储机制

在技术上,Docker 使用联合文件系统(Union File System)来组合多个层,使它们看起来如同一个单一的文件系统。这意味着虽然物理上层与层之间是分开存储的,但在逻辑上用户会看到一个整合后的文件系统。

层的存储大小和共享

层是以增量方式存储的。例如,如果第一层占用 1MB,第二层相对于第一层又增加了 1MB 的内容,那么这两层的总大小就是 2MB。如果第二层是修改第一层中的内容,则这部分空间不会简单相加,而是取决于修改后的文件大小。

多个镜像可以共享相同的底层层。如果你有多个镜像都基于同一个操作系统镜像(例如 ubuntu:20.04),那么这个操作系统层只需要在物理存储上保存一次,而所有基于它的镜像都可以使用这同一层。