二、docker的数据卷
为什么要用数据卷?
答:解决数据持久化的问题。将数据和容器进行隔离,因为容器在使用过程中可能会随时销毁,创建和释放都非常频繁。
docker分层文件系统特点:?(1)性能差; (2)生命周期与容器相同
docker数据卷特点:(1)mount到主机中,绕开分层文件系统; (2)和主机磁盘性能相同,容器删除后依然保留 ;(3)仅限本地磁盘,不能随容器迁移
docker提供了两种卷:(1)bind mount; (2)docker managed volume
1、Docker数据卷管理
bind mount :
默认权限是读写rw,可以在挂载时指定只读ro。 -v选项指定的路径,如果不存在,挂载时会自动创建。创建后宿主机文件会自动覆盖容器的文件。
docker run --rm -it -v /data1/:/data1 busybox
docker run --rm -it -v /data1/:/data1 -v /data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/dvd.repo:ro busybox
docker managed volume:
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。
默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。不会覆盖原有文件。
[root@server1 _data]# docker volume create vol1
vol1
[root@server1 _data]# docker volume inspect vol1
[
{
"CreatedAt": "2022-02-20T13:59:52+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vol1/_data",
"Name": "vol1",
"Options": {},
"Scope": "local"
}
]
[root@server1 _data]# docker run -d --name demo -v vol1:/var/lib/registry registry
e833d4a02914ffd34c9f70797c6ff96749a53fe929bcf3f289aab5f761fbf5c7
[root@server1 _data]# docker inspect demo
"Mounts": [
{
"Type": "volume",
"Name": "vol1",
"Source": "/var/lib/docker/volumes/vol1/_data",
"Destination": "/var/lib/registry",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
bind mount与docker managed volume对比:
相同点:两者都是 host 文件系统中的某个路径。
不同点:
注意:实际操作时发现:
使用volume方式时,若宿主机</var/lib/docker/volumes/vol1/_data>有文件,则容器内会显示宿主机的文件;若该路径下没有文件,则会显示容器内的文件。
使用bind mount时,无论宿主机映射的路经下有没有文件,容器内始终与宿主机的文件相同。
2、跨节点容器数据同步——卷插件简介
实际生产环境中,如果某台宿主机的docker容器挂掉了,可以调度到其他主机继续提供服务;但是原宿主机的数据却无法同步。所以接下来要解决跨主机的数据同步问题。
(1)卷插件官网文档
docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动,可以查看以下链接:
Use Docker Engine plugins | Docker Documentationhttps://docs.docker.com/engine/extend/legacy_plugins/#volume-pluginsdocker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。 Docker volume plugins | Docker DocumentationHow to manage data with external volume pluginshttps://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol(2)卷插件简介
Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
3、convoy卷插件实践
docker clirnt --> docker daemon --> convoy plugins --> nfs
|