章节索引 :

Docker 数据管理 - 数据卷

我们知道,Docker 提供了两类数据管理的方式:

  1. 挂载宿主机目录或文件;
  2. 使用数据卷;

上节课我们学习了挂载宿主机目录或文件的数据管理方式。本节,我们介绍如何使用 Docker 数据卷。但是明明可以使用挂载宿主机目录或文件的方式,为什么还要使用数据卷呢?

其实,使用数据卷的好处就在于:我们不必自己维护一个外部路径挂载和存储的关系,借助Docker管理数据,并且通过语义化数据卷命名,更加方便直观地使用它来数据共享

1. 使用数据卷

在使用数据卷进行挂载时,我们只需指定容器中被挂载的目录即可:

docker run -d -it --name busybox -v mydata:/tmp busybox

Tips:mydata 是 Docker 数据卷的名称, 不是宿主机的目录或文件,为了避免混淆,指定当前路径下的目录或文件挂载方式时,源地址需要使用绝对路径。

数据卷挂载到容器后,我们可以通过 docker inspect busybox 看到容器中数据卷挂载的信息。
图片描述

数据卷示例

其中,Type代表这是挂载类型为volme卷,Name标识数据卷的名称是我们之前指定的mydataSource标明在要挂载的数据卷在宿主机的真实路径为/var/lib/docker/volumes/mydata/_data,其中/var/lib/docker/volumes/是一个由Docker统一管理的存放路径,Destination表示挂载到 busybox 容器内的路径是/tmp

2. 共用数据卷

通过挂载相同的数据卷,让多个容器能够操作数据卷中的数据,实现容器间的目录共享。

数据卷的命名在 Docker 中是唯一的,让多个容器挂载同一个数据卷, 只需要指定同一个数据卷名称即可。

docker run -d -it --name busybox -v mydata:/tmp busybox
docker run -d -it --name busybox2 -v mydata:/tmp busybox

挂载数据卷时,如果数据卷不存在,Docker 会自动创建,如果同名数据卷已经存在,则直接引用。

这里我们再补充一些常用的数据卷操作:

# 删除数据卷
docker volume rm mydata
# 手动创建数据卷
docker volume create mydata
# 删除那些没有被容器引用的数据卷
docker volume prune

Tips:使用 docker rm -f busybox busybox2 移除不再使用的容器。

3. 对比两种挂载方式

数据卷 是受控存储,是由 Docker 引擎进行管理维护的。

使用卷,你可以不必处理 uid、SELinux 等各种权限问题,Docker 引擎在建立卷时会自动添加安全规则,以及根据挂载点调整权限。并且可以统一列表、添加、删除。另外,除了本地卷外,还支持网络卷、分布式卷。

挂载目录属于用户自行维护,你就必须手动处理所有权限问题,好处就在于这种方式与宿主机的文件交换更方便一些。

4. 小结

数据卷实际上也是宿主机的一个目录,这个目录由 Docker 管理,利用数据卷可以方便地将数据在多个容器中共享。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷或者绑定挂载宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主发生读写,其性能和稳定性更高。