什麼是 Docker?

Docker 是一個用於開發、釋出和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎設施分離,從而快速交付軟體。藉助 Docker,您可以像管理應用程式一樣管理您的基礎設施。透過利用 Docker 的程式碼釋出、測試和部署方法,您可以顯著減少編寫程式碼和在生產環境中執行程式碼之間的延遲。

Docker 平臺

Docker 提供了在一個稱為容器的鬆散隔離環境中打包和執行應用程式的能力。隔離和安全性使您可以在給定的主機上同時執行多個容器。容器是輕量級的,並且包含執行應用程式所需的一切,因此您無需依賴主機上安裝的內容。您可以在工作時共享容器,並確保與您共享的每個人都獲得以相同方式工作的相同容器。

Docker 提供了用於管理容器生命週期的工具和平臺

  • 使用容器開發您的應用程式及其支援元件。
  • 容器成為分發和測試應用程式的單元。
  • 準備就緒後,將您的應用程式作為容器或編排服務部署到生產環境中。無論您的生產環境是本地資料中心、雲提供商還是兩者的混合,其工作方式都相同。

我可以用 Docker 做什麼?

快速、一致地交付您的應用程式

Docker 允許開發人員使用提供應用程式和服務的本地容器在標準化環境中工作,從而簡化了開發生命週期。容器非常適合持續整合和持續交付 (CI/CD) 工作流。

考慮以下示例場景

  • 您的開發人員在本地編寫程式碼,並使用 Docker 容器與同事共享他們的工作。
  • 他們使用 Docker 將應用程式推送到測試環境,並執行自動化和手動測試。
  • 當開發人員發現錯誤時,他們可以在開發環境中修復它們,然後重新部署到測試環境進行測試和驗證。
  • 測試完成後,將修復程式交付給客戶就像將更新後的映象推送到生產環境一樣簡單。

響應式部署和擴充套件

Docker 基於容器的平臺允許高度可移植的工作負載。Docker 容器可以在開發人員的本地筆記型電腦、資料中心的物理或虛擬機器、雲提供商或混合環境中執行。

Docker 的可移植性和輕量級特性也使其易於動態管理工作負載,根據業務需求近乎即時地擴充套件或縮減應用程式和服務。

在相同硬體上執行更多工作負載

Docker 輕量且快速。它為基於虛擬機器監控程式的虛擬機器提供了一種可行且經濟高效的替代方案,因此您可以使用更多的伺服器容量來實現您的業務目標。Docker 非常適合高密度環境以及需要用更少資源做更多事情的中小型部署。

Docker 架構

Docker 使用客戶端-伺服器架構。Docker 客戶端與 Docker 守護程序通訊,後者負責構建、執行和分發您的 Docker 容器。Docker 客戶端和守護程序可以在同一系統上執行,或者您可以將 Docker 客戶端連線到遠端 Docker 守護程序。Docker 客戶端和守護程序使用 REST API、透過 UNIX 套接字或網路介面進行通訊。另一個 Docker 客戶端是 Docker Compose,它允許您處理由一組容器組成的應用程式。

Docker Architecture diagram

Docker 守護程序

Docker 守護程序 (dockerd) 監聽 Docker API 請求並管理 Docker 物件,如映象、容器、網路和卷。守護程序還可以與其他守護程序通訊以管理 Docker 服務。

Docker 客戶端

Docker 客戶端 (docker) 是許多 Docker 使用者與 Docker 互動的主要方式。當您使用 docker run 等命令時,客戶端會將這些命令傳送到 dockerd,後者會執行它們。docker 命令使用 Docker API。Docker 客戶端可以與多個守護程序通訊。

Docker Desktop

Docker Desktop 是一款易於安裝的應用程式,適用於您的 Mac、Windows 或 Linux 環境,使您能夠構建和共享容器化應用程式和微服務。Docker Desktop 包括 Docker 守護程序 (dockerd)、Docker 客戶端 (docker)、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。有關更多資訊,請參閱 Docker Desktop

Docker 映象倉庫

Docker 映象倉庫儲存 Docker 映象。Docker Hub 是一個任何人都可以使用的公共映象倉庫,Docker 預設在 Docker Hub 上查詢映象。您甚至可以執行自己的私有映象倉庫。

當您使用 docker pulldocker run 命令時,Docker 會從您配置的映象倉庫中拉取所需的映象。當您使用 docker push 命令時,Docker 會將您的映象推送到您配置的映象倉庫。

Docker 物件

當您使用 Docker 時,您正在建立和使用映象、容器、網路、卷、外掛和其他物件。本節簡要概述了其中一些物件。

映象

映象是帶有建立 Docker 容器指令的只讀模板。通常,一個映象基於另一個映象,並進行了一些額外的自定義。例如,您可以構建一個基於 ubuntu 映象的映象,但安裝了 Apache Web 伺服器和您的應用程式,以及執行您的應用程式所需的配置詳細資訊。

您可以建立自己的映象,也可以只使用由他人建立併發布在映象倉庫中的映象。要構建自己的映象,您需要建立一個 Dockerfile,它使用簡單的語法來定義建立和執行映象所需的步驟。Dockerfile 中的每條指令都會在映象中建立一個層。當您更改 Dockerfile 並重建映象時,只有那些已更改的層才會被重建。與其他虛擬化技術相比,這部分解釋了為什麼映象如此輕量、小巧和快速。

容器

容器是映象的可執行例項。您可以使用 Docker API 或 CLI 建立、啟動、停止、移動或刪除容器。您可以將容器連線到一個或多個網路,為其附加儲存,甚至可以根據其當前狀態建立一個新映象。

預設情況下,容器與其他容器及其主機相對隔離。您可以控制容器的網路、儲存或其他底層子系統與其他容器或主機的隔離程度。

容器由其映象以及您在建立或啟動它時提供的任何配置選項定義。當容器被移除時,任何未儲存在持久儲存中的狀態更改都會消失。

示例 docker run 命令

以下命令執行一個 ubuntu 容器,以互動方式附加到您的本地命令列會話,並執行 /bin/bash

$ docker run -i -t ubuntu /bin/bash

當您執行此命令時,會發生以下情況(假設您使用的是預設的映象倉庫配置)

  1. 如果您本地沒有 ubuntu 映象,Docker 會從您配置的映象倉庫中拉取它,就像您手動執行 docker pull ubuntu 一樣。

  2. Docker 建立一個新容器,就像您手動運行了 docker container create 命令一樣。

  3. Docker 為容器分配一個讀寫檔案系統作為其最後一層。這允許執行中的容器在其本地檔案系統中建立或修改檔案和目錄。

  4. Docker 建立一個網路介面以將容器連線到預設網路,因為您沒有指定任何網路選項。這包括為容器分配一個 IP 地址。預設情況下,容器可以使用主機的網路連線連線到外部網路。

  5. Docker 啟動容器並執行 /bin/bash。因為容器以互動方式執行並附加到您的終端(由於 -i-t 標誌),您可以使用鍵盤提供輸入,同時 Docker 將輸出記錄到您的終端。

  6. 當您執行 exit 終止 /bin/bash 命令時,容器會停止但不會被移除。您可以再次啟動它或移除它。

底層技術

Docker 是用 Go 程式語言 編寫的,並利用了 Linux 核心的幾個特性來提供其功能。Docker 使用一種名為 namespaces 的技術來提供稱為容器的隔離工作區。當您執行容器時,Docker 會為該容器建立一組名稱空間。

這些名稱空間提供了一層隔離。容器的每個方面都在一個單獨的名稱空間中執行,其訪問許可權僅限於該名稱空間。

後續步驟