[Docker]Docker學習筆記03.Docker的三大核心概念:鏡像、容器、倉庫

提取知識點

Docker

  • 鏡像是容器的基礎
  • 鏡像是分層存儲的
  • 容器的實質是進程
  • 容器也是分層存儲,在鏡像上創建存儲層
  • 容器不應該向其存儲層內寫入任何數據,而要使用數據捲進行存儲數據
  • 數據卷是獨立於容器的
  • 鏡像都藏在倉庫中
  • 倉庫有公有和私有之分
  • 公有倉庫官方維護,可由個人用戶上傳分享
  • 私有倉庫自己維護,上傳自己項目的打包鏡像
  • 連接公有倉庫太慢了,需要加速器

目錄:

一、Docker鏡像(Image)
二、Docker容器(Container)
三、Docker倉庫(Repository)

內容:

一、Docker鏡像(Image)

在上篇的名詞介紹中說明了 Docker 鏡像是用於創建 Docker 容器的模板。
也就是說 Docker的鏡像是創建容器的基礎,先創建好鏡像,再在鏡像上創建容器。

我們前面也說了使用Docker佔用資源非常少,那麼爲什麼呢?

因爲鏡像使用了分層存儲的設計架構!
在 Docker 設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層儘量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至可以用之前構建好的鏡像作爲基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡像。

那麼我們如何使用鏡像呢?

Docker 提供了一個簡單的機制來創建或更新現有的鏡像,用戶也可以從網上下載一個已經創建好的鏡像直接使用。
當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。

二、Docker容器(Container)

鏡像(Image)和容器(Container)的關係,就像前篇所說是面向對象程序設計中的 類 和 對象 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的 命名空間。因此容器可以擁有自己的 root 文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因爲這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機。

前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像爲基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層

容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。

按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。

數據卷的生存週期獨立於容器容器消亡,數據卷不會消亡。因此,使用數據卷後,容器刪除或者重新運行之後,數據卻不會丟失。

使用數據卷可以實現 文件與主機共享,使性能接近原生,但使用虛擬機會出現重複讀,導致性能弱於原生。

三、Docker倉庫(Repository)

我在我電腦上構建了一個鏡像,我還想在你的電腦上構建一個相同的鏡像並運行,應該腫麼辦呢? 直接拷貝?鏡像直接拷貝是拷貝不了的,放棄拷貝吧騷年!
那腫麼辦?需要有一個集中化管理的服務器,將鏡像放到此服務器上,然後通過指定拉取命令進行拉取,就可以下載下來並運行啦!

在這裏插入圖片描述
在上篇名詞解釋的時候,我們使用Registry作爲倉庫,爲啥 Registry是註冊的意思,但卻表示爲 倉庫呢,倉庫不應該是 Repository 嗎?

倉庫(Repository)是集中存放鏡像文件的場所,有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。

鏡像構建完成後,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,也就是Docker Registry 服務。

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個鏡像。(這裏的標籤僅是標記,並不能標識鏡像內容,因爲同一個鏡像可以擁有多個標籤,在刪除鏡像時提起)

通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 latest 作爲默認標籤。(一般來說,鏡像的latest標籤意味着該鏡像的內容會跟蹤最新版本的變更而變化,內容是不穩定的,因此,從穩定性上考慮,不要在生產環境中忽略鏡像的標籤信息或使用默認的latest標記的鏡像

Ubuntu 鏡像 爲例,ubuntu 是倉庫的名字,其內包含有不同的版本標籤,如,18.04, 16.04。我們可以通過 ubuntu:18.04,或者 ubuntu:16.04 來具體指定所需哪個版本的鏡像。如果忽略了標籤,比如 ubuntu,那將視爲 ubuntu:latest

倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用戶環境下的用戶名,後者則往往是對應的軟件名。但這並非絕對,取決於所使用的具體 Docker Registry 的軟件或服務。

倉庫分爲公開倉庫(Public)私有倉庫(Private)兩種形式。
公開倉庫(Public)

Docker Registry 公開倉庫是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。

由於某些原因,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱爲加速器。常見的有 阿里雲加速器DaoCloud 加速器 等。使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從 Docker Hub 下載速度會提高很多。

國內也有一些雲服務商提供類似於 Docker Hub 的公開服務,可以提供大陸用戶更穩定快速的訪問。比如 時速雲鏡像倉庫網易雲鏡像服務DaoCloud 鏡像市場阿里雲鏡像庫 等。 (瞭解)

私有倉庫(Private)

當然,用戶也可以在本地網絡內創建一個私有倉庫,Docker 官方提供了 Docker Registry 鏡像,可以直接使用做爲私有 Registry 服務
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。
除了官方的 Docker Registry 外,還有第三方軟件實現了 Docker Registry API,甚至提供了用戶界面以及一些高級功能。比如,VMWare HarborSonatype Nexus。(瞭解)

當用戶創建了自己的鏡像之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。

注:Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章