用一個實際例子理解Dockervolume工作原理
要了解Docker Volume,首先我們需要理解Docker檔案系統的工作原理。Docker映象是由多個檔案系統的只讀層疊加而成。當一個容器通過命令docker run啟動時,Docker會載入只讀映象層並在映象棧頂部新增一個讀寫層。如果執行中的容器修改了現有的一個已經存在的檔案,那該檔案將會從讀寫層下面的只讀層複製到讀寫層,但是該檔案的只讀版本依然存在,只不過已經被讀寫層中該檔案的副本所隱藏。
當刪除Docker容器,並通過該映象重新啟動時,之前在讀寫層的更改將會丟失。在Docker中,只讀層及在頂部的讀寫層的組合被稱為Union File System(聯合檔案系統),簡稱UnionFS,它用到了一個重要的資源管理技術,叫寫時複製。寫時複製(copy-on-write),也叫隱式共享,是一種對可修改資源實現高效複製的資源管理技術。對於一個重複資源,若不修改,則無需立刻建立一個新的資源,該資源可以被共享使用。當發生修改的時候,才會建立新資源。這會大大減少對於未修改資源複製的消耗。其實COW這個概念對程式設計人員來說一點也不陌生,廣泛用在各種領域,比如ABAP裡對於內表(Internal table)的拷貝動作,Java字串的拷貝實現等等。Docker基於UnionFS去建立containers。
我們下面看一個實際例子。
使用命令列docker run –help檢視這個命令的幫助文件。 -h 的作用是指定容器的主機名。
使用命令列建立一個新的容器:
docker run -it –name jerry-container-test -h CONTAINER -v /data busybox /bin/sh
名稱為jerry-container-test, 用-v建立了一個volume /data
建立完畢之後,在容器裡執行cd /data進入這個目錄,這個時候還是空的。
docker ps檢視容器狀態:
現在我想知道主機上為了實現這個volume,使用了哪個internal目錄。
用命令docker inspect jerry-container-test檢視關鍵字”volumes”:
得到了容器裡/data在主機上實現的目錄:
/var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data
現在我在主機上使用touch命令在這個目錄下直接建立一個檔案:
sudo touch /var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data/test.s
現在切換到容器裡,用ls也能看到直接在主機上用touch命令在internal folder裡建立的檔案了。
要獲取更多Jerry的原創文章,請關注公眾號”汪子熙”:
相關文章
- 用一個實際例子理解Docker volume工作原理Docker
- Angular @Inject 註解的實際應用例子和工作原理淺析Angular
- Angular 原理圖 Schematics 學習 - 動手開發一個實際的例子Angular
- 從一個實際的例子觸發,理解什麼是 Rxjs 的 defer 函式JS函式
- 通過一個實際的例子學習 combineLatest
- 通過一個實際例子理解Kubernetes裡pod的自動scale - 水平自動伸縮
- 透過現實生活中一個例子來理解 JavaScript PromiseJavaScriptPromise
- 一個實際的例子學習 SAP BTP Java 應用的 @Before 註解使用方式Java
- SAP 電商雲 Spartacus UI Proxy Facade 的一個實際例子UI
- 如何自己實現一個 mobx – 原理解析
- C語言:一個例子理解 union 和 structC語言Struct
- 面向切片程式設計(AOP)應用的一些實際例子程式設計
- 使用SAP Cloud Application Programming模型開發OData的一個實際例子CloudAPP模型
- 用三張圖理解深度學習的工作原理深度學習
- 深入理解HTTPS工作原理HTTP
- 透過一個具體的例子理解 npm 的 peerDependencyNPM
- 用一個通俗的例子講清楚APIAPI
- 舉個例子來理解一下Koa的洋蔥模型模型
- expdp一個例子
- 深入理解:Spring MVC工作原理SpringMVC
- 深入理解Argo CD工作原理Go
- 張馳諮詢:個人如何運用六西格瑪管理解決實際工作中的問題?
- 用個通俗的例子講一講死鎖
- Java Volatile的一個實際應用場合Java
- Rxjs debounce 運算子在 SAP Spartacus 函式節流中的一個實際使用例子JS函式
- DI 原理解析 並實現一個簡易版 DI 容器
- [譯] 用個實在例子來教你掌握 Async/AwaitAI
- 一個故事講完CPU的工作原理
- 使用 ViroReact 開發增強實現應用的一個具體例子React
- MySQL常見6個考題在實際工作中的運用MySql
- 乾貨:HashMap的工作原理解析HashMap
- 深入理解瀏覽器工作原理瀏覽器
- k8s 理解Service工作原理K8S
- 時間輪TimeWheel工作原理解析
- 一個簡單的例子理解Kubernetes的三種IP地址型別型別
- 用一分鐘理解console的這個原理,多留幾根黑髮~
- 一個故事看懂記憶體條工作原理記憶體
- 通過一個簡單的例子,瞭解 Cypress 的執行原理