Docker 数据管理 - 数据卷
我们知道,Docker 提供了两类数据管理的方式:
- 挂载宿主机目录或文件;
- 使用数据卷;
上节课我们学习了挂载宿主机目录或文件的数据管理方式。本节,我们介绍如何使用 Docker 数据卷。但是明明可以使用挂载宿主机目录或文件的方式,为什么还要使用数据卷呢?
其实,使用数据卷的好处就在于:我们不必自己维护一个外部路径挂载和存储的关系,借助Docker管理数据,并且通过语义化数据卷命名,更加方便直观地使用它来数据共享。
1. 使用数据卷
在使用数据卷进行挂载时,我们只需指定容器中被挂载的目录即可:
docker run -d -it --name busybox -v mydata:/tmp busybox
Tips:mydata 是 Docker 数据卷的名称, 不是宿主机的目录或文件,为了避免混淆,指定当前路径下的目录或文件挂载方式时,源地址需要使用绝对路径。
数据卷挂载到容器后,我们可以通过 docker inspect busybox
看到容器中数据卷挂载的信息。
其中,Type
代表这是挂载类型为volme
卷,Name
标识数据卷的名称是我们之前指定的mydata
,Source
标明在要挂载的数据卷在宿主机的真实路径为/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 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷或者绑定挂载宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主发生读写,其性能和稳定性更高。