docker managed volume 与 bind mount 在使用上的最大区别是不须要指定 mount 源,指明 mount point 就好了。仍是以 httpd 容器为例:html
root@cuiyongchao:~# docker run -d -p 84:80 -v /usr/local/apache2/htdocs/ httpd ddc068dfa02cf824ab67ad9abbedc71addbbc7563ec548917c46003fa961abb8
咱们经过 -v
告诉 docker 须要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。那么这个 data volume 具体在哪儿呢?docker
这个答案能够在容器的配置信息中找到,执行 docker inspect
命令:apache
root@cuiyongchao:~# docker exec -it ddc068dfa02c /bin/bash root@ddc068dfa02c:/usr/local/apache2# cat htdocs/index.html <html><body><h1>It works!</h1></body></html> root@ddc068dfa02c:/usr/local/apache2# exit exit root@cuiyongchao:~# docker inspect ddc068dfa02c "Mounts": [ { "Type": "volume", "Name": "c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7", "Source": "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data", "Destination": "/usr/local/apache2/htdocs", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
docker inspect
的输出不少,咱们感兴趣的是 Mounts
这部分,这里会显示容器当前使用的全部 data volume,包括 bind mount 和 docker managed volume。bash
Source
就是该 volume 在 host 上的目录。curl
原来,每当容器申请 mount docker manged volume 时,docker 都会在/var/lib/docker/volumes
下生成一个目录(例子中是 "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data),这个目录就是 mount 源。学习
下面继续研究这个 volume,看看里面有些什么东西:ui
root@cuiyongchao:~# cat /var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html <html><body><h1>It works!</h1></body></html> root@cuiyongchao:~#
volume 的内容跟容器原有 /usr/local/apache2/htdocs 彻底同样,这是怎么回事呢?这是由于:若是 mount point 指向的是已有目录,原有数据会被复制到 volume 中。url
但要明确一点:此时的 /usr/local/apache2/htdocs 已经再也不是由 storage driver 管理的层数据了,它已是一个 data volume。咱们能够像 bind mount 同样对数据进行操做,例如更新数据:code
root@cuiyongchao:~# echo "update volume from host">/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data/index.html root@cuiyongchao:~# curl 10.0.0.20:84 update volume from host root@cuiyongchao:~#
简单回顾一下 docker managed volume 的建立过程:htm
除了经过 docker inspect
查看 volume,咱们也能够用 docker volume
命令:
root@cuiyongchao:~# docker volume ls DRIVER VOLUME NAME local c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7 root@cuiyongchao:~# docker volume inspect c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7 [ { "CreatedAt": "2020-11-02T04:00:43Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7/_data", "Name": "c1449253c7c2d82ea2e51001de919b85f16ed5a0afa13cc3e44624a7a55208a7", "Options": null, "Scope": "local" } ] root@cuiyongchao:~#
目前,docker volume
只能查看 docker managed volume,还看不到 bind mount;同时也没法知道 volume 对应的容器,这些信息还得靠docker inspect
。
咱们已经学习了两种 data volume 的原理和基本使用方法,下面作个对比:
相同点:二者都是 host 文件系统中的某个路径。
不一样点:
bind mount | docker managed volume | |
---|---|---|
volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
对已有mount point 影响 | 隐藏并替换为 volume | 原有数据复制到 volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
移植性 | 移植性弱,与 host path 绑定 | 移植性强,无需指定 host 目录 |
下节讨论如何经过 data volume 实现容器与 host,容器与容器共享数据。