镜像元数据
命令 docker inspect 镜像标签或 id,查看 Docker 镜像底层静态元数据。它能以 JSON 格式输出该镜像在本地存储中的完整配置快照,反映的是镜像构建完成、未启动前的静态信息。
以mysql:8.4.4镜像元数据为例
docker inspect mysql:8.4.4
[
{
"Id": "sha256:9755c387b39e71d6f2f8f04b57c9461bf14c8023cb8105768a6e79936f62ed02", // 镜像在本地唯一的身份标识(ID),由一串 SHA256 哈希值组成
"RepoTags": [ // 镜像标签
"mysql:8.4.4"
],
"RepoDigests": [
"mysql@sha256:0917ecc5863323a48203dda0bb7d58582d958da62914024c474bf2e8c5f5ee73"
],
"Parent": "", // 构建此镜像的父镜像 ID
"Comment": "buildkit.dockerfile.v0", // 构建工具的信息,这里表明是通过 BuildKit 引擎根据 Dockerfile 构建的
"Created": "2025-01-21T17:21:51Z", // 镜像具体的创建时间戳
"DockerVersion": "",
"Author": "",
"Architecture": "amd64", // 镜像CPU架构
"Os": "linux", // 镜像操作系统
"Size": 769173324, //镜像的总大小(约 733 MB)
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/caff737209b9e172c88213adf9390a5d28072e4e7224c713c877d1cbc89929e7/diff:/var/lib/docker/overlay2/d2bba407f5a6b9514c734dbbd133cf77700d0acc5dce731e96c01d402cf512f7/diff:/var/lib/docker/overlay2/54a3b74208b361af93ea4fd3fac46210d068964d66e5673858a7c48d445134ba/diff:/var/lib/docker/overlay2/4fa0d55ac4e84acaac024e8370f4b0badc9c0d526e0246482db083ba0e9727d4/diff:/var/lib/docker/overlay2/439e7ea33d0c43c9915735dfc9cf9cbdddd85a94573c077977558250249aa063/diff:/var/lib/docker/overlay2/102ff6e78a170ac0e680befd1d0ec88dde6df8e15758a27b06f3c4084536bfcd/diff:/var/lib/docker/overlay2/a5cea4a5c56a9f90b17dfe7bd05e2e34493ff5774e3706fc7fd51e81725ab452/diff:/var/lib/docker/overlay2/1b840cfccf00a5dc9094deb47213ad4c677b95507373ea32123f825c94a5c93d/diff:/var/lib/docker/overlay2/cacd8784a2f4f7563759dd1ad431e58ccfe79aab44f035be635020af1ab0d7e4/diff",
"MergedDir": "/var/lib/docker/overlay2/00c654a67dd2a91c7a44d7b3890a2db59c12af04e3333d9b563e54ec16f4e4ab/merged",
"UpperDir": "/var/lib/docker/overlay2/00c654a67dd2a91c7a44d7b3890a2db59c12af04e3333d9b563e54ec16f4e4ab/diff",
"WorkDir": "/var/lib/docker/overlay2/00c654a67dd2a91c7a44d7b3890a2db59c12af04e3333d9b563e54ec16f4e4ab/work"
},
"Name": "overlay2"
},
"RootFS": { // 根文件系统,Docker 的 RootFS 并不是一个单一的整体,而是由多个层级叠加而成的。
"Type": "layers", // 分层架构的身份标签
"Layers": [
"sha256:d7b2257a2277cf62be373f5e32a77274c67cdcdb474af84f2f01b95d8f6ebd0d",
"sha256:8a9a80cfc9d8d008fd9d4fad8639880c1ca19141ddae2d9fe8fa1a139f62db9d",
"sha256:aac8e6f6a4d5ceb037504f34b9357133140fb6f9df52fcfe4a8b03b86f779ff8",
"sha256:90f8c30f63261d64a755df329de1f851b0880a3b61dd0a9256c63f27cd1b6c84",
"sha256:f5c7cad92a365bbc9d261426fd6b257999e6946f613eafa9e61d3a6cc2f7b5ed",
"sha256:921b7f4b4374a055b198de9d23e32cdb9a519d7f866a75d56a9515868e8d81ca",
"sha256:2812f5b4f391e81910cfe91af9b570ddf0a9c9aac53d4d731d8c83f423422c72",
"sha256:8ad9ad835882e6644201e55dbf84a1b546b34308bb8e1bca00567ae6fe8f89b8",
"sha256:ad87eeb531bbdca95da830a2be0b4dd56c590f42b30cb1b92cc3932d43feaf52",
"sha256:d7a18e433bb2080dbc8bf49450af7f6cb24e8a5b257402d3930291920c2de4d2"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
},
"Config": { // 核心运行配置
"Cmd": [
"mysqld"
],
"Entrypoint": [
"docker-entrypoint.sh"
],
"Env": [ // 容器内的环境变量
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.17",
"MYSQL_MAJOR=8.4",
"MYSQL_VERSION=8.4.4-1.el9",
"MYSQL_SHELL_VERSION=8.4.4-1.el9"
],
"ExposedPorts": { // 声明了容器内应用监听的端口
"3306/tcp": {},
"33060/tcp": {}
},
"Labels": null,
"OnBuild": null,
"User": "",
"Volumes": { // 声明了需要持久化保存的数据目录
"/var/lib/mysql": {}
},
"WorkingDir": "/" // WorkingDir
}
}
]
镜像构造
联合文件系统
联合文件系统(Union File System,简称 UnionFS)是一种分层、轻量级且高性能的文件系统技术。将多个文件系统层叠在一起,合并为一个统一的虚拟文件系统视图。这种技术在容器化领域(如 Docker)中扮演着至关重要的角色。
核心工作原理
分层结构:底层通常是基础镜像或操作系统环境(只读),上层是应用代码或运行时产生的修改(可写)
优先级与覆盖机制:当用户访问文件时,系统会按照“从顶向下”的顺序查找。如果可写层存在该文件,则直接使用;如果不存在,则继续向下的只读层查找。若多层存在同名文件,高优先级的上层文件会覆盖下层文件。
写时复制:这是联合文件系统的关键特性。当需要修改只读层中的文件时,系统不会直接修改原文件,而是先将其复制到可写层,随后所有的修改都在可写层的副本上进行。这保证了底层原始文件始终不被改。
实现方式
OverlayFS (overlay2):目前 Docker 默认使用的存储驱动,自 Linux 内核 3.18 起被原生支持,具有更好的性能和页面缓存共享功能。
AUFS:早期的联合文件系统实现,曾是 Ubuntu/Debian 上 Docker 的默认驱动,但因未能合并进主线 Linux 内核,现逐渐被 OverlayFS 取代。
Btrfs / ZFS:现代化的文件系统,除了支持类似 UnionFS 的功能外,还提供快照、压缩、数据校验等高级存储特性。
HUBFS:一种专为 GitHub/GitLab 设计的创新型联合文件系统,它将远程 Git 仓库作为只读层挂载到本地,并与本地的可写层无缝结合,方便开发者像操作本地文件一样管理远程代码。
Dockerfile
是一个用于构建 Docker 镜像的文本文件,其中包含一系列 指令(Instruction)。Docker 引擎会根据这些指令,自上而下、逐条执行,最终生成一个不可变的镜像(Image)。