Docker数据卷原理

Docker的数据的本质是容器中一个特殊的文件或目录(挂载点)。在容器的创建过程中,这个挂载点会被 挂载一个宿主机上的指定的目录 (一个以volumeID为名称的目录 或者指定的宿主机目录)。

例1: docker run -v /data busybox /bin/sh

//将宿主机上的volume_id目录绑定挂载到rootfs中指定的挂载点/data上 mount("/var/lib/docker/vfs/dir/volume_id","rootfs/data","none",MS_BIND,NULL);

例2: docker run -v /var/log:/data busybox /bin/bash

//将宿主机上的/var/log目录绑定挂载到rootfs中指定的挂载点/data上 mount("/var/log","rootfs/data","none",MS_BIND,NULL);

以上两种挂载方法的区别除了挂载的源目录不一样外,root/data目录下原来的文件在例1下是不存在的,但在例2下是仍旧存在的。

  • 创建Volume

volume的来源只有3种:即从容器挂载、从宿主机挂载和从他容器共享。内部通过Mount对象来维护逻辑。

  • 删除Volume

如果删除容器时带有-v标签或是这个容器运行时带有一个--rm标签,删除容器时会尝试删除这个容器所使用的volum。在将自己从volume的Container列表中删除后,判断volume的Container的列表是否为空,如果这个volume不被任务容器使用,则将这个volume删除 ,然后做以下两件事:

  1. 删除这个volume对应的配置文件;
  2. 如果这个volume是从容器挂载的,所以只需要删除宿主机上对应的volume_id文件夹。

  3. volume的相关配置文件

Docker的每个容器在docker/containers文件夹下有一个以容器ID命名的子文件夹,这个子文件夹中的config.json文件是这个容器的配置文件,可以从中看到这个容器所使用的volume ID以及它们的可写情况。 如果你要查看volume的具体信息,你可以在docker/volumes文件夹下找与volume id命名的子文件夹,这个子文件夹中的config.json文件包含了volume的具体信息。