一,docker容器面臨的困境:
- 容器運行中產生的資料,是放到容器堆疊的最頂層,當容器停止并被洗掉后,這些資料就被洗掉了,
- docker采用COW(寫時復制)策略,導致性能低下,比如有個mysql容器,會有頻繁的I/O處理,
二,解決策略:給容器外掛一個存盤檔案系統,它就叫docker存盤卷(Volumes),它獨立于容器的生命周期,洗掉容器時不會洗掉卷(讓然也可以做到,洗掉容器的時候也洗掉卷,但沒有這么干的),
讓容器里面的某個目錄系結到宿主機的某個目錄,

容器寫資料時,寫到/下的資料,最后被寫到了容器的可讀寫層;寫到/data下的資料,最后被寫到了宿主機的/data目錄下了,如下圖:

下圖的宿主機A,B,C是檔案系統NFS的客戶端,宿主機A的檔案目錄A,宿主機B的檔案目錄B,宿主機C的檔案目錄C,都是訪問NFS上的同一個目錄,
使用docker存盤卷功能,讓宿主機A上運行的mysql容器,產生的資料目錄,系結到宿主機A的檔案目錄A,所以當由mysql容器產生的資料,就存放到了宿主機A的檔案目錄A上了,進而就存到到了NFS上了,
當宿主機A上運行的mysql容器被洗掉了,資料還是在的,存在NFS上了,
當在宿主機B或者宿主機C上運行剛才那個mysql容器,也讓產生的資料目錄,系結到宿主機B或者宿主機C,可以從NFS上可以拿到資料,所以資料和在宿主機A上運行是一樣的,
這就給運維提供了極大的便利,容器可以隨便部署到集群里的任何機器上了,

可以用【存盤】,【狀態】來劃分4個象限,
nginx只作為反向代理服務器,所以它沒有狀態也不需要存盤,

三,docker存盤卷有2種策略,都是使用-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是區分大小寫的,

四,活用volume
-
讓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:latest2個容器都系結到了宿主機的/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,

-
找一個容器,作為基礎,它使命是:
- 指定宿主機的目錄
- 提供統一的對外網路介面,外部客戶端直接可以訪問nginx服務,但是看不到tomcat
- nginx和tomcat使用lo(127.0.0.1)通信,
# 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
-
c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102284.html
標籤:其他
下一篇:個人專區記錄貼
