Docker 2 之 Docker 基本概念與架構

2021-08-15 12:01:24 字數 3411 閱讀 7922

學習內容整理筆記來自 極客學院的 docker 入門教程,更多資訊檢視 docker 文件

docker 包含以下基本組成:

客戶端(docker client)

守護程序(docker daemon)

映象(docker image)

容器(docker container)

倉庫(docker registry)

docker 包括三個基本概念:映象(image)、容器(container)、倉庫(repository)。理解了這三個概念,就理解了 docker 的整個生命週期。

docker 是 c/s 架構的程式,docker 客戶端向 docker 伺服器端(即 docker 的守護程序)發出請求。等 docker 的守護程序處理完所有的工作並返回結果。docker 客戶端對伺服器端的訪問既可以是在本地也可以通過遠端訪問。

理解 docker c/s 架構

通過 docker 客戶端執行各種命令,然後 docker 客戶端會將這些命令傳送給守護程序。守護程序執行的結果傳回給客戶端,使我們可以通過客戶端來檢視命令執行的結果。

守護程序(docker daemon)

守護程序建立並管理 docker 物件,如映象,容器,網路和資料卷等。

docker引擎是乙個客戶端-服務端架構的應用,它由以下主要元件構成:

命令列介面使用docker提供的rest型的 api 來控制或和docker守護程序交流,可以使用指令碼或直接傳送命令。很多其他docker應用會使用更底層 api 或命令列介面。

注意:docker 遵循apache2.0開源協議

docker 映象就是乙個唯讀的模板, 映象是 docker 容器的基石,容器基於映象啟動和執行。映象好比容器的源**儲存了用於啟動容器的各種條件。例如乙個映象可以包含乙個完整的 ubuntu 作業系統環境,裡面僅安裝了apache或使用者需要的其它應用程式。

那麼,再深一層次理解,docker 映象是乙個層疊的唯讀檔案系統,而它最低端是乙個引導的檔案系統(即 bootfs)。這很像典型的 linux 引導檔案系統,docker 使用者幾乎永遠與引導檔案系統有互動。實際上,當乙個容器啟動後,它將會被移到記憶體中而引導檔案系統將會被解除安裝。而 docker 映象的第二層是rootfs(ubuntu)檔案系統,它位於引導檔案系統之上。root 檔案系統可以是一種或多種作業系統。比如 ubuntu 以及 centos 等。在傳統的 linux 引導過程中,root 檔案系統會最先以唯讀的形式載入。當引導結束並完成了完整性檢測後,它才會被切換為讀寫模式。但在 docker 裡,root 檔案系統永遠只能是唯讀狀態。並且 docker 利用聯合載入技術又會在 root 檔案系統之上載入更多的唯讀檔案系統。聯合載入指的是,一次同時載入多個檔案系統。但在外面看起來只載入乙個檔案系統。聯合載入會將各層系統疊加到一起,讓最終的檔案系統會包含所有的底層檔案和目錄。docker 將這樣的檔案系統稱為映象。乙個映象可以放到另乙個映象頂部,對於下面的映象稱為副映象。依次類推直到映象站到最底部,最底部的映象稱為基礎映象。也就是圖中映象棧中的 root 檔案系統。

docker 利用容器來執行應用,容器是從映象建立的執行例項。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。可以把容器看做是乙個簡易版的 linux 環境(包括 root 使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式。映象是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。

1.容器通過映象來啟動

docker 的容器是 docker 的執行**。容器中可以執行客戶的乙個或者多個程序。

2.啟動和執行階段

如果說映象是 docker 生命週期中的構建或打包階段,那麼容器則是啟動和執行階段。

容器怎樣通過映象來啟動?

當乙個容器啟動時,docker 會在該映象的最頂層載入乙個讀寫檔案系統,也就是乙個可寫的檔案層。在 docker 中執行的程式,就是在這個層中執行的。當 docker 第一次啟動應用容器時,初始的讀寫層是空的。當檔案系統發生變化時,這些變換都可以運用到這一層上。比如,如果想修改應用檔案,這個檔案首先會從該讀寫層下面的唯讀層複製到該讀寫層。該檔案的唯讀版本依然存在,但是已經被讀寫層中的該檔案副本所隱藏。這就是乙個 docker 中乙個重要的技術。

3.寫時複製(copy on write)

每個唯讀映象層都是唯讀的,並且以後永遠不會變化。當建立乙個新容器時, docker 會建立乙個映象棧,就像圖中所表現的。在棧的最頂層新增可寫層,這個讀寫層加上下面的映象層以及一些配置資料就構成了乙個容器。容器的這個種特點加上映象分層的框架使我們可以快速地構建映象並執行包含我們自己的應用程式和服務的容器。

倉庫是集中存放映象檔案的場所。有時候會把倉庫和倉庫註冊伺服器(registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映象,每個映象有不同的標籤(tag)。

docker 用倉庫來儲存使用者構建的映象,倉庫分為公有私有兩種,docker 公司自己提供了乙個公有的私有倉庫,叫做docker hub。我們可以在 docker hub上去註冊賬號,分享並儲存自己的映象。目前docker hub已經有了豐富的 docker 映象。所以,我們可以通過docker hub來查詢我們需要的映象,為我們節省了很多構建映象的時間。當然我們也可以架設自己私有的倉庫。

這張圖一目了然的介紹了 docker 的各個組成部分的關係,通過客戶端來訪問 docker 的服務端從而操作 docker 容器。而容器是經過映象來建立,而映象又儲存在倉庫中。

docker(2)搭建私有倉庫

1 安裝依賴包 yum y install pcre devel zlib devel openssl openssl devel 2 配置ssl 1 hostnamectl set hostname docker.peng.com 修改主機名 echo 192.168.0.105 docker.p...

自己動手寫docker 2

2.1 linux namespace linux 支援的namespace namespace api的基本系統呼叫 不完整的ex,以下為呼叫後截圖為 package main import log os os exec syscall func main syscall.credential c...

Docker 2 核心技術

2.1.1 docker映象 2.1.2 映象與容器 2.1.3 映象通常較小 2.1.4 映象拉取和映象倉庫 2.1.5 映象命名和標籤 2.1.6 映象與分層 2.1.7 共享映象層 2.1.8 映象雜湊值 摘要 2.2.1 docker容器 2.2.2 容器vs虛擬機器 2.2.3 虛擬機器的...