什么是 Docker?
什么是 Docker?
Docker 容器是一種打包格式,可通過標準格式打包應用的所有代碼和依賴關系,確保應用能夠快速、可靠地在計算環境下運行。Docker 容器是一種廣受歡迎的輕量級、可執行的獨立容器,其中包含應用運行所需的一切要素,包括庫、系統工具、代碼和運行時。此外,Docker 還是一個軟件平臺,支持開發人員快速構建、測試和部署容器化應用。 容器即服務 (CaaS) 或容器服務是一種用于管理容器生命周期的托管式云技術服務。它可以幫助您編排(啟動、停止、擴展)容器運行時,簡化、加速并實現應用開發與部署生命周期自動化。 在過去幾年里,Docker 和容器服務得到了快速采用,取得了巨大的成功。如今,Docker 這一開源技術已從 2013 年的幾乎無人知曉發展成了一種標準化運行時環境,已正式支持眾多 Oracle 企業級產品。 一個軟件容器平臺,旨在利用容器技術開發、交付和運行應用。Docker 有兩個版本,即企業版和社區版。 與提供硬件虛擬化的 VM 不同,容器通過抽象“用戶空間”來提供輕量級、操作系統級的虛擬化。容器與其他容器共享主機系統的內核。在主機操作系統上運行的容器是一個標準軟件單元,可以打包代碼及其所有依賴項,因此應用可以從一個環境快速、可靠地運行到另一個環境。容器是非持久化的,并且由映像運行。 構建并運行容器的開源主機軟件。作為客戶端/服務器應用,Docker 引擎支持各種 Windows 服務器和 Linux 操作系統(包括 Oracle Linux、CentOS、Debian、Fedora、RHEL、SUSE 和 Ubuntu)上的容器。 要作為容器運行的軟件集合,包含一組指令來創建可在 Docker 平臺上運行的容器。映像是不可變的,如需更改則需要構建新的映像。 Docker 注冊表用于存儲和下載映像。Docker 注冊表是一個無狀態且可擴展的服務器端應用,用于存儲和分發 Docker 映像。 Docker 是一個面向 DevOps 和開發人員而設計的開放應用開發框架。使用 Docker,開發人員能夠以輕量級、可移植、自給自足,可在幾乎所有環境下運行的容器形式,輕松構建、打包、傳輸和運行應用;能夠對應用及其所有依賴關系打包,統一進行部署。得益于預構建、自治的應用容器,開發人員可以專注于應用代碼及代碼使用,而不必擔心底層操作系統或部署系統。 此外,開發人員還可以充分利用數千個可在 Docker 容器中運行的開源容器應用。而對于 DevOps 團隊,Docker 可提供持續集成支持和開發工具鏈,降低在系統架構中部署和管理應用時的約束和復雜性。最后,隨著容器編排云技術服務的問世,如今所有開發人員都可以在自己的本地開發環境下開發容器化應用,隨后將容器化應用遷移至云技術服務(例如托管式 Kubernetes 服務)并在基于云技術服務的生產環境下運行。 任何開發人員都可以打包容器。在軟件行業,通常按照專業(如前端、后端或介于兩者之間)來區分開發人員。雖然您通常會看到后端開發人員負責打包容器,但事實上,熟悉 CaaS 基本概念的任何人都可以在軟件開發周期內做到這一點。在準備打包應用的依賴項之前,請查看 developer.oracle.com 并了解一些可用于構建應用或程序的工具。 Linux 容器早在 2008 年就已出現,但是直到 2013 年 Docker 容器問世,它才廣為人知。隨著 Docker 容器的到來,越來越多的人開始開發和部署容器化應用。然而,隨著容器化應用數量的不斷增長(有時要在多臺服務器上部署數百個容器),容器操作變得越來越復雜。如何協調、擴展、管理和調度數以百計的容器?Kubernetes 可助一臂之力。Kubernetes 是一個開源編排系統,讓您可以運行 Docker 容器和工作負載。當您需要擴展跨多臺服務器部署的多個容器時,它可以為您降低操作復雜性。使用 Kubernetes 引擎,您可以自動化編排容器生命周期,將應用容器分布在整個托管式基礎設施中。最后,Kubernetes 還可以快速按需擴展或收縮資源,持續供應、調度、刪除和監視容器的運行狀況。 Docker 的核心概念是映像和容器。其中,Docker 映像包含運行軟件所需的一切要素:代碼、運行時(例如 Java 虛擬機 (JVM)、驅動程序、工具、腳本、庫和部署等)。 Docker 容器則是 Docker 映像的運行實例。但與基于類型 1 或類型 2 虛擬機管理程序的傳統虛擬化不同,Docker 容器在主機操作系統的內核上運行。最后,Docker 映像中沒有單獨的操作系統(參見圖 1)。 每一個 Docker 容器都擁有自己的文件系統、網絡體系(因此也擁有自己的 IP 地址)、進程空間以及面向 CPU 和內存定義的資源限制。同時,它不需要引導操作系統,可以即時啟動。簡而言之,Docker 的宗旨是隔離,即隔離主機操作系統的資源,虛擬化則是在主機操作系統上提供訪客操作系統。 Docker 映像的文件系統采用分層結構,具有寫時復制語義。這不僅有助于繼承和重用以及節約磁盤資源,還支持增量式映像下載。 如圖 2 所示,具有 WebLogic 部署的 Docker 映像基于具有 Oracle WebLogic Server 域的映像運行,該映像之下依次是 WebLogic 映像、Java Development Kit (JDK) 映像和 Oracle Linux 基礎映像。 Docker 映像易于構建,其簡單性和可移植性深受開發人員喜愛。然而,管理數千個 Docker 映像是一項極具挑戰的任務。Docker Registry 可以解決這一問題。Registry 是一種存儲和分發 Docker 映像的標準方法,是一個獲得了寬松式 Apache 許可的開源存儲庫。 Docker Registry 還可以優化其存儲庫中存儲的 Docker 映像的訪問控制和安全性。它可以管理映像分發,還可以與應用開發工作流集成。在實際應用中,開發人員可以構建自己的 Docker Registry,也可以使用托管式 Docker Registry 服務,例如 Docker Hub、Oracle Container Registry 和 Azure Container Registry 等。 Docker Hub 就是 Docker 托管的一個注冊表,它存儲了來自軟件供應商、開源項目和社區的 100000 多個容器映像,還包含了許多來自 NGINX、Logstash、Apache HTTP、Grafana、MySQL、Ubuntu 和 Oracle Linux 等官方存儲庫的軟件和應用。 當啟動容器時,如果本地映像不可用,Docker 就會默認自動從公共 Docker Hub 中拉取相應的映像。當然,您也可以創建自己的映像并將映像推送到 Docker Hub 的公共或私有存儲庫中。 如今,將單體應用分割為較小的微服務塊這一理念已引起了軟件開發人員的廣泛關注。 微服務作為進程獨立部署,使用輕量級協議相互通信,且每一項服務都擁有自己的數據。由于采用非集中式治理方法,微服務的實現離不開高水平的基礎設施自動化、自動化測試、全自動 CD 管道以及熟練、敏捷的 DevOps 團隊。 對于微服務這種架構,盡管目前仍有許多不同聲音,但有一個共識,那就是在被分解為微服務后,應用無法以一組進程的形式運行。微服務的實現需要滿足眾多條件,例如它需要獨立于主機,在操作系統層面進行隔離,需要在其資源限制內運行,必須支持按需伸縮,必須能在發生故障后重新啟動,必須通過軟件定義網絡層連接至其他微服務。 在 Docker 容器中運行微服務可為實現這些目標奠定一個良好的基礎。 Docker 在兩個維度上改變了軟件的構建、交付和運行方式: 更可靠地將應用從開發環境移動到生產環境。 通過標準映像格式將軟件從本地遷移至云端。 以下是關于這兩個維度的詳細介紹。 包含所有依賴關系的 Docker 映像可解決“開發環境下正常但生產環境下出錯”的問題,其關鍵在于構建管道可以自動基于源代碼庫(如 Git)創建 Docker 映像,在開發環境下進行初步測試,然后在 Docker 注冊表中存儲該不可變映像。 如圖 4 所示,您可以使用同一映像進行進一步的負載測試、集成測試、驗收測試等。換言之,您在每一個環境下使用的都是同一個映像。而對于細微但必要的環境特定差異(例如生產數據庫的 JDBC URL),您可以將其作為環境變量或文件納入到容器中。 有統計數據顯示,當前 65% 的 Docker 使用場景都位于開發環境中,而 48% 的使用場景都使用 Docker 進行持續集成。 Docker 改變了公有云技術的采用方式。一方面,Docker 映像這種前所未有的通用軟件包格式可以在本地環境和所有主流的云技術提供商環境下運行。例如,Docker 容器可以像在 Oracle Cloud 上一樣在筆記本電腦上運行。 另一方面,Docker 容器可以在所有主流的公有云上運行,這消除了長期以來關于公有云技術的一個偏見,即供應商依賴。如今,所有主流的云技術提供商均可提供 Docker as PaaS 服務。 Docker 的發布節奏比傳統企業軟件快得多,這種快節奏以及 Docker 項目的新穎性有時甚至引起了人們對 Docker 安全性和穩定性的擔憂。 事實上,盡管 Docker 及其命令行、Docker daemon、API 以及 Docker Swarm、Docker Machine 和 Docker Compose 等工具快速發展只是近三年的事情,近十年來每一個 Linux 內核中都能看到 Docker 的底層內核特性。 Google 就是一個典型的容器技術早期采用者。早在 Docker 出現之前,Google 就一直在使用 Linux 容器,甚至在容器中運行所有一切。據估計,Google 每周推出數十億個容器。 Docker 使用的底層 Linux 內核特性包括 Cgroup 和命名空間。2008 年,在 Google 開發人員以往工作的基礎上,Linux 內核引入了 Cgroup 1。Cgroup 可以限制并說明一組操作系統進程的資源用量。 命名空間則可隔離各個進程之間的系統資源。2002 年,Linux 引入了第一個命名空間(即 mount 命名空間)。2 本文的第一部分介紹了關于 Docker 的一些重要概念。但在生產環境下,除了在 Docker 容器中運行應用,您還需要解決很多問題。 您需要準備硬件來運行容器,從而設置和操作生產環境;需要安裝、升級和修補 Docker 等軟件以及存儲庫和集群管理器;需要創建一個網絡,以便多個 Docker 容器跨主機通信;需要能夠在集群化容器發生故障后將它們重新啟動。此外,一系列互連的容器應當像一個邏輯應用實例一樣易于部署,例如一個負載均衡器、多個 Web 服務器、多個帶管理服務器的 Oracle WebLogic Server 實例、一個托管式服務器和一個數據庫。最后,要想規模化地管理容器化應用,Kubernetes 或 Docker Swarm 之類的容器編排系統也必不可少,而部署、管理和運行 Kubernetes 之類的編排系統也是一項耗時且充滿挑戰的任務。 為了更輕松、高效地創建容器化應用,很多云技術提供商提供了容器云技術服務或容器即服務 (CaaS),以幫助開發人員和運營團隊理順和管理容器生命周期。這些編排服務通常由 Kubernetes 構建,支持 DevOps 團隊更輕松、規模化地管理和運行容器化應用。例如,Oracle Container Engine for Kubernetes 和 Azure Kubernetes Service 就是兩個常用的、典型的托管式容器編排云技術服務。 Oracle Container Engine for Kubernetes 是一個全托管式、可擴展、高度可用且可在云端部署容器化應用的服務。如果您的開發團隊希望可靠地構建、部署和管理云原生應用,請使用 Container Engine for Kubernetes(有時縮寫為 OKE)。Docker 術語的定義
Docker:
容器:
Docker 引擎:
Docker 映像:
Docker 注冊表:
哪些人使用 Docker?
Docker 和開發人員
Docker 與 Kubernetes 對比
Docker 基礎知識
隔離與虛擬化對比
增量文件系統
Docker Registry
Docker 即微服務運行時
Docker — 兩個關鍵維度
Docker 映像 — 從開發到生產
Docker Cloud
Docker 版本 — 成熟的底層技術
Cgroup 和命名空間的歷史
容器云技術服務