天天看點

Docker生命周期

作者:跟我一起學IT

Docker包括了三個基本概念:

  • 鏡像(Image)
  • 容器(Container)
  • 倉庫(Repository)

了解了上面三個概念,就了解了整個Docker的生命周期。

一、Docker 鏡像:

我們都知道,作業系統分為核心和使用者空間。對于 Linux 而言,核心啟動後,會挂載 root 檔案系統為其提供使用者空間支援。而 Docker 鏡像(Image),就相當于是一個 root 檔案系 統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統的 root 檔案系統。

因為鏡像包含作業系統完整的 root 檔案系統,其體積往往是龐大的,是以在 Docker 設計 時,就充分利用 Union FS(聯合檔案系統) 的技術,将其設計為分層存儲的架構。是以嚴格來說,鏡像并非是 像一個 ISO 那樣的打封包件,鏡像隻是一個虛拟的概念,其實際展現并非由一個檔案組成, 而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。

鏡像建構時,會一層層建構,前一層是後一層的基礎。每一層建構完就不會再發生改變,後一層上的任何改變隻發生在自己這一層。比如,删除前一層檔案的操作,實際不是真的删除前一層的檔案,而是僅在目前層标記為該檔案已删除。在最終容器運作的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟随鏡像。是以,在建構鏡像的時候,需要額外小心,每一層盡量隻包含該層需要添加的東西,任何額外的東西應該在該層建構結束前清理掉。

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

二、Docker 容器:

容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運作于屬于自己的獨立的命名空間。是以容器可以擁有自己的 root 檔案系統、自己的網絡配置、自己的程序空間,甚至自己的使用者 ID 空間。

容器内的程序是運作在一個隔離的環境裡,使用起來,就好像是在一 個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運作更加安 全。也因為這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛拟機。

前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運作時,是以鏡像為基礎層, 在其上建立一個目前容器的存儲層,我們可以稱這個為容器運作時讀寫而準備的存儲層為容器存儲層。容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也随之消亡。是以,任何儲存于容器存儲層的資訊都會随容器删除而丢失。

容器不應該向其存儲層内寫入任何資料,容器存儲層要保持無狀态化。所有的檔案寫入操作,都應該使用 資料卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。資料卷的生存周期獨立于容器,容器消亡,資料卷不會消亡。是以,使用資料卷後,容器删除或者重新運作之後,資料不會丢失。

三、Docker Registry

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

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個标簽 (Tag);每個标簽對應一個鏡像。

通常,一個倉庫會包含同一個軟體不同版本的鏡像,而标簽就常用于對應該軟體的各個版本。我們可以通過 <倉庫名>:<标簽> 的格式來指定具體是這個軟體哪個版本的鏡像。如果不給出标簽,将以 latest 作為預設标簽。

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

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

1、Docker Registry 公開服務:

Docker Registry 公開服務是開放給使用者使用、允許使用者管理鏡像的 Registry 服務。一般這類公開服務允許使用者免費上傳、下載下傳公開的鏡像,并可能提供收費服務供使用者管理私有鏡像。

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是預設的 Registry,并擁有大量的高品質的官方鏡像。除此以外,還有 CoreOS 的 Quay.io,CoreOS 相關的鏡像存儲在這裡;Google 的 Google Container Registry,Kubernetes 的鏡像使用的就是這個服務。

由于某些原因,在國内通路這些服務可能會比較慢。國内的一些雲服務商提供了針對 Docker Hub 的鏡像服務( Registry Mirror ),這些鏡像服務被稱為加速器。常見的有阿裡雲加速 器、DaoCloud 加速器 等。使用加速器會直接從國内的位址下載下傳 Docker Hub 的鏡像,比直接從 Docker Hub 下載下傳速度會提高很多。

2、私有 Docker Registry:

除了使用公開服務外,使用者還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用作為私有 Registry 服務。

開源的 Docker Registry 鏡像隻提供了 Docker Registry API 的服務端實作,足以支援 docker 指令,不影響使用。但不包含圖形界面,以及鏡像維護、使用者管理、通路控制等進階功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些進階功能。

除了官方的 Docker Registry 外,還有第三方軟體實作了 Docker Registry API,甚至提供了用 戶界面以及一些進階功能。比如,VMWare Harbor 和 Sonatype Nexus。

更多内容請參考部落格位址:https://www.ywdevops.cn/index.php/2020/04/12/zq/