Docker——Docker介紹——第一章
Docker——Docker運作底層原理和為什麼Docker比Vm快——小知識
Docker——Docker指令——工作最常用——第二章
Docker——鏡像介紹——第三章
Docker——容器資料卷——第四章
Docker——DockerFile——第五章
文章目錄
- 1:存儲卷簡介
-
- 1.1 存儲卷提供容器無關的資料管理方式
- 2:存儲卷的類型
-
- 2.1 綁定挂載卷
- 2.2 Docker管理卷
- 3:共享存儲卷
-
- 3.1 主機依賴的共享
- 4:容器内添加資料卷的兩種方式
-
- 4.1 直接指令添加
- 4.2 DockerFile添加
- 5:資料卷容器
本章介紹了Docker存儲卷以及容器之間如何管理資料的方法。
就像在容器中運作一個資料庫程式一樣, 你可以将這個軟體打包在鏡像中,當啟動容器時,它将會初始化一個空資料庫。當其他程式接入該資料庫并存入資料,這些資料要如何才能儲存下來呢?是以容器中一個檔案的形式嗎?當你暫停一個 容器或者删除這個容器,這些資料要怎麼辦?如果你想要更新資料庫程式,這些資料怎麼搬遷?
考慮一下另一種情況,一組不同的web應用程式運作在在不同的容器中。為了讓它們的日志檔案儲存在容器之外,你準備把它們寫到哪兒去呢?你将如何取得這些日志來排除故障呢?如何讓其他程式(比如日志摘要工具)來通路這些檔案呢?這些問題的答案就涉及存儲卷的使用。
1:存儲卷簡介
一個 主機或容器的目錄樹是由一組挂載點建立而成,這些挂載點描述了如何能建構出一個或多 個檔案系統。存儲卷是容器目錄樹上的挂載點,其中一部分主機目錄樹已經被挂載了。
如果沒有存儲卷,Docker 使用者會受限于Union檔案系統,僅提供鏡像挂載。如圖4-1所示容器中運作着的一個程式, 正寫資料到檔案中。第一個檔案寫入到了根檔案系統。作業系統控制根檔案系統将改變的部分裝入Union檔案系統的頂層。第二個檔案則寫入到已經挂載于容器目錄樹/data中。改動會通過存儲卷直接影響到主機檔案系統上。
雖然Union檔案系統适用于建構和分享鏡像,但對持久化或共享資料而言,并不是理想的方法。存儲卷填補了這些用例,并在容器化系統設計中發揮了關鍵作用。

1.1 存儲卷提供容器無關的資料管理方式
從語義上來說,存儲卷是一個資料分割和共享的工具, 有一個與容器無關的範圍或生命周期。這使得存儲卷成為了容器化系統設計中關于檔案分享或寫入最重要的一部分。資料示例根據其範圍或者接入容器方式的不同,分成以下幾種:
資料庫軟體與資料庫中的資料
web應用程式與日志資料
web資料處理應用程式的輸入和輸出資料
web伺服器與靜态内容
産品與支援工具
存儲卷可分離關注點,并為架構元件建立子產品化。這種子產品化設計幫助你更輕松地了解、建構、支援和重用大型系統的部件。
按以下方式來思考:鏡像适合打包和分發相對靜态的檔案,如程式;存儲卷則持有動态或專門資料。這種差別使得鏡像可重用,資料也可以簡單分享。這種相對靜态和動态檔案空間的分離,允許應用程式或鏡像的作者,實作進階模式,例如多态和可組合工具。
多态工具維護一緻的接口,但可能有多種實作,分别做不同的事情。考慮這樣一個應用程式,如一個通用的應用伺服器。例如,Apache Tomcat,在網上提供了一個HTTP接口并分發其接收到的任何請求給可插拔的各類程式。是以Tomcat具有多态行為。使用存儲卷可以将其行為配置插入到容器中,而無須修改鏡像。另外,考慮MongoDB或MySQL這樣的資料庫。資料庫的值由其包含的資料所定義。資料庫程式總呈現相同的接口,但其值則完全不同,這取決于插入卷的資料。
更為基本的是,存儲卷可以隔離應用程式和主機的關系。鏡像被裝載到主機,建立出一個容器。Docker 不知道主機在哪裡運作,隻能判斷哪些檔案在容器中可用。這意味着Docker本身就沒有辦法利用主機上的設施,如裝載的網絡存儲,或混合光纖和固态硬碟。但有主機知識的使用者可以使用存儲卷,在容器中将這些目錄映射到主機的存儲上。
2:存儲卷的類型
存儲卷有兩種類型。每一個存儲卷就是容器目錄樹的挂載點在主機目錄樹中的位置,但不同的存儲卷類型在主機的位置是不同的。第一種類型是綁定挂載存儲卷。綁定挂載存儲卷使用使用者提供的主機目錄或檔案。第二類型是管理存儲卷。管理存儲卷使用由Docker守護程序控制的位置,被稱為Docker管理空間。存儲卷類型如圖4-3所示。
每種存儲卷類型都有優缺點,根據情況使用
2.1 綁定挂載卷
綁定挂載卷是一種存儲卷,指向主機檔案系統上使用者指定的位置。綁定挂載卷在主機提供的檔案或目錄需要挂載到容器目錄的特點位置,非常有用,如圖4.4
如果你想将資料分享給運作在容器外的程序,比如主機系統元件,綁定挂載卷是很有用的。如果你想将主機資料通過已知的主機目錄分享給容器中運作的特定程式,綁定挂載卷也管用。示例如下
在這個示例中,你使用了-v選項和位置映射來建立綁定挂載卷。該映射以冒号分隔(這是Linux指令行工具的常見風格)。映射鍵(冒号之前的路徑)是主機檔案系統上的一個絕對路徑,該鍵值(冒号後的路徑)是容器中挂載的目标存儲位置。你必須使用絕對路徑指定該位置。
Docker提供了一種機制将挂載卷和存儲卷設為隻讀權限。你可以通過在存儲卷映射規則後追加: ro 來完成。例如,你應該會修改run指令:如下
通過挂載隻讀卷,可以避免容器内的任何程序修改該卷的内容。
- 綁定挂載卷并不僅限于目錄,但目錄是它們常用的方式。你可以使用綁定挂載卷裝入單個檔案。在建立或連結資源時,避免了與其他資源的沖突,提供了靈活性。考慮一下當你要安裝一一個特定的檔案到一一個包含其他檔案的目錄。具體而言,假設你隻想在鏡像分發的web内容外添加一個額外的檔案。如果你用一整個目錄綁定挂載到該位置,那麼其他檔案都将丢失。通過使用一個特定的檔案作為存儲卷,可以隻覆寫或插入單個檔案。
- 在這種情況下,需要注意的重點是,檔案必須在建立容器之前就存在于主機上。否則Docker會認為你想用一個目錄,并在主機上建立它,把它挂載在需要的位置(即使該位置由另一個檔案占用)。
- 使用綁定挂載卷的第一個問題是是它們将可移植容器綁定到特定主機的檔案系統。如果容器的定義取決于主機檔案系統特定位置上的内容,無論所在位置的内容可用或不可用,該定義無法跨主機移植。
- 第二個問題是,創造了與其他容器發生沖突的機會。啟動Cassandra的多個執行個體,都使用相同的主機位置挂載存儲卷,這将是一一個糟糕的主意。在這種情況下,每個執行個體将競争相同的一 組檔案。如果沒有其他工具,比如檔案鎖定,這将有可能導緻資料庫損壞。
- 綁定挂載卷比較适合需要使用特殊挂載點的工作站或機器。最好在通用平台或硬體池避免這類特定的綁定。你可以使用Docker管理卷,以與主機無關和便攜的方式利用該存儲卷。
2.2 Docker管理卷
管理卷不同于綁定挂載卷,這是因為Docker守護程式會在主機檔案系統中建立存儲卷,并由Docker管理,如圖4-5所示
使用管理卷是一種在檔案系統特定位置解耦卷的方法。當你執行dockerrun使用-v選項(或–volume),隻要指定容器目錄樹中的挂載點,管理卷即可建立。
3:共享存儲卷
3.1 主機依賴的共享
假設你有一個跑在容器中的web伺服器,所有接收到的請求都記錄在/logs/access.如果要将這些日志從你的web伺服器轉移到持久化存儲上,你可能會想通過另一個容器中的腳本來做到。這時候容器間的卷分享的價值就更加明顯。正如有兩種類型的存儲卷,這兒也有兩種方法來共享容器之間的存儲卷。
在這個示例中,你建立了兩個容器:一個名為plath的容器寫檔案,另一個則讀該檔案。這些容器都有一個共同的綁定挂載卷。容器之外,你可以通過列出目錄中的内容或檢視新的檔案來觀察這些變化。
探索一下容器可能以這種方式連接配接在一起。接下來的示例啟動四個容器,兩個日志寫入者和兩個讀取者:
在這個示例中,你建立了四個容器,每一個都有綁定挂載卷。前兩個容器寫入到卷的不同檔案中。第三和第四個容器則在不同的位置挂載卷,并作為隻讀。這是一個玩具示例,但它清楚地展示了一個功能,即有多種方法可建構鏡像和軟體。
主機依賴的共享要求你使用綁定挂載卷,如果你有大量的機器,主機依賴的共享可能會導緻問題或維護起來過于昂貴。
4:容器内添加資料卷的兩種方式
4.1 直接指令添加
第一步:執行指令添加資料卷
& docker run -it -v /主控端絕對路徑目錄:/容器内目錄 鏡像名
如下
& docker run -it -v /主控端絕對路徑目錄:/容器内目錄 --privilege=true 鏡像名
我們可以檢視資料是否挂載成功
我們調用如下指令,檢視容器資料卷是否挂載成功
# 檢視容器内部細節
docker inspect
實作挂載成功後,我們可以實作容器和宿主之間的資料共享,容器停止退出後,主機修改後資料實作同步
4.2 DockerFile添加
根據如下步驟進行
Dockefile檔案中的内容如下
對Dockefile檔案的解釋
出現如下圖,說明build建構成功
5:資料卷容器
根據以下步驟,自己動手做一變