volume是用于docker挂载卷之用,用于docker的文件持久化,但有多种使用方式,具体有什么区别?

第一种:在Dckerfile里面直接使用volume来声明,具体如下:

#基于ubuntu镜像进行构建
FROM ubuntu

VOLUME ["/home"]

可以看到指定了/home目录进行挂载,这种方式的卷会在宿主机docker默认路径/var/lib/docker/volumes/下生成一个随机文件夹存放/home下的数据,这个随机文件夹没法进行命名,由docker生成的。但有个好处是同基镜像可以共享,如上dockerfile文件,run了多个容器后,这几个容器都能读取到/home的文件,这样就可以避免每一个run都要使用-v来指定/home

第二种用docker run -v方式

docker run -v work:/home
docker run -v /work:/home

如上使用了-v的方式是可以对加载卷进行命名的,第一种会在宿主机/var/lib/docker下生成work的文件夹挂载/home,而第二种是在宿主机的/目录下下创建work文件夹再挂载/home目录。

另外需要注意的是docker run -v的方式只对当前run的容器生效,而且宿主机的声明的挂载点要使用绝对路径无法用相对路径(如用当前目录的./work这样的写法是不行的)