Docker 用了那么久 了,還不知道它是如何工作的呢?
Docker 構成三大件
Docker的架構主要由三個核心組件構成,這是 Docker 三大件。
圖片
Docker Client
這是開發者與Docker交互的部分。無論你是直接使用 Docker 命令行,還是用 Docker desktop、OrbStack這些 GUI 工具,實際上都是在使用Docker客戶端。包括使用 Dockerfile 實際上也是對 Client 命令的包裝。
它負責將你輸入的指令傳遞給Docker守護進程(Docker daemon),并顯示出執行結果。
Docker Host
這是Docker運行的核心環境。在Docker主機上,最關鍵的部分就是Docker守護進程(Docker daemon)。它負責處理 Docker API 的請求,管理各種Docker對象,包括下面這幾個:
? 鏡像(Images):容器的只讀模板,包含了運行應用所需的所有依賴和配置。 ? 容器(Containers):鏡像的運行實例,可以被啟動、停止、刪除等。 ? 網絡(Networks):容器間通信的橋梁。 ? 數據卷(Volumes):用于數據持久化的機制。
Docker Registry
這是存儲Docker鏡像的地方。Docker Hub是默認的公共鏡像倉庫,國內也有不少的鏡像站,雖然現在很多不能用了,包括各個云平臺一般也有自己的鏡像倉庫,很多公司也會搭建公司內部的鏡像倉庫。
我記得15年我做 devops 的時候,公司就搭了鏡像倉庫,因為當時公司用的那些鏡像都是高度定制化的,而且配置略復雜,搭建鏡像倉庫就很合適。
Docker 如何工作的
好了,了解了 Docker 核心組件后,我們再來看看Docker是如何工作的吧。
使用者啟動一個容器一定是從一個鏡像創建出來的,那就從鏡像的構建、鏡像上傳、鏡像拉取直到容器運行這幾個階段來看一下 Docker 的工作過程。
構建階段
鏡像的發布者可以通過 docker save 命令將自己的容器打包成一個鏡像,但是更好的方式是直接編寫Dockerfile,定義好各種依賴和參數。
最后使用docker build命令構建鏡像,Docker客戶端將指令發送給Docker守護進程。守護進程解析Dockerfile文件,根據其指定的參數和配置,創建一個符合要求的鏡像。
分發階段
使用docker push命令,將構建好的鏡像上傳到Docker倉庫,不管是公共倉庫還是內部倉庫。
之后其他人就可以通過docker pull命令從倉庫中獲取這個鏡像。到這一步大部分人應該都很熟悉了,鏡像可能沒打包過,但是用鏡像啟動容器應該是輕車熟路的。
運行階段
使用docker run命令,Docker守護進程會基于指定的鏡像創建并啟動一個新的容器,如果之前沒有用 docker pull命令拉取過,那會自動拉取。
容器在一個隔離的環境中運行,擁有自己的文件系統、網絡和進程空間。
Docker的工作原理保證了所有使用這個鏡像的環境都是一致的,這樣就不會出現開發說:“在我的機器上是沒問題的呀?在測試環境是可以的呀?”這樣的問題了。
通過將應用及其依賴打包到一個標準化的單元(容器)中,Docker確保了應用可以在任何支持Docker的環境中一致地運行。
此外,Docker的輕量級特性使得它可以在同一臺主機上同時運行多個容器,每個容器都是相互隔離的。這種隔離性和可移植性使得Docker在微服務架構、持續集成/持續部署(CI/CD)流程中發揮著重要作用。
Docker 、Dockerfile、Docker Swarm、K8S 之間的關系
Docker 和 Dockerfile
Dockerfile是一個文本文件,包含了一系列指令和參數。它用于定義如何構建Docker鏡像。
當執行docker build命令時,Docker會讀取Dockerfile中的指令,并據此創建一個Docker鏡像。
可以將Dockerfile理解為鏡像的"配方",而Docker則是"廚師",按照這個配方烹飪出最終的"菜肴"(鏡像)。
Dockerfile是輸入,Docker鏡像是輸出,而Docker平臺則是將輸入轉化為輸出的工具。
Docker 和 Docker Swarm
Docker Swarm是Docker原生的集群管理和編排工具。
當需要的容器變多了,并且經常有需要擴展容器的需求時,就需要編排工具了。
Docker Swarm則用于管理多個Docker主機組成的集群??梢詫⒍鄠€運行Docker的機器組合成一個虛擬的Docker主機,讓運維人員輕松地在多臺機器上部署和擴展Docker容器。
它提供了一些基本的編排功能,如服務發現、負載均衡、滾動更新等。
可以將Docker Swarm視為Docker的擴展,它使得Docker能夠在集群環境中更好地工作。
Docker 和 K8s
Kubernetes,通常簡稱為K8s,是一個更加強大和復雜的容器編排平臺。
Kubernetes最初是為Docker容器設計的,但它現在支持多種容器運行時,包括Docker和Containerd。
雖然 Kubernetes 宣布不再直接支持 Docker 了,但是實際上支持Containerd 就是支持 Docker了,所以默認 K8s 就是Docker 的編排工具。
Kubernetes提供了比Docker Swarm更豐富的功能,包括自動擴縮容、自我修復、批處理、水平擴展等。





























