Docker Volume

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,无论对容器进行任何操作都不会导致其在宿主机上被删除,如果不需要这些文件了,只能手动删除它们。

原文地址:https://www.cnblogs.com/Cherry-Linux/p/8029411.html