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