1. 程式人生 > >Docker筆記(二):Docker管理的物件

Docker筆記(二):Docker管理的物件

原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html

 

在Docker筆記(一):什麼是Docker中,我們提到了Docker管理的物件包含映象、容器、網路、資料卷等,本文就來介紹下這些物件及用途。

1. 映象

所謂映象,是一個靜態的概念。它對我們期望乾的事情做了一些定義,比如要執行什麼程式,需要哪些依賴,需要什麼樣的配置,需要開放哪個網路埠等等。
Docker的映象是一個特殊的檔案系統,提供了執行時需要的程式、庫、資源、配置等檔案,還包含一些為執行時準備的配置引數(如環境變數、匿名資料卷、使用者等),映象不包含任何動態資料,其內容在構建之後也不會被改變。

映象的檔案系統有一個分層儲存的概念,採用的是Union FS技術,因此,映象並不是簡單地由一組檔案組成,而是由多層檔案系統疊加聯合組成。如下圖所示

映象構建時,會一層一層地構建,前一層是後一層的基礎,每層構建完後就變成只讀的,不會再發生改變。映象分層儲存的一大好處是複用,映象的每一層可以在不同映象間複用,這就好比我們開發專案時將一些公共功能封裝成jar包,在各個專案可以直接依賴使用一樣。關於映象的更多內容,在後續使用時再詳述。

2. 容器

相對映象,容器是一個動態的執行時的概念,它與映象的關係類似於面向物件中類與例項的關係。容器可以被建立、啟動、停止、刪除等。容器執行實質上就是執行一個程序,但與那些直接在宿主機上執行的程序不同,容器執行在自己的獨立的隔離的名稱空間中——擁有自己的root檔案系統、網路配置、程序空間,甚至自己的使用者ID空間,因此雖然是以程序的形式執行,但好像是執行在一個獨立的系統中一樣,這樣相比直接運行於宿主機的程序,容器的執行顯得更為安全。

前面說到映象的分層儲存概念,對於容器來說,實際上也是以映象作為基礎層,在其上建立了一個當前容器的儲存層,如下圖

以映象ubuntu:15.04為基礎層所建立的容器,都有一個自己的可讀寫的儲存層(映象的儲存層是隻讀的)。容器儲存層的生命週期與容器一樣,容器銷燬時,容器的儲存層也會隨之消亡,任何儲存在容器儲存層的資料也都會隨容器的刪除而丟失,因此一般我們要保持容器儲存層的無狀態化,所有檔案的寫操作,都應該使用資料卷或繫結宿主機目錄。

3. 資料卷

資料卷是一個獨立於容器,可供一個或多個容器使用的特殊目錄,它繞過了Union FS,不會隨容器的銷燬而消亡。這好比我們在阿里雲上建虛機,再載入一個數據盤一樣,一般產生的資料都要儲存在資料盤,而不是虛機的系統盤。

資料卷具備如下特性:

  1. 可以在容器之間共享和重用
  2. 對資料卷的修改會立馬生效
  3. 資料卷的更新,不會影響到映象
  4. 資料卷預設會一直存在,不會隨容器的刪除而消亡

4. 網路

Docker容器是如何與外部進行網路通訊的?一般來說,我們在執行容器時,只需要指定容器服務埠與宿主機埠的對映,就可以通過宿主機IP與對映的埠訪問容器服務了,因為Docker預設使用了Bridge的模式來實現容器與外部的通訊。
Docker的網路子系統通過使用一些驅動程式,是可插拔式的,預設提供瞭如下幾種驅動:

  1. bridge:預設的網路驅動。執行在容器中的應用程式一般是通過網橋與外部進行通訊。
  2. host:容器直接使用宿主機的網路通訊。host只在基於Docker 17.06或以上版本的Swarm服務中可用
  3. overlay:overlay可將多個Docker daemon程序連線起來使得Swarm服務之間能相互通訊,也可以將overlay用於Swarm服務與容器之間,或執行在不同Docker daemon上的容器之間的通訊,不需要作業系統層面的路由配置。
  4. macvlan:macvlan允許你分配一個mac地址給容器,讓它像一臺物理裝置一樣加入你的網路中。Docker daemon通過mac地址將請求路由給容器,適用於那些希望直接連到物理網路的遺留應用。
  5. none:禁用所有網路。一般與一個自定義的網路驅動一起使用。none不能用於Swarm服務。
  6. 其它第三方網路外掛:可從Docker Hub或其它第三方供應商獲取安裝。

總之,bridge適用於在同一臺宿主機執行多個容器的場景;host適用於不應與宿主機進行網路隔離的場景;overlay適用於執行在不同宿主機上的容器間通訊,或多個應用通過Swarm服務來共同協作的場景;macvlan適用於從虛擬機器遷移配置或希望容器作為物理機一樣使用網路的場景。

5. 總結

本文對Docker所管理的幾個基本物件——映象、容器、資料卷、網路做了簡單介紹,這是認識或學習Docker的基礎,在後續實踐操作過程中,將會對各部分進行更詳細的使用說明,歡迎持續關注。


我的個人部落格地址:http://blog.jboost.cn
我的微信公眾號:jboost-ksxy (一個不只有技術乾貨的公眾號,歡迎關注,及時獲取更新內容)
———————————————————————————————————————————————————————————————