欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker Volume

程序员文章站 2022-05-11 12:05:24
...

Docker数据卷

概念

  Volume是存在于一个或多个容器中的特定文件或文件夹,这个目录能够以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供一下便利:

  • Volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件。
  • Volume能在不同的容器之间共享和重用。
  • 对Volume中的数据操作会马上生效。
  • 对Volume中数据的操作不会影响到镜像本身。
  • Volume的生存周期独立于容器的生存周期,即使删除容器,Volume仍然会存在,没有任何容器使用的Volume也不会被Docker删除。

使用

  Volume类似于linux的mount操作,用户将一个文件夹作为Volume挂载到容器上,可以很方便的将数据添加到容器中提供其中的进程使用。多个容器可以共享同一个Volume,为不同容器之间的数据共享提供了便利。

从容器挂载Volume

  在使用docker run或docker create命令创建容器时,可以使用-v标签为容器添加Volume。
docker run -itd --name redis-master -v /data centos bash
  在创建容器时,会将容器中的/data目录作为一个Volume挂载点。可以使用docker inspect -f {{.Volumes}} redis-slave命令来查看该容器卷在宿主机的位置:

map[/data:/var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data]

接下来来验证下:
cp unstable.tar.gz /var/lib/docker/volumes/fea37bc27b3ea5111f115502d539415b9d7744ae0356e43ba062f1272d825c0d/_data

docker exec -it redis-slave bash

ls /data/

unstable.tar.gz

从宿主机挂载Volume

  创建新容器的时候挂载一个主机上的特定目录到容器中
docker run -itd --name redis-slave -v /data/package:/data/apps centos /bin/bash
  将宿主机中的/data/package目录文件夹作为一个Volume挂载到容器中的/data/apps下。
挂载镜像时可以指定挂载权限/data/package:/data/apps:ro

使用Dockerfile添加Volume

使用VOLUME指令向容器添加Volume:
VOLUME /data
VOLUME ["/data1","/data2"]:添加多个Volume
  在执行docker build命令时会生成镜像并且以此镜像启动一个容器时会挂载一个Volume到/data。但是和docker run -v 不同的是,VOLUME指令不能挂载主机指定文件夹,这是因为我们要保证Dockerfile的可移植性,我们不能确保每个使用此Dockerfile的宿主机都有对应这个文件夹。

共享Volume

在使用docker run/create命令创建新容器时,可以使用--volume-from标签使得容器与已有的容器共享Volume。
docker run -itd --name mysql --volume-from redis-master centos /bin/bash
  新创建的容器mysql与原容器redis-master共享Volume,也就是说此时redis-master拥有的Volume同样会挂载到mysql上。
可以使用多个--volume-from使容器与多个已有容器共享Volume

删除Volume

如果创建容器时在容器中挂载了Volume,在/var/lib/docker/vfs/dir下会生成与Volume对应的目录,使用docker rm 删除容器并不会删除与Volume对应的目录,这些目录会占据不必要的存储空间,即便可以手动删除,也非常麻烦,所以在删除容器时需要对容器的Volume进行妥善处理。

再删除容器时同时删除Volume有以下两种方法:

  • docker rm -v
  • 运行容器时使用docker run --rm--rm标签会在容器停止运行时删除容器及容器所挂载的Volume。

当然如果是从宿主机挂载的Volume,无论对容器进行任何操作都不会导致其在宿主机上被删除,如果不需要这些文件了,只能手动删除它们。