docker快速入門5-存儲卷

docker快速入門5-存儲卷

Docker鏡像由多個只讀層疊加而成,啓動容器時,Docker會加載只讀鏡像層並在鏡像棧頂部添加一個讀寫層。html

若是運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫下面的只讀層複製到讀寫層,該文件的只讀版本依然存在,只是已經被讀寫層中該文件的副本所隱藏,即寫時複製(COW)機制。node

卷爲docker提供了獨立於容器的數據管理機制:mysql

  • 能夠把鏡像想像成靜態文件,例如程序,把卷類比爲動態內容,例如數據,因而,鏡像能夠重用,而卷能夠共享
  • 卷實現了程序(鏡像)數據(卷)分離,以及程序(鏡像)製做鏡像的主機分離,用戶製做鏡像時無須再考慮鏡像運行的容器所在的主機環境。

存儲卷分類

Docker的存儲卷有兩種類型:nginx

  1. Bind mount volume,即綁定掛載卷,簡單說來就是宿主機上的一個文件路徑與容器內的一個文件路徑創建綁定關係。
  2. Docker managed volume,即Docker管理卷,簡單說來是容器內的一個文件路徑與宿主機上的文件路徑的綁定關係不是用戶操做,而是交給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命令查看兩個容器存儲卷的掛載信息。bbox02bbox01容器實現了掛載相同的存儲卷。

聯盟網絡與存儲卷複製

結合聯盟式網絡和存儲卷複製的特性,能夠實現這樣一個架構,nginx + tomcat + mysql,nginx反代到tomcat,tomcat與mysql進行交互,他們各自運行在一個容器中,經過聯盟式網絡讓三者共享網絡名稱空間,外部請求nginx的容器地址,nginx與tomcat通訊走lo接口,tomcat與mysql通訊也走lo接口,網頁存放與mysql的數據存放都經過存儲卷綁定到宿主機上。

這種架構的實現,通常先製做一個基礎架構容器,該容器能夠不處理於運行狀態,只要建立好便可,它提供網絡名稱空間存儲卷等基礎配置,nginxtomcatmysql三個容器在啓動時加入到基礎架構容器的網絡名稱空間,並複製它的存儲卷信息。

這樣靈活運用聯盟網絡和存儲卷的複製特性能夠演變出一些有趣的架構。

相關文章
相關標籤/搜索