【雲端計算學習筆記(八)】之 Docker資料儲存
文章目錄
本文章由公號【開發小鴿】釋出!歡迎關注!!!
老規矩–妹妹鎮樓:
一. Dcoker資料儲存
(一) Docker映象容器特性
Docker映象是由多個只讀層疊加而成的,在啟動容器時,Docker只會載入只讀映象層並在映象棧的頂部新增一個讀寫層。如果當前執行的容器修改了一個已經存在的映象檔案,那麼該檔案將會從讀寫層下面的只讀層複製到讀寫層,該檔案原有的只讀版本依然存在,只是已經被讀寫層中該檔案的修改副本所隱藏了,即寫時複製機制。
(二) 容器資料存在的問題
Docker容器從啟動到刪除,資料都是儲存在讀寫層中的,如果我們只是stop容器或者restart容器,那麼容器中的資料都是不會丟失的,但是如果我們remove容器,那麼該容器的改變資料將會丟失。同時,讀寫層中的資料存在於聯合檔案系統(ufs)中,不利於宿主機訪問,且容器間資料共享不方便。
(三)資料卷
資料卷是容器上的目錄,這類目錄可以繞過ufs系統,與宿主機上的某個目錄繫結,寫入容器的資料都會寫入到宿主機的繫結目錄中,完成資料的持久化。資料卷可以在執行容器時完成建立和繫結操作,當然需要提前宣告繫結的對應關係。
(四) 資料卷的分類
1. 繫結卷
(1) 概述
人為進行操作,輸入繫結引數來關聯目錄。繫結卷可以使用宿主機中的任何目錄。
(2) 繫結資料卷
通過啟動容器時指定-v,並且將宿主機目錄和容器中目錄進行繫結即可:
docker run -it –name roc -v HOSTDIR:VOLUMEDIR foc
可以看到,宿主機的目錄在前,容器中資料卷在後,且這種繫結方式的優先順序大於Docker容器繫結方式。
2. Docker管理卷
(1) 概述
同樣需要人為設定,但是一旦容器啟動後,容器就會接管,會自己建立目錄與宿主機中的目錄掛載。Docker管理卷的目錄是指定的,如/var/lib/docker/volumes/…,如果我們設定容器的資料卷為Docker管理卷,那麼它一啟動後就會將容器中的某一目錄繫結到宿主機的指定目錄中。
(2) 設定資料卷
我們可以通過Docker容器的DockerFile啟動指令碼來設定資料卷繫結規則,如下所示:
VOLUME “/data”
表示啟動Dockers管理卷,將Docker容器中的data目錄繫結到宿主機中的/var/lib/docker/volumes/…中的某一個目錄下,該目錄下有/_data目錄,就是對應容器中/data目錄的內容,即使容器被刪除了宿主機中的目錄也不會被刪除。
(3) 刪除資料卷
可以手動在宿主機中刪除,也可以在刪除容器時刪除,只要指定 -v 即可刪除:
docker rm -f -v test2
3. 聯合卷
如果我們想要讓兩個容器之間通訊,可以藉助宿主機的某個目錄作為中轉站實現,即每個容器都和宿主機中的指定目錄進行繫結,那麼容器之間就能夠實現通訊了。若是不想使用宿主機中的目錄,如何實現呢?
這就需要聯合捲了,聯合卷是讓一個容器直接和另一個容器通訊,共享資料。這個卷的前提是每個容器都是使用Dockers管理卷自動管理的,只有每個容器提前指定好了容器中哪個目錄需要繫結,那麼另一個容器在啟動時直接指定 –volumes-from 容器名 就可以與這個容器共享資料了,如下所示:
docker run -it –name roc –volomes-from ContainerName roc
代表著資料卷從ContainerName這個容器中來的,這樣兩個容器在DockerFile中指定的資料卷就是共享的了。
(五) 儲存驅動
1. 概述
Docker儲存驅動是Docker的核心元件,是Docker實現分層映象的基礎。
2. 版本
現有的儲存驅動有三種:
(1) device mapper(DM)
效能和穩定性存在問題,不推薦生產使用。
(2) btrfs
社群實現的btrfs driver ,同樣是穩定性和效能問題。
(3) overlayfs
核心3.18以上版本,overlayfs進入了主線,效能和穩定性優異,最佳選擇。
3. overlayfs架構
對應於Docker容器中的架構,映象層對應最底層,容器讀寫層對應中間層,容器掛載層對應整合層。最底層和中間層的資料都會出現在整合層中,每個層級的目錄掛載命令如下所示:
mount -t overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged