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