Skip to content

1. 存储挂载

1.1 简介

容器的本质是一种特殊的进程,它使用namespace进行隔离,使用cgroup进行资源限制,并且以联合文件系统的形式挂载了单独的rootfs。 Containerd默认配置的snapshotter是overlayfs,overlayfs是联合文件系统的一种实现,overlayfs将只读的镜像层成为lowerdir,将读写的容器层成为upperdir,最后联合挂载呈现出mergedir。 容器中新写入的文件默认存储在容器的执行层,当容器被删除时,这些数据也就丢失了。如果想要在容器被删除后保留之前创建的文件,就需要将文件保存在宿主机上。

1.2 三种模式

nerdctl对容器存储挂载的支持基本上与Docker一致,支持bind mounts, volumes, tmpfs三种模式,下图是docker的文档中给的这三种模式的示意图:

Docker Compose
  • bind mounts: 可以将文件数据存储在宿主机上的任意位置,其他的应用程序也有权对这些文件进行修改
  • volumes: 将文件数据存储在宿主机上nerdctl的数据目录内,此目录应该由nerdctl管理,默认是/var/lib/nerdctl/xxx/volumes/<containerd namespace>
  • tmpfs将文件数据存储在宿主机的内存中,并不会写入磁盘中 (当前nerdctl 0.11.0还不支持此模式)。tmpfs的使用场景适用于出于安全考虑,将一些认证信息存储到tmpfs中,或者出于性能考虑需要将一些状态信息存储在内存中同时又不需要持久化的场景

1.bind mounts

bind mounts可以将文件数据存储在宿主机上的任意位置,这意味着其他的应用程序也有权对这些文件进行修改。 注意使用bind mounts将宿主机目录挂载到容器中时,容器目录中原有的文件将会被隐藏,在容器内只能看到挂载进来的宿主机目录

nerdctl run -d -v /tmp/mydir:/etc/profile.d redis:alpine3.14
nerdctl run -d -v /tmp/mydir:/etc/profile.d redis:alpine3.14

2.volumes

volumes由nerdctl创建和管理,可以使用nerdctl volume create命令显示的创建volume。

注意,使用volume时,容器目录中原有的文件不会被隐藏容器目录中,原有的文件将被拷贝到volume所在的宿主机目录。

bash
#创建
nerdctl volume create redis-data


#查看
nerdctl volume ls

#挂载
nerdctl run -d -v redis-data:/data redis:alpine3.14
#创建
nerdctl volume create redis-data


#查看
nerdctl volume ls

#挂载
nerdctl run -d -v redis-data:/data redis:alpine3.14

参考: