重学容器24: nerdctl启动containerd容器存储挂载volume
2021-07-23
上一节学习了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,再挂载使用:
1nerdctl volume create redis-data
2
3nerdctl volume ls
4VOLUME NAME DIRECTORY
5redis-data /var/lib/nerdctl/1935db59/volumes/default/redis-data/_data
6
7nerdctl run -d -v redis-data:/data redis:alpine3.14
启动容器时自动创建匿名的volume #
也可以在启动容器时自动创建匿名的volume:
1nerdctl run -d -v /data redis:alpine3.14
2
3nerdctl volume ls
4VOLUME NAME DIRECTORY
5aef94401bf17c04a8809a765fb57e0355ff6198862bff25621318e06ddf25e51 /var/lib/nerdctl/1935db59/volumes/default/aef94401bf17c04a8809a765fb57e0355ff6198862bff25621318e06ddf25e51/_data
Dockerfile中添加volume #
在Dockerfile的语法中可以通过VOLUME
指令创建一个或多个volume,当使用构建出来的镜像启动容器时将自动创建和挂载为匿名的volume。
Dockerfile的语法如下:
1# 创建一个
2VOLUME /data
3# 创建多个
4VOLUME ["/data1", "/data2"]
对于VOLUME /data
,要求镜像中必须先存在/data目录,在启动容器时将自动创建匿名volume并挂载到该目录,而且这个目录里原来的文件都将全部被复制到宿主机中volume对应的文件夹中。
一般在Dockerfile创建volume的常用模式如下:
1# 先创建挂载点目录
2RUN mkdir /data
3# 挂载点目录中可以预先写入一些必要的文件,这些文件在启动容器时将会被自动拷贝到宿主机volume所在目录中
4RUN touch /data/file
5# 声明创建volume
6VOLUME /data
另外对于匿名volume,在删除容器时可以显示通过-v
选项自动删除容器关联的匿名volume。
1# rm命令的-v参数表示自动删除容器关联的匿名volume
2nerdctl rm -v <container-id>