什麼是 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 常駐程式。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,由 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 網頁伺服器和您的應用程式,以及執行應用程式所需的組態詳細資訊。

您可以建立自己的映像檔,或者您可能只使用其他人建立並發佈在倉庫中的映像檔。要建構您自己的映像檔,您可以建立一個 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 會為該容器建立一組命名空間。

這些命名空間提供了一層隔離。容器的每個方面都在一個獨立的命名空間中運行,並且其訪問權限僅限於該命名空間。

下一步