Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。html
若是运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件的副本所隐藏,即写时复制(COW)
机制。node
卷为docker提供了独立于容器的数据管理机制:mysql
程序
,把卷类比为动态内容,例如数据
,因而,镜像能够重用,而卷能够共享程序(镜像)
和数据(卷)
分离,以及程序(镜像)
和制做镜像的主机
分离,用户制做镜像时无须再考虑镜像运行的容器所在的主机环境。Docker的存储卷有两种类型:nginx
dockerd
来管理,默认是宿主机上的/var/lib/docker/volumes/<volume ID>
为docker container run
命令使用-v
选项便可使用volume。sql
Bind moutn volume建立方式docker
root@node01:~# docker container run -i -t --rm --name bbox01 -v /data/pub/html:/data/html busybox:latest / # ls /data/html/ / #
-v /data/pub/html:/data/html
分号前表示宿主机上的绑定目录,分号后表示容器内的绑定目录,目录若是不存在会自动建立。tomcat
若是要绑定多个目录关系,-v
选项可使用屡次。网络
到宿主机上查看是否有/data/pub/html
目录架构
root@node01:~# ls /data/pub/html/ root@node01:~# echo "hello..." > /data/pub/html/index.html root@node01:~# ls /data/pub/html/ index.html
目录被自动建立,而且增长了一个文件,再回到容器内查看,也能查看到相应的文件ide
root@node01:~# docker container run -i -t --rm --name bbox01 -v /data/pub/html:/data/html busybox:latest / # ls /data/html/ / # ls /data/html/ index.html
查看容器的详细信息能够看到mount的详细信息
root@node01:~# docker inspect bbox01 ... "Mounts": [ { "Type": "bind", "Source": "/data/pub/html", "Destination": "/data/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ], ...
Docker mananged volume建立方式
root@node01:~# docker container run -i -t --rm --name bbox01 -v /data/html busybox:latest / # ls /data/html/ / # echo "hello word." > /data/html/index.html / #
-v /data/html
只有一个路径时表示的是容器内部的目录。
能够探测下存储卷在宿主机上的位置
root@node01:~# docker inspect bbox01 ... "Mounts": [ { "Type": "volume", "Name": "8c1be16f1b119faba6006b98b7763ce141f8fe2243cc2b970660aac0f33416a4", "Source": "/var/lib/docker/volumes/8c1be16f1b119faba6006b98b7763ce141f8fe2243cc2b970660aac0f33416a4/_data", "Destination": "/data/html", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ] ... root@node01:~# docker inspect -f {{.Mounts}} bbox01 # 使用go模板语法进行过滤 [{volume 8c1be16f1b119faba6006b98b7763ce141f8fe2243cc2b970660aac0f33416a4 /var/lib/docker/volumes/8c1be16f1b119faba6006b98b7763ce141f8fe2243cc2b970660aac0f33416a4/_data /data/html local true }] root@node01:~# cat /var/lib/docker/volumes/8c1be16f1b119faba6006b98b7763ce141f8fe2243cc2b970660aac0f33416a4/_data/index.html hello word.
宿主机上的一个目录能够绑定给多个容器,即多个容器就能够经过这个存储卷进行数据共享,只须要在启动容器时经过-v
选项进行绑定便可。若是须要共享存储卷的容器较多时,每个容器都须要-v HOST_DIR:CONTAINER_DIR
指定绑定关系,docker为了简化,在运行容器时能够复制其余容器的存储卷绑定关系来达到挂载与之相同的存储卷。
要想复制其余容器的存储卷绑定关系,使用--volumes-from
选项
先启动一个容器
root@node01:~# docker container run -i -t --rm --name bbox01 -v /data/pub/html:/data/html busybox:latest / # ls /data/html/ index.html / # cat /data/html/index.html hello... / #
再启动另外一个容器,使用--volumes-from
选项复制bbox01
的存储卷信息
root@node01:~# docker container run -i -t --rm --name bbox02 --volumes-from bbox01 busybox:latest / # ls /data/html/ index.html / # cat /data/html/index.html hello...
一样可使用docker inspect
命令查看两个容器存储卷的挂载信息。bbox02
同bbox01
容器实现了挂载相同的存储卷。
结合联盟式网络和存储卷复制的特性,能够实现这样一个架构,nginx + tomcat + mysql
,nginx反代到tomcat,tomcat与mysql进行交互,他们各自运行在一个容器中,经过联盟式网络让三者共享网络名称空间,外部请求nginx的容器地址,nginx与tomcat通讯走lo接口,tomcat与mysql通讯也走lo接口,网页存放与mysql的数据存放都经过存储卷绑定到宿主机上。
这种架构的实现,通常先制做一个基础架构
容器,该容器能够不处理于运行状态,只要建立好便可,它提供网络名称空间
,存储卷
等基础配置,nginx
,tomcat
和mysql
三个容器在启动时加入到基础架构
容器的网络名称空间,并复制它的存储卷信息。
这样灵活运用联盟网络和存储卷的复制特性能够演变出一些有趣的架构。