共用方式為


什麼是 Docker?

提示

此內容是適用於容器化 .NET 應用程式的電子書.NET 微服務架構摘錄,可在 .NET Docs 或免費下載的 PDF 中取得,可脫機讀取。

.NET 微服務架構的容器化 .NET 應用程式電子書封面縮圖。

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

顯示 Docker 容器可執行位置的圖表。

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

Docker 容器可以在客戶數據中心、外部服務提供者或雲端、Azure 上的任何位置執行。 Docker 映像容器可以在 Linux 和 Windows 上原生執行。 不過,Windows 映射只能在 Windows 主機上執行,Linux 映射只能在 Linux 主機和 Windows 主機上執行(到目前為止,使用 Hyper-V Linux VM),其中主機表示伺服器或 VM。

開發人員可以在 Windows、Linux 或 macOS 上使用開發環境。 在開發電腦上,開發人員會執行 Docker 主機來部署 Docker 映像,包括應用程式及其依賴項。 在Linux上或macOS上工作的開發人員會使用以Linux為基礎的Docker主機,而且只能建立Linux容器的映像。 (在macOS上工作的開發人員可以從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 Container 的映像建立容器的方式需要額外的參數。 如需詳細資訊,請參閱 Hyper-V 容器

比較 Docker 容器與虛擬機

圖 2-3 顯示 VM 與 Docker 容器之間的比較。

虛擬機 Docker 容器
圖表,顯示傳統 VM 的硬體/軟體堆疊。 顯示 Docker 容器硬體/軟體堆疊的圖表。
虛擬機包括應用程式、必要的連結庫或二進位檔,以及完整的客體操作系統。 完整虛擬化需要比容器化更多的資源。 容器包含應用程式及其所有相依性。 不過,它們與其他容器共用操作系統核心,在主機操作系統的用戶空間中以隔離進程的形式執行。 除了在 Hyper-V 容器中,每個容器在各自特殊的虛擬機內執行。)

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

針對 VM,主機伺服器中有三個基底層,從上到下:基礎結構、主機操作系統和 Hypervisor,以及每個 VM 都有自己的 OS 和所有必要的連結庫。 針對 Docker,主機伺服器只有基礎架構和作業系統,之上運行著容器引擎,以保持容器的隔離性,同時共用基礎的作業系統服務。

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

由於在相同核心上執行,您得到的隔離比虛擬機少。

映射的主要目標是讓環境(相依性)在不同的部署中相同。 這表示您可以在計算機上進行偵錯,然後將它部署至保證相同環境的另一部計算機。

容器映像是封裝應用程式或服務,並以可靠且可重現的方式部署它的方法。 您可以說 Docker 不僅是一種技術,而且是一種哲學和一個程式。

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

簡單的比喻

也許簡單的類比有助於掌握 Docker 的核心概念。

讓我們回到 20 世紀 50 年代一段時間。 沒有文字處理器,影印機到處使用(某種程度上)。

假設您負責視需要快速發出批次的信件,使用真正的紙張和信封將信件寄給客戶,以便實際傳遞到每個客戶的位址(當時沒有電子郵件)。

在某些時候,你意識到信件只是一組由大量段落組成的文本,它們根據信件的目的被選擇和安排。於是你設計了一個系統來快速發出信件,期望獲得可觀的加薪。

系統很簡單:

  1. 您會從一組包含每個段落的透明工作表開始。

  2. 若要寄出一輯信件,您可以挑選具有所需段落的頁面,然後堆疊並對齊它們,使其看起來整齊並易於閱讀。

  3. 最後,您將這組文件放入影印機中,然後按下開始以製作需要的信件數量。

因此,簡化,這就是 Docker 的核心概念。

在 Docker 中,每一層都是執行命令之後文件系統所產生變更集,例如安裝程式。

因此,當您在複製圖層之後「查看」文件系統時,您會看到安裝程式時包含在圖層中的所有檔案。

您可以將映像視為已安裝作業系統的「電腦」中準備安裝的輔助唯讀硬碟。

同樣地,您可以將容器視為已安裝映像硬碟的「計算機」。 容器就像計算機一樣,可以開啟或關閉。