【containerd】(202411) 07.containerd默认目录

理解容器镜像 (选自《containerd原理剖析与实战》6.1.1) 未完

Dockerfile中的一条命令生成一个镜像层。
ps:Dockerfile中的ENTRYPOINT并不会生成新的镜像层,实际上不会改变文件系统的命令都不会生成新的镜像层,参考OCI spec中的empty_dir字段(image-spec/config.md at main · opencontainers/image-spec)。
在镜像中所有的镜像层都是只读的。
当容器运行时(如containerd)使用该镜像创建容器时,会在该镜像添加一层可写层,所有容器中的修改操作都会反应在该可写层上。

默认目录

containerd的默认配置文件

1
2
root = /var/lib/containerd
state = "/run/containerd"

root配置的目录是用来保存持久化数据的目录,包括contentsnapshotmetadataruntime

元数据格式

containerd 中的各个微服务插件的元数据都保存在 metadata 中,存储采用了 boltdb 开源数据库。
metadata 在宿主机上保存的路径为 /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db

containerd 中的对象在 boltdb 中保存格式如下。

1
<version>/<namespace>/<object>/<key> -> <field>

其中:

  • <version> : containerd 的版本,当前为 v1
  • <namespace>: 对象所对应的 namespace
  • <object>: 要保存在 boltdb 中的对象类型
  • <key>: 用于指定特定对象的唯一值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
[root@ubuntu-22 ~]# cd /var/lib/containerd
[root@ubuntu-22 containerd]#
[root@ubuntu-22 containerd]# tree -L 2
.
├── io.containerd.content.v1.content
│   ├── blobs
│   └── ingest
├── io.containerd.grpc.v1.introspection
│   └── uuid
├── io.containerd.metadata.v1.bolt
│   └── meta.db
├── io.containerd.runtime.v1.linux
├── io.containerd.runtime.v2.task
│   ├── default
│   └── moby
├── io.containerd.snapshotter.v1.blockfile
├── io.containerd.snapshotter.v1.btrfs
├── io.containerd.snapshotter.v1.native
│   └── snapshots
├── io.containerd.snapshotter.v1.overlayfs
│   ├── metadata.db
│   └── snapshots
└── tmpmounts
[root@ubuntu-22 containerd]# tree -L 3
.
├── io.containerd.content.v1.content
│   ├── blobs
│   │   └── sha256
│   └── ingest
├── io.containerd.grpc.v1.introspection
│   └── uuid
├── io.containerd.metadata.v1.bolt
│   └── meta.db
├── io.containerd.runtime.v1.linux
├── io.containerd.runtime.v2.task
│   ├── default
│   │   └── busybox
│   └── moby
├── io.containerd.snapshotter.v1.blockfile
├── io.containerd.snapshotter.v1.btrfs
├── io.containerd.snapshotter.v1.native
│   └── snapshots
├── io.containerd.snapshotter.v1.overlayfs
│   ├── metadata.db
│   └── snapshots
│   ├── 1
│   ├── 10
│   ├── 11
│   ├── 19
│   ├── 20
│   ├── 21
│   ├── 22
│   ├── 3
│   ├── 4
│   ├── 5
│   ├── 6
│   ├── 7
│   ├── 8
│   └── 9
└── tmpmounts

[root@ubuntu-22 containerd]# tree -L 4
.
├── io.containerd.content.v1.content
│   ├── blobs
│   │   └── sha256
│   │   ├── 0085610e8e12e011cadae7d134773998d2b3027266de827977cd7f6b9dee050e
│   │   ├── 03b30c6a3c320ff172b52bd68eddffde6ded08ce47e650fe52de861c5e9df46d
│   │   ├── 073c978f17eedaee7fb0d36636e1baa2ffdb6a2b5af2e458c9612a85ad06ea5d
│   │   ├── 16edc9559472f368b71e0f19a575e71080f2251f6693e7d560e21cc6472f7da6
│   │   ├── 1e31565f746dc3c88b140a899d974b45ddc25eaaffac76bf7fd504c75c4fb81b
│   │   ├── 1fcc5fefb39fa5244e9673a2cad2f2d4dbc89cb0fbaacdca36c05a90e02af18b
│   │   ├── 33c69a810cc314b55c9e1e218ab9eb1b39034b28b023234854f093a207a87154
│   │   ├── 4950bb10b3f87e8d4a8f772a0d8934625cac4ccfa3675fea34cad0dab83fd5a5
│   │   ├── 4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
│   │   ├── 50aa4698fa6262977cff89181b2664b99d8a56dbca847bf62f2ef04854597cf8
│   │   ├── 5d7c7efa14ca725ee69777fb7bde3be1cc05c4bcb9ce1e710293d371146f2657
│   │   ├── 61f9956af8019caf6dcc4d39b31857b868aaab80521432ddcc216b805c4f7988
│   │   ├── 65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac
│   │   ├── 6c8161c30f9c78e8e5d7c9063a8f79e42d3fed9b540f3c2e49d71aa0deca73df
│   │   ├── 74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
│   │   ├── 796dd77ab5223837579b323c961197514e9b5e37e99babbf51f9bb2ba1dbdcc8
│   │   ├── 8b08414b805beb7a1440493aa6e8cecd4729c536e8f9adc2d26514051bc31422
│   │   ├── 9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
│   │   ├── 9d36ad9352035b98bdff2291a2612ae2d717b1690db6b7ba265e4ad44b15cfa6
│   │   ├── 9d56419430d6bb6e6f9ced00ce8707fac1f3b36ba3e2f45597181276554daa92
│   │   ├── b6425c1785a5de9285e14b515ddb6135b93ca5dd9edb744e1d1916a7a3687405
│   │   ├── ba03bb8a47bbf44b87a1386a93b384e6ad27e84f3898c1e587f4004fe3b95c61
│   │   ├── bdddbe20c61d325166b48dd517059f5b93c21526eb74c5c80d86cd6d37236bac
│   │   ├── c2420332d0c7405cccc405b98ff4a1867bd103cbe571f03ac04b7e1cc7408e76
│   │   ├── c6a83fedfae6ed8a4f5f7cbb6a7b6f1c1ec3d86fea8cb9e5ba2e5e6673fde9f6
│   │   ├── d3515376e10b73f645c97cbad9258641916af76ae518be17e163d3bc3bd64312
│   │   ├── da7b3f96549f51221ac02ad16251b3d0df33bbc4490971b48348fc87eadc4a77
│   │   ├── e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57
│   │   ├── e31c3b1cd47718260e1b6163af0a05b3c428dc01fa410baf72ca8b8076e22e72
│   │   ├── eaea8264f74a95ea9a0767c794da50788cbd9cf5223951674d491fa1b3f4f2d2
│   │   ├── ec562eabd705d25bfea8c8d79e4610775e375524af00552fe871d3338261563c
│   │   ├── ee08ce572c81dd90a3fbb7e2f4e660a5224924efd2649fb717460659b080c41b
│   │   ├── efaa0224e7c87b2dbf8b4f0fee2bd595764adf6065a6bff6fffe833057237f64
│   │   └── fb9c9aef62af3955f6014613456551c92e88a67dcf1fc51f5f91bcbd1832813f
│   └── ingest
├── io.containerd.grpc.v1.introspection
│   └── uuid
├── io.containerd.metadata.v1.bolt
│   └── meta.db
├── io.containerd.runtime.v1.linux
├── io.containerd.runtime.v2.task
│   ├── default
│   │   └── busybox
│   └── moby
├── io.containerd.snapshotter.v1.blockfile
├── io.containerd.snapshotter.v1.btrfs
├── io.containerd.snapshotter.v1.native
│   └── snapshots
├── io.containerd.snapshotter.v1.overlayfs
│   ├── metadata.db
│   └── snapshots
│   ├── 1
│   │   ├── fs
│   │   └── work
│   ├── 10
│   │   ├── fs
│   │   └── work
│   ├── 11
│   │   ├── fs
│   │   └── work
│   ├── 19
│   │   ├── fs
│   │   └── work
│   ├── 20
│   │   ├── fs
│   │   └── work
│   ├── 21
│   │   ├── fs
│   │   └── work
│   ├── 22
│   │   ├── fs
│   │   └── work
│   ├── 3
│   │   ├── fs
│   │   └── work
│   ├── 4
│   │   ├── fs
│   │   └── work
│   ├── 5
│   │   ├── fs
│   │   └── work
│   ├── 6
│   │   ├── fs
│   │   └── work
│   ├── 7
│   │   ├── fs
│   │   └── work
│   ├── 8
│   │   ├── fs
│   │   └── work
│   └── 9
│   ├── fs
│   └── work
└── tmpmounts

60 directories, 37 files
[root@ubuntu-22 containerd]#

快照

由于镜像的每层数据都是压缩且不可修改,所以无法被container直接使用,需要将镜像映射成文件系统才能被容器所使用。将镜像映射成文件系统的方式叫做快照,在containerd里镜像的每一层都是一个快照,下面的层是上一层的parent。默认使用overlayfs作为snapshotters。


containerd镜像储存包括原始镜像内容和镜像文件解压后的内容和相关的元数据。

  • 镜像的原始内容(拉取或导入的镜像)保存在io.containerd.content.v1.content目录。
  • 镜像解压后保存在io.containerd.snapshotter.v1.overlayfs目录(linux下默认的存储插件是overlay)。
  • 镜像相关的元数据(包括images和contents、snapshots)保存在io.containerd.metadata.v1.bolt/meta.db文件。
  • 镜像每一层快照的元数据(目录id、Kind、大小、parent等)保存在io.containerd.snapshotter.v1.overlayfs/metadata.db文件。
  • 容器生成时候会在镜像最上面一层快照之上,创建一个新的快照,作为容器的文件系统来使用。

参考

重学容器09: Containerd是如何存储容器镜像和数据的 | 青蛙小白
Containerd是如何存储镜像? - xiaoqing blog


【containerd】(202411) 07.containerd默认目录
http://example.com/2024/11/06/containerd/【containerd】(202411) 07.containerd与容器存储/
作者
ningan123
发布于
2024年11月6日
许可协议