什麼是 Docker?

Docker 容器是一種封裝格式,以標準格式封裝應用程式的所有程式碼與相依性,這可讓它在運算環境間快速可靠地執行。Docker 容器是一款熱門的輕量型、獨立的可執行容器,其中包含執行應用程式所需的一切,包括程式庫、系統工具、程式碼和程式實際執行。Docker 也是一項軟體平台,可讓開發人員快速建立、測試及部署容器化應用程式。

Containers as a Service (CaaS) 或 Container Services 是管理容器生命週期的託管雲端服務。容器服務可協助協調容器的程式實際執行 (開始、停止及調整)。您可使用 Container Services 來簡化、自動化及加速應用程式開發和部署生命週期。

Docker 與 Container Services 顯得採用快速,過去幾年來一直是大成功案例。Docker 在 2013 年從未知即技術性的開放原始碼技術不斷演進,目前對許多 Oracle 企業產品正式支援的標準化程式實際執行環境。

定義 Docker 術語

Docker:

可運用容器技術開發、運送和執行應用程式的軟體容器平台。Docker 推出兩個版本:企業版和社群版

容器:

與提供硬體虛擬化的 VM 不同,容器會抽象「使用者空間」,提供輕量而操作系統層次的虛擬化。容器與其他容器共用主機系統的核心。在主機作業系統上執行的容器是封裝程式碼及其所有相依性的標準軟體單位,因此應用程式可以快速可靠地從某個環境執行到另一個環境。容器不是永久的,會從映像檔中擷取。

Docker 引擎:

建置及執行容器的開放原始碼主機軟體。Docker Engine 扮演支援各種 Windows 伺服器和 Linux 作業系統上容器的從屬端伺服器應用程式,包括 Oracle Linux、CentOS、Debian、Fedora、RHEL、SUSE 以及 Ubuntu。

Docker 映像檔:

作為容器執行的軟體集合,包含建立能夠在 Docker 平台上執行的容器的一組指示。影像不可變更,影像需要變更才能建立新影像。

Docker 登錄:

儲存並下載映像檔的位置。登錄是一個無狀態且可擴充的伺服器端應用程式,可儲存及分送 Docker 映像檔

誰使用 Docker?

Docker 是一個開放式的應用程式開發架構,專為 DevOps 和開發人員而設計。開發人員可以使用 Docker 輕鬆建立、包裝、運送和執行應用程式,不但可攜式、可自行充分運用容器,還能在任何地方執行。容器可讓開發人員在其所有相依性上封裝應用程式,並以單一單位進行部署。由於提供預先建置且自我維護的應用程式容器,因此開發人員可以專注於應用程式程式碼,無須擔心底層的作業系統或部署系統。

此外,開發人員也可以運用數千個已設計為在 Docker 容器內執行的開放原始碼容器應用程式。Docker 是專為 DevOps 團隊所設計,不但可藉由持續整合及開發工具鏈技術,還能減少系統架構內部署及管理應用程式所需的限制條件和複雜性。隨著容器協調雲端服務導入,任何開發人員都可以在開發環境本機開發容器化應用程式,然後將這些容器化應用程式移轉至雲端服務的生產環境中,例如管理式 Kubernetes 服務。

Docker 和開發人員

任何類型的開發人員都可以封裝容器。軟體產業中的個人通常會因為專業領域 (前端、後端) 或任何集中情況而將開發人員分開。雖然您大多可能會看到後端開發人員封裝容器,但是所有熟悉 CaaS 基本概念的人都可以在軟體開發週期的特定領域中獲得成功。在您準備好封裝應用程式的相依性之前,請先參閱 developer.oracle.com 並熟悉您可用來建立應用程式或計畫的工具。

Docker 與 Kubernetes 的比較

Linux 容器自 2008 年起便已存在,但要到 2013 年 Docker 容器出現後才知道。有了 Docker 容器一開始,這代表開發及部署容器化應用程式所帶來的興趣。隨著容器化應用程式的數目持續增加,跨越多個伺服器部署的數百個容器,操作這些容器也越複雜。如何協調、調整、管理及排程數百個容器?這裡是 Kubernetes 可以提供協助的地方。Kubernetes 是一個開放原始碼協調系統,可讓您執行 Docker 容器與工作負載。它可以幫助您在移動擴展部署在多個伺服器上的多個容器時管理操作的複雜性。Kubernetes 引擎自動協調容器的生命週期,將應用容器分佈在託管基礎架構上。Kubernetes 會視需要快速上下擴展或縮減資源。它可以佈建、排程、刪除以及監督容器的狀況。

Docker 基本知識

Docker 的核心概念是映像檔和容器。Docker 映像檔包含執行軟體所需的一切功能:程式碼、程式實際執行 (例如 Java Virtual Machine (JVM)、驅動程式、工具、命令檔、程式庫、部署等等。

Docker 容器是 Docker 映像檔的執行中執行處理。不過,與類型為 1 或類型 2 虛擬機器管理程式的傳統虛擬化不同,Docker 容器會在主機作業系統的核心上執行。在 Docker 映像檔中,沒有如圖 1 所示的個別作業系統。

docker 基本映像檔
圖 1

隔離與虛擬化的比較

每個 Docker 容器都有自己的檔案系統、自己的網路堆疊 (以及自己的 IP 位址)、自己的處理作業空間,以及針對 CPU 和記憶體定義的資源限制。由於 Docker 容器不需要啟動作業系統,因此會立即啟動。Docker 即將隔離,例如將主機作業系統的資源隔離,而非虛擬化 (亦即提供主機作業系統的來賓作業系統)。

增量檔案系統

遞增檔案系統映像檔
圖 2

Docker 映像檔的檔案系統已分層,具有寫入時複製的語義。這可讓您進行繼承和重複使用、儲存磁碟上的資源,以及下載增量影像。

如圖 2 所示,含有 WebLogic 部署的 Docker 映像檔可以 Oracle WebLogic Server 網域為基礎,而此映像檔可以 WebLogic 映像檔為基礎,此映像檔是以 Java Development Kit (JDK) 映像檔為基礎,而此映像檔是以 Oracle Linux 基本映像檔為基礎。

Docker 登錄

雖然 Docker 映像檔易於建置和開發人員,卻喜歡 Docker 映像檔的簡潔與可攜性,但他們卻快速發現管理數千個 Docker 映像檔非常具挑戰性。Docker 登錄可解決此問題。Docker 登錄是儲存及散布 Docker 映像檔的標準方式。Registry 是基於開放原始碼的儲存庫,屬於允許的 Apache 授權。

Docker 登錄也可協助改善儲存區域中儲存之 Docker 映像檔的存取控制和安全。它會管理影像的分配,也可以與應用程式開發工作流程整合。開發人員可以設定自己的 Docker 登錄,或使用代管的 Docker 登錄服務,例如 Docker Hub、Oracle Container Registry、Azure Container Registry 等。

Docker Hub 是由 Docker 管理的代管 Docker 登錄。Docker Hub 擁有超過 10 萬個來自軟體廠商、開放原始碼專案和社群的容器映像檔。Docker Hub 包含來自官方儲存區域的軟體與應用程式,例如 NGINX、Logstash、Apache HTTP、Grafana、MySQL、Ubuntu 以及 Oracle Linux。

啟動容器時,如果無法在本機使用 Docker Hub,則 Docker 預設會自動從公用 Docker Hub 提取對應的映像檔。此外,您也可以建立自己的映像檔,然後將它們推送至 Docker Hub,不論是公用還是專用儲存區域。

圖 3:Docker 登錄螢幕擷取畫面
圖 3

Docker 作為微服務程式實際執行

將單體應用程式切割成更小塊的微服務的想法最近在軟體開發人員中吸引了很多人的注意。

微服務會以處理作業的形式獨立部署,使用輕量型通訊協定彼此進行通訊,而每項服務則會擁有資料。由於微服務遵循分散式治理方法,因此需要更高度的基礎架構自動化、自動化測試、完全自動化 CD 管線,以及具備技術熟練功能的 DevOps 團隊。

還有許多關於此架構樣式的討論,但假設將應用程式分解為微服務,可被當作一組程序使用。若要只命名少數需求,微服務必須獨立代管,並隔離於作業系統層次。它必須在資源限制內執行,且必須縱向擴充與縮減,如果失敗,並且透過軟體定義的網路層發現並連線至其他微服務。

因此,在 Docker 容器中執行微服務會將您視為極佳的跳躍點,以實現大部分的目標。

Docker - 兩個主要維度

Docker 改變了我們以兩個不同維度建立、運送和執行軟體的方式:

  • 它可強化讓應用程式從開發環境可靠地取得應用程式的流程。
  • 可提供從內部部署環境到雲端的標準映像檔格式。

以下段落以更詳細的方式說明這兩種維度。

Docker 映像檔 - 開發到生產

建立一個包含所有相依性的 Docker 映像檔,可以解決「但它在我的開發機器上工作」的問題。關鍵概念是,Docker 映像檔是由 Git 這類原始程式碼儲存區域的組建管線自動建立,但初始測試於開發環境。這個不可變影像之後會儲存在 Docker 登錄中。

如圖 4 所示,相同的影像將用於進一步的負載測試、整合測試、驗收測試等。在每個環境中都會使用相同的映像檔。少量但必要的環境特定差異,例如生產資料庫的 JDBC URL,可以作為環境變數或檔案饋送至容器。

docker 映像檔螢幕截圖
圖 4

統計資料顯示,目前所有 Docker 使用案例的 65% 正在開發中,48% 使用 Docker 進行持續整合。

Docker Cloud

Docker 改變了公有雲的採用方式:僅有 Docker 映像檔在歷史記錄中第一次,可能是部署於企業內部和每個主要雲端提供者都可執行的常見套件格式。Docker 容器會在筆記型電腦上執行,與 Oracle Cloud 上執行的相同方式相同。

另一方面,由於 Docker 容器可以在每個主要的公有雲端上執行,它們對克服長期以來對公有雲端的偏見做出了重大貢獻:廠商鎖定。每個主要雲端提供者現在都提供 Docker 作為 PaaS。

Docker 版本 - 基本技術的到期日

Docker 版本的速度比傳統企業軟體的發布週期快。有時 Docker 版本的避難,以及 Docker 專案的全新層面,都將考量 Docker 的安全性與穩定性。

雖然 Docker 與其命令行、Docker 駐留程式、其 API 及工具 (例如 Docker Swarm、Docker Machine 及 Docker Compose) 在過去三年內僅不斷演進,但每個 Linux 核心都有幾十年可用的基礎核心功能。

容器技術早期採用者的主要範例是 Google。即使在 Docker 上線,Google 也一直使用 Linux 容器。此外,Google 會執行容器中的所有資料。根據估計,Google 每週推出數十億個容器。

群組與命名空間歷史記錄

Docker 使用的基礎 Linux 核心功能為 cgroups 和命名空間。根據 Google 開發人員先前完成的工作,2008 年,Linux 核心會引進 Linux 核心。1一組作業系統處理作業的資源用量限制和帳戶。

Linux 核心使用命名空間來隔離程序的系統資源,第一個命名空間,也就是掛載命名空間,早期推出為 2002 年。2

Container Cloud Services

本文第一部分說明部分的重要 Docker 概念。不過,在實際執行環境中,不只是在 Docker 容器中執行應用程式。

若要設定並操作生產環境,需要硬體才能執行容器。必須安裝、升級及修正 Docker 等軟體與儲存區域和叢集管理程式。如果數個 Docker 容器會在主機之間通訊,就必須建立網路。叢集容器如果失敗,應重新啟動。此外,一組連結至彼此的容器,應該像單一邏輯應用程式執行處理一樣輕鬆部署。其中可能是負載平衡器、少數 Web 伺服器、部分具有管理伺服器、受管理伺服器以及資料庫的 Oracle WebLogic Server 執行處理。若要大規模管理容器化應用程式,必須要有 Kubernetes 或 Docker Swarm 等容器協調系統。部署、管理和操作協調系統 (例如 Kubernetes),可能會面臨挑戰和耗時。

為了讓開發人員更容易且更有效率地建立容器化應用程式,雲端提供者提供 Container Cloud Services 或 Containers as a Service (CaaS)。Container Cloud Services 可協助開發人員和作業團隊以自動化方式簡化及管理容器的生命週期。這些協調服務通常是以 Kubernetes 建立,讓 DevOps 團隊能夠更輕鬆地管理和操作容器化應用程式。Oracle Container Engine for Kubernetes 和 Azure Kubernetes 服務是兩個熱門容器協調託管雲端服務的範例。

Oracle Container Engine for Kubernetes 是一項完全託管、可擴充且高可用性的服務,可用來在雲端部署容器化應用程式。當您的開發團隊想要可靠地建置、部署及管理雲端原生應用程式時,請使用 Container Engine for Kubernetes (有時縮寫為 OKE)。

來自 Oracle 的 Docker 映像檔

任何類型的開發人員都可以封裝容器。軟體產業中的個人通常會因為專業領域 (前端、後端) 或任何集中情況而將開發人員分開。雖然您大多可能會看到後端開發人員封裝容器,但是所有熟悉 CaaS 基本概念的人都可以在軟體開發週期的特定領域中獲得成功。在您準備好封裝應用程式的相依性之前,請先參閱 developer.oracle.com 並熟悉您可用來建立應用程式或計畫的工具。

以下是一些取得或建置 Oracle 產品 Docker 映像檔的來源。Docker 映像檔的 Oracle GitHub 儲存區域包含 Dockerfile 和範例,可用於為 Oracle 商業產品和 Oracle 贊助的開放原始碼專案建置 Docker 映像檔。

Docker 與 Docker 合作開發實驗室

參考資料

  1. Cgroups (維基百科)
  2. Linux 命名空間 (維基百科)