nerdctl 是 Containerd 的上层封装工具。实现了 container、volume, network 的创建和管理。与它同层次的替代方案还有 docker、podman、K8S(K8S 的使用场景更复杂)。
nerdctl 的组成
- 容器
- Containerd
- 镜像
- BuildKit: for using
nerdctl build. BuildKit daemon (buildkitd) needs to be running.
- BuildKit: for using
- 存储
- 网络
- CNI plugins: for using
nerdctl run. - CNI isolation plugin: for isolating bridge networks (
nerdctl network create)
- CNI plugins: for using
- 其他
- RootlessKit and slirp4netns: for Rootless mode
data_root
data_root 是存储 nerdctl 数据的根目录。根据 nerdctl 的全局选项 (Global Flags) --data-root 指定。
其默认值是根据当前系统(linux,freebsd,windows)有区分,具体见源码。linux 系统下
data_root 是根据 nerdctl run —data-root 指定的路径。
linux 系统下,如果是 rootful 模式,默认值 /var/lib/nerdctl。如果是 rootless 模式,默认值是 <XDGDataHome>/nerdctl。
dataStore
dataStore 存储 nerdctl 的数据的目录。它的路径是 dataStore=<data_root>/<addr_hash>。
addr_hash 是计算 containerd.sock 文件路径的 sha256 值的前 8 个字符。具体计算方法如下:
addr_hash=$(echo -n "/run/containerd/containerd.sock" | sha256sum | cut -c1-8)
假设 addr_hash 值是 1935db59(通常都是这个,因为 containerd.sock 路径都是用默认的),data_root 值是 /var/lib/nerdctl,那么 dataStore 值就是 /var/lib/nerdctl/1935db59。
containerd.sock 文件路径可以在 config.toml(默认是 /etc/containerd/config.toml)里的 grpc.address 配置。
再来看 dataStore 下放了什么文件。
$ ls /var/lib/nerdctl/1935db59/
containers etchosts names volumes这四个目录分别是 nerdctl 所管理的容器、网络、容器名称、存储卷。