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
三個容器在啓動時加入到基礎架構
容器的網絡名稱空間,並複製它的存儲卷信息。
這樣靈活運用聯盟網絡和存儲卷的複製特性能夠演變出一些有趣的架構。