Docker RootFS是Docker镜像中的根文件系统,也就是Docker容器启动后所使用的文件系统。Docker RootFS由多个只读层(read-only layer)组成,其中最底层的只读层称为base layer,它包含了操作系统的文件系统和一些基础的工具和库。而之后的只读层则是在base layer的基础上增加了一些新的文件和修改了一些文件,这样就形成了完整的文件系统。当我们使用docker save命令将镜像保存为tar包时,实际上是将这些只读层的tar文件打包成一个大的tar文件。通过分析Docker镜像压缩包解压的镜像层文件和镜像RootFS之间的关系,可以帮助我们更好地了解镜像的构建过程和组成结构,从而更好地管理和维护Docker镜像。
下载、打包、解压镜像
docker pull nginx:latest
mkdir -p ~/test
docker save -o ~/test/nginx.tar nginx:latest
cd ~/test
tar -xvf nginx.tar
镜像分层文件查看
-
docker inspect nginx:latest 查看镜像 RootFS 信息
-
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:ac4d164fef90ff58466b67e23deb79a47b5abd30af9ebf1735b57da6e4af1323",
"sha256:a8311013964725a288e00b53cfcf67d9303c4b3bc2ad7475cfc3b25867580ace",
"sha256:4ca29ffc4a01ee651811c21b457cea0f2f5d5b0270d258208391a17998675a79",
"sha256:bf8b62fb2f13ed1f2da4fd11f8136180c3284e88af95d7f00d21c8064f99f3b1",
"sha256:7757099e19d2d8f2e1c09c9076524f912de42e6c76bc8a082ff178d74b5f54a6",
"sha256:12a568acc014fad0d74cfa5509c6f55e80db2afb199ad5c1bdff05e2b6d1e5c7",
"sha256:9e96226c58e7d2ab330522f49a51eb25037d4f89bfc53fa2c10b910184fa6b78"
]
}
-
-
查看镜像tar包解压之后的文件夹
-
├── 00d5c5e5d0a19adb9036d43cd48eaf0f258c244e559abe490494ef64412af3df
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── 0c86edae507f55fa16002173eaacb2e47287a68d12b751faa87dbbde957bb6d3
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── 28d43826d84d2204400a588e56d0c2cf7bb55cb67d034d3050bdc7898c8adb55
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── 2a08e4bd702fcd75953db538ecd13fd646e672dc9639260c773029ad770396a2
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── bd960aa9ca15c6fd2999137a7039ad92e6250b97b78691b187342365ebcddb0c
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── cc2150f8f1b853545c0f466b808a55fe56fc379d767ca9528b0fbcfd6d2d5a35
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── eb4a57159180767450cb8426e6367f11b999653d8f185b5e3b78a9ca30c2c31d.json
├── f181d77f1665c11b08f6ec0a30a9f294086d4a2fee432dfb5eb33176f998f9a4
│ ├── json
│ ├── layer.tar
│ └── VERSION
├── manifest.json
├── nginx.tar
└── repositories
-
映射关系分析
- 计算解压之后的各层文件的layter.tar的sha256
- sha256sum 00d5c5e5d0a19adb9036d43cd48eaf0f258c244e559abe490494ef64412af3df/layer.tar
- sha256:12a568acc014fad0d74cfa5509c6f55e80db2afb199ad5c1bdff05e2b6d1e5c7
- sha256sum 0c86edae507f55fa16002173eaacb2e47287a68d12b751faa87dbbde957bb6d3/layer.tar
- sha256:9e96226c58e7d2ab330522f49a51eb25037d4f89bfc53fa2c10b910184fa6b78
- sha256sum 28d43826d84d2204400a588e56d0c2cf7bb55cb67d034d3050bdc7898c8adb55/layer.tar
- sha256:7757099e19d2d8f2e1c09c9076524f912de42e6c76bc8a082ff178d74b5f54a6
- sha256sum 2a08e4bd702fcd75953db538ecd13fd646e672dc9639260c773029ad770396a2/layer.tar
- sh256:ac4d164fef90ff58466b67e23deb79a47b5abd30af9ebf1735b57da6e4af1323
- sha256sum bd960aa9ca15c6fd2999137a7039ad92e6250b97b78691b187342365ebcddb0c/layer.tar
- sha256:4ca29ffc4a01ee651811c21b457cea0f2f5d5b0270d258208391a17998675a79
- sha256sum cc2150f8f1b853545c0f466b808a55fe56fc379d767ca9528b0fbcfd6d2d5a35/layer.tar
- sha256:a8311013964725a288e00b53cfcf67d9303c4b3bc2ad7475cfc3b25867580ace
- sha256sum f181d77f1665c11b08f6ec0a30a9f294086d4a2fee432dfb5eb33176f998f9a4/layer.tar
- sha256:bf8b62fb2f13ed1f2da4fd11f8136180c3284e88af95d7f00d21c8064f99f3b1
- sha256sum 00d5c5e5d0a19adb9036d43cd48eaf0f258c244e559abe490494ef64412af3df/layer.tar
由上可以得出结论,通过docker save下载的镜像tar包解压之后的文件夹为一串随机生成的字符,镜像RootFS各层被打包成了layer.tar,放进了文件夹中,通过计算各个文件夹下的layer.tar的sha256值,可以得到RootFS和docker镜像tar包各文件夹的映射关系。
应用场景
Docker镜像防篡改:发现Docker容器本地镜像非法篡改的风险,确保容器运行安全。
Docker镜像还原:通过解压tar包,还原完整的镜像,以便于在其他环境中部署和运行镜像。