数据卷是目录或文件,不是块设备。
容器可以读写volume中的数据。
volume数据可以持久化保存。
docker提供了两种卷:
1.bind mount
2.docker managed volume
bind mount | docker managed volume | |
---|---|---|
volume位置 | 可任意指定 | /var/lib/docker/volumes/… |
对已有mount point影响 | 隐藏并替换为volume | 原有数据复制到volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
移植性 | 移植性弱,与host path 绑定 | 移植性强,无需指定host目录 |
bind mount
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用 -v 选项指定路径,格式 <host path>:<container path>
-v选项指定的路径,如果不存在,挂载时会自动创建。
bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel.repo:/rhel.repo:ro ubuntu
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local 28d0a83780680bde4e7b3a31fd70b50da011a2ff543e27a9cf97201b8641fb36
local e9fc8726131cbe181b648615aa2915e4f3c21cd3c3889e8d7584edc21f246b07
删除闲置卷
[root@server1 ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
e9fc8726131cbe181b648615aa2915e4f3c21cd3c3889e8d7584edc21f246b07
docker managed volume
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源。
[root@server1 ~]# docker run -d --name registry registry:2
0fddecaa45b3ab8fd07a2168869b5263742357b86b875c6c3783a56b2f013a74
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local 28d0a83780680bde4e7b3a31fd70b50da011a2ff543e27a9cf97201b8641fb36
local 9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde
使用inspect 查看source
source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。
[root@server1 ~]# docker inspect registry
"Source": "/var/lib/docker/volumes/9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde/_data",
[root@server1 ~]# cd /var/lib/docker/volumes/9b61d748f1e25bf4f7a