上一节学习了nerdctl在启动containerd时挂载外部存储时支持bind mounts, volumes两种模式,当前0.11.0版本的nerdctl还不支持tmpfs。 本节针对volumes的使用做一个总结和复习。先来看一下volume在使用上的一些特点:

  • volume可以在容器启动时自动创建和挂载,自动创建的volume是匿名volume
  • 也可以在启动容器前手动创建命名的volume,在使用nerdctl启动容器时命令参数显示挂载
  • volume的生命周期独立于容器,容器被删除时volume会被保留,使用nerdctl volume单独管理volume
  • volume可以在多个不同容器之间共享或重用

手动创建命名的volume

可以通过nerdctl volume create来创建volume,再挂载使用:

1
2
3
4
5
6
7
nerdctl volume create redis-data

nerdctl volume ls
VOLUME NAME    DIRECTORY
redis-data     /var/lib/nerdctl/1935db59/volumes/default/redis-data/_data

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

启动容器时自动创建匿名的volume

也可以在启动容器时自动创建匿名的volume:

1
2
3
4
5
nerdctl run -d -v /data redis:alpine3.14

nerdctl volume ls
VOLUME NAME                                                         DIRECTORY
aef94401bf17c04a8809a765fb57e0355ff6198862bff25621318e06ddf25e51    /var/lib/nerdctl/1935db59/volumes/default/aef94401bf17c04a8809a765fb57e0355ff6198862bff25621318e06ddf25e51/_data

Dockerfile中添加volume

在Dockerfile的语法中可以通过VOLUME指令创建一个或多个volume,当使用构建出来的镜像启动容器时将自动创建和挂载为匿名的volume。 Dockerfile的语法如下:

1
2
3
4
# 创建一个
VOLUME /data
# 创建多个
VOLUME ["/data1", "/data2"]

对于VOLUME /data,要求镜像中必须先存在/data目录,在启动容器时将自动创建匿名volume并挂载到该目录,而且这个目录里原来的文件都将全部被复制到宿主机中volume对应的文件夹中。

一般在Dockerfile创建volume的常用模式如下:

1
2
3
4
5
6
# 先创建挂载点目录
RUN mkdir /data
# 挂载点目录中可以预先写入一些必要的文件,这些文件在启动容器时将会被自动拷贝到宿主机volume所在目录中
RUN touch /data/file
# 声明创建volume
VOLUME /data

另外对于匿名volume,在删除容器时可以显示通过-v选项自动删除容器关联的匿名volume。

1
2
# rm命令的-v参数表示自动删除容器关联的匿名volume
nerdctl rm -v <container-id>

参考