瞭解 Docker

提示

此內容是來自電子書、容器化 Docker 應用程式生命週期與 Microsoft 平臺和工具的摘錄,可在 .NET Docs 上取得,或作為可離線讀取的免費可下載 PDF。

Containerized Docker Application Lifecycle with Microsoft Platform and Tools eBook cover thumbnail.

Docker開放原始碼專案,將應用程式自動化部署為可攜式且可自足的容器,在雲端或內部部署上執行。 Docker 也是一家公司,可推廣併發展這項技術,並與雲端、Linux 和Windows廠商共同作業,包括 Microsoft。

Diagram showing the places Docker containers can run.

圖 1-2。 Docker 將容器部署在混合式雲端的所有圖層

如上圖所示,Docker 容器可以在客戶資料中心、外部服務提供者或 Azure 上的雲端的任何位置、內部部署執行。 Docker 映射容器也可以在 Linux 上以原生方式執行,並Windows。 不過,Windows 映像只能在 Windows 主機上執行,而 Linux 映像可以在 Linux 主機和 Windows 主機上執行 (目前是使用 Hyper-V Linux VM),其中主機是指伺服器或 VM。

開發人員可以使用 Windows、Linux 或 macOS 上的開發環境。 在開發電腦上,開發人員執行的 Docker 主機是 Docker 映像部署所在,包括應用程式及其相依性。 在 Linux 或 Mac 上工作的開發人員會使用 Linux 型的 Docker 主機,他們只能建立適用於 Linux 容器的映像。 (在 Mac 上工作的開發人員可以編輯程式碼或者從 macOS 執行 Docker 命令列介面 (CLI),但是在撰寫時,不會直接在 macOS 上執行容器。) 在 Windows 上工作的開發人員可以建立適用於 Linux 或 Windows 容器的映像。

若要在開發環境中裝載容器並提供額外的開發人員工具,Docker 會提供 Docker Desktop for WindowsmacOS。 這些產品都會安裝必要的 VM (Docker 主機) 以裝載容器。

若要執行 Windows 容器,有兩種執行階段:

  • Windows Server 容器可透過程序和命名空間隔離技術,提供應用程式隔離功能。 與 Windows Server 容器共用核心的對象為容器主機以及在此主機上執行的所有容器。

  • Hyper-V 容器可藉由在高度最佳化的虛擬機器中執行每個容器,擴充 Windows Server 容器所提供的隔離能力。 在此組態中,容器主機的核心不會與 Hyper-V 容器共用,以提供更好的隔離。

這些容器映像的建立及運作方式都相同。 不同之處在於從執行 Hyper-V 容器的映像建立容器需要額外參數。 如需詳細資料,請參閱 Hyper-V 容器

比較 Docker 容器與虛擬機器

圖 1-3 比較了 VM 和 Docker 容器。

Diagram showing a comparison of VM and container environments.

圖 1-3。 傳統虛擬機器與 Docker 容器的比較

如上圖所示,針對 VM,主機伺服器中有三個基底層。 從上而下:基礎結構、主機作業系統和 Hypervisor。 在所有情況之上,每個 VM 都有自己的 OS 和所有必要的程式庫。 另一方面,針對 Docker,主機伺服器只有基礎結構和 OS。 除此之外,容器引擎會讓容器保持隔離,但讓他們共用單一基底 OS 的服務。

因為容器只需要很少的資源 (例如,它們不需要完整的作業系統),所以容易部署且會快速啟動。 這可讓您擁有更高的密度,這表示可讓您在相同硬體單位上執行更多服務,藉此降低成本。

在相同核心上執行的副作用是隔離程度比 VM 低。

映像的主要目標是確保不同部署間均有相同的環境 (相依性)。 這表示您可以在自己的電腦上對它進行偵錯,再將它部署到另一部電腦,保證有相同的環境。

容器映像是一種封裝應用程式或服務,再以可靠且可重現的方式來部署它的方法。 您可以這麼認為:Docker 不只是一項技術,更是哲學與過程。

使用 Docker 時,您不會聽到開發人員說:「它在我的電腦上運作,為什麼不在生產環境中?」他們只要說出「它會在 Docker 上執行」,因為封裝的 Docker 應用程式可以在任何支援的 Docker 環境中執行,而且它會在所有部署目標上執行的方式, (例如開發、QA、預備和生產) 。

簡單的比喻

也許簡單的比喻可以協助您掌握 Docker 的核心概念。

讓我們暫時回到 1950 年。 當時沒有任何文書處理器,而且到處都在使用影印機 (差不多所有人都在用)。

假設您負責根據需求來快速發送大批信件,並使用信紙和信封,將信件實際投遞到每個客戶的地址 (當時並沒有電子郵件)。

慢慢地,您了解到這些信件的內容是大量段落的組合,只是根據信件目的從中挑選和編排需要的段落,因此您設計一個系統,可以快速地發送信件來提高效率。

系統很簡單:

  1. 您開始準備一疊透明紙張,每一張紙都包含一個段落。

  2. 若要發送一批信件,您就挑選具有所需段落的紙張,然後將其堆疊並且排列整齊,讓它們整潔易讀。

  3. 最後,您將這個組合放入影印機中,然後按下開始以產生所需數量的信件。

因此,工作精簡了,這就是 Docker 的核心概念。

Docker 中的每一層都是在執行命令 (例如安裝程式) 之後,檔案系統上所發生的變更結果集。

因此,當您在複製層之後「查看」檔案系統時,會看到檔案整體,包含安裝程式的層。

您可以將映像當作是準備要在「電腦」(已安裝作業系統) 中安裝的輔助唯讀硬碟。

同樣地,您可以將容器當作是已安裝映像硬碟的「電腦」。 容器,就像電腦一樣,可以開啟或關閉。