让容器里面的某个目录绑定到宿主机的某个目录。html
容器写数据时,写到/下的数据,最后被写到了容器的可读写层;写到/data下的数据,最后被写到了宿主机的/data目录下了。以下图:mysql
下图的宿主机A,B,C是文件系统NFS的客户端。宿主机A的文件目录A,宿主机B的文件目录B,宿主机C的文件目录C,都是访问NFS上的同一个目录。nginx
使用docker存储卷功能,让宿主机A上运行的mysql容器,产生的数据目录,绑定到宿主机A的文件目录A,因此当由mysql容器产生的数据,就存放到了宿主机A的文件目录A上了,进而就存到到了NFS上了。c++
当宿主机A上运行的mysql容器被删除了,数据仍是在的,存在NFS上了。sql
当在宿主机B或者宿主机C上运行刚才那个mysql容器,也让产生的数据目录,绑定到宿主机B或者宿主机C,能够从NFS上能够拿到数据,因此数据和在宿主机A上运行是同样的。docker
这就给运维提供了极大的便利,容器能够随便部署到集群里的任何机器上了。shell
能够用【存储】,【状态】来划分4个象限。tomcat
nginx只做为反向代理服务器,因此它没有状态也不须要存储。服务器
-v
选项。bind mount volume:手动指定宿主机目录。微信
命令:docker run -v HOSTDIR:CONTAINERDIR
# docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest
docker-managed volume:由docker本身决定宿主机目录。
命令:docker run -v CONTAINERDIR
# docker run --name b1 -it --rm -v /data busybox:latest
咱们不知道被关联的宿主机的目录是啥,使用docker inspect b1
,找到【Mount】里的【Source】,就能够看到了。可是你下次再启动容器是,关联的目录也会变化。
也能够看到Volumes。
# docker inspect b1 "Mounts": [ { "Type": "volume", "Name": "2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063", "Source": "/var/lib/docker/volumes/2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], "Volumes": { "/data": {} },
使用:docker inspect -f {{.Mounts}} b1
,也能够看到。注意大括号里的key是区分大小写的。
让2个容器绑定到宿主机的同一个目录,以达到2个容器的通讯。
# docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest # docker run --name b2 -it --rm -v /tmp/html:/data2 busybox:latest
2个容器都绑定到了宿主机的/tmp/html上了。
当另外一个容器想和某个容器绑定到宿主机的同一个目录时,可是又不知道宿主机的目录,这时,可让这个容器直接使用某个容器的volume,这样一来,就不用知道宿主机的目录了。
命令:docker run --volumes-from b1
# docker run --name b2 -it --rm --volumes-from b1 busybox:latest
volume和joined containers(参考:二,host章节 )一块儿使用,建立nginx容器和tomcat容器,共享base容器的网络空间和volume。
找一个容器,做为基础,它使命是:
# docker run --name base -it -v /tmp/html:/data busybox:latest
启动nginx容器:--network container:base --volumes-from base
# docker run --name nginx -it --rm --network container:base --volumes-from base busybox:latest
启动tomcat容器:--network container:base --volumes-from base
# docker run --name tomcat -it --rm --network container:base --volumes-from base busybox:latest