Docker 的 Layer 是什么详解
· 阅读需 3 分钟
Docker 镜像由多个层组成,每个层代表镜像构建过程中的一个步骤。当执行 Dockerfile 中的指令(如 FROM
, RUN
, COPY
等)时,每条指令基本上都会创建一个新的层。这些层按顺序叠加,每一层都是前一层的基础上进行的更改。
例如,我们在构建镜像的时候
FROM ubuntu:20.04
创建了一个基础层,包括 Ubuntu 20.04 的所有文件。RUN apt-get update && apt-get install -y nginx
添加了一个新层,包含了安装 Nginx 后的变化。COPY . /app
又添加了一层,将应用代码复制到镜像中。
层的好处
重用和缓存
使用层可以提高资源的重用。如果多个镜像基于同一个基础镜像,它们都可以重用这个基础镜像的层,节省存储空间,并加快镜像的下载和部署速度。Docker 会缓存每一层,当重新构建镜像时,如果某一层之前已被构建并且指令没有变化,Docker 会重用这个缓存层。
效率和速度
分层也允许更快的迭代开发。因为每次只需要重新构建那些发生变化的层。这使得构建、测试和推送更改到生产变得更快。
减少风险
每一层的独立性有助于安全性,因为可以精确控制和审查每一层的内容,从而降低引入不安全或不稳定代码的风险。
层的存储机制
在技术上,Docker 使用联合文件系统(Union File System)来组合多个层,使它们看起来如同一个单一的文件系统。这意味着虽然物理上层与层之间是分开存储的,但在逻辑上用户会看到一个整合后的文件系统。
层的存储大小和共享
层是以增量方式存储的。例如,如果第一层占用 1MB,第二层相对于第一层又增加了 1MB 的内容,那么这两层的总大小就是 2MB。如果第二层是修改第一层中的内容,则这部分空间不会简单相加,而是取决于修改后的文件大小。
多个镜像可以共享相同的底层层。如果你有多个镜像都基于同一个操作系统镜像(例如 ubuntu:20.04
),那么这个操作系统层只需要在物理存储上保存一次,而所有基于它的镜像都可以使用这同一层。