一、什么是镜像(Image)
1.1 定义
在 Docker 生态系统中,镜像(Image)可以被视为一个只读的模板(Template),它包含了容器运行所需的所有文件系统和配置信息。镜像是用来创建容器(Container)的基础,容器运行时的环境和依赖,都来自于镜像的内容。
举一个通俗的例子,镜像就像是一张“系统安装光盘”,里面有已经安装好的操作系统、软件以及配置,容器相当于从这张“光盘”里启动并运行的“系统实例”。你可以基于同一个镜像创建多个容器,而这些容器拥有相同的文件系统基础和初始环境。
二、Docker 镜像原理
Docker 镜像与传统的完整系统镜像(例如 ISO 或者虚拟机镜像)不同,它基于一系列重要的技术和概念来实现高效的存储和重复使用。
2.1 分层(Layering)
Docker 镜像是分层构建的,也就是一个镜像并非是一个庞大的、不可分割的文件。而是由多层(Layer)叠加而成,每一层都存储了自上一层以来的变化。这些变化可能是对系统文件的添加、修改或删除,也可能是安装软件包等。
- 好处:
- 复用性高:当多个镜像使用相同的层时,宿主机只需要存储这一个层的副本,大大减少了存储空间的浪费。
- 构建速度快:当构建镜像时,如果前面的层没有改变,就可以直接复用缓存,而无需重新构建或下载。
2.2 写时复制(Copy-on-Write, COW)
写时复制是一种在容器运行时才会真正复制文件的技术。也就是说,如果容器只是读取某一层中的文件,并不会产生额外的存储开销;只有当容器对文件进行写操作时,该文件才会被复制到容器的可写层(Writable Layer),然后在复制出来的文件上进行修改。
写时复制保证了镜像层的只读属性,并且让同一镜像衍生出的多个容器能共享只读层,极大地提升了资源利用率和运行效率。
2.3 联合挂载(Union Mount / Union FS)
分层镜像的底层实现方式之一是联合文件系统(Union FS),通过将多层文件系统“合并”成一个统一的文件系统视图,让用户和应用程序看起来就像是一个独立、完整的文件系统。
常见的 Union FS 类型有 OverlayFS、AUFS 等。Docker 默认使用 OverlayFS,具体取决于操作系统和发行版的支持情况。
2.4 内容寻址(Content Addressable)
Docker 还使用了内容寻址存储 (Content Addressable Storage, CAS) 的方式来管理镜像层,也就是说,每一个镜像层都有一个唯一的 ID(通常是哈希值),对应到实际内容。这使得镜像层可以通过哈希值进行校验和去重,一旦同样的层内容已经存在,就可以直接复用,而不需要重复下载或存储。
三、Docker 镜像关键概念
3.1 Registry
Docker Registry 是一个用于集中存储和分发 Docker 镜像的服务器。可以把它理解为“镜像仓库系统”。官方的 Docker Hub 就是一个公共可用的 Docker Registry,另外也有企业或者个人可以搭建自己的私有 Registry。
3.2 Repository
镜像仓库(Repository)是在 Docker Registry 中的一个“项目”或“存储库”,用来归档和区分镜像。一个 Repository 可以包含多个标签(Tag),不同的标签代表同一应用或基础镜像在不同版本或不同构建的镜像。
例如:
library/ubuntu:18.04
library/ubuntu:20.04
library/ubuntu:latest
以上都属于 library/ubuntu
这个仓库 (Repository) 下的不同标签。
3.3 Manifest
Manifest 是用来描述镜像内容和配置的一种清单文件或数据结构,包含了镜像中各层的索引、哈希,以及镜像的配置、依赖信息等。在多架构镜像(Manifest List)中,还会包含针对不同 CPU 架构的镜像指针。
3.4 Image
Image 即镜像本身,是由一个或多个层组成,通过 Manifest 文件或一些信息来指示各层以及对应的元数据。
3.5 Layer
Layer 即镜像层,是 Docker 镜像的基础构建块,体现了对底层文件系统的增量修改。不同镜像可以共享相同的层,从而节省空间和提升下载速度。
3.6 Dockerfile
Dockerfile 是一个文本文件,里面包含了一组指令(如 FROM
、RUN
、COPY
、CMD
等),用于描述如何从一个基础镜像构建出一个新的镜像。Docker 会按照 Dockerfile 中的指令依次执行并生成镜像。
这是最常用的构建镜像方式,能保证自动化与可维护性。
四、镜像管理命令
以下是与镜像管理相关的常用 Docker 命令,以及简要说明和使用示例。
4.1 docker build
- 作用:基于 Dockerfile 构建镜像。
- 常用参数:
-t
:为镜像指定名称和标签,例如-t myimage:1.0
。-f
:指定 Dockerfile 文件