Docker
- what is a docker?
-
- what is a Container?
- Container VS Virtual Mechines
- Docker的基本組成
-
- Docker 用戶端/守護程序
- Docker Image鏡像
- Docker Container容器
- Docker Registries倉庫
- Docker底層技術
-
- Namespaces命名空間
- Control Groups控制組
- Union flie system
- Container format
what is a docker?
Docker是一個開源的引擎,可以輕松的為任何應用建立一個輕量級的、可移植的、自給自足的容器。Go語言開源引擎:Git位址
Docker通常用于如下場景:
- web應用的自動化打包和釋出;
- 自動化測試和持續內建、釋出;
- 在服務型環境中部署和調整資料庫或其他的背景應用;
- 從頭編譯或者擴充現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。
what is a Container?
什麼是容器?
它一種虛拟化方案,是将代碼及其所有依賴項打包的标準軟體單元。是以通過容器,應用程式可以快速可靠地從一個計算環境運作到另一個環境。
它是一種作業系統級别的虛拟化,隻能運作與底層作業系統相同或相似核心的作業系統。Docker使用的容器技術依賴于Linux核心的Namespace和Cgroup(Control Group)特性,是以docker容器上隻能運作Linux核心的系統。
Container VS Virtual Mechines

容器和虛拟機具有類似的資源隔離和配置設定優勢,容器虛拟化的是作業系統而不是實際的硬體。是以對比虛拟機,容器更便攜、效率更高。
容器是應用程式層的抽象,它将代碼和依賴關系打包在一起。隻需要包含應用和其依賴的庫,比vm占用的空間更小(容器映像通常有幾十mb大小),可以處理更多的應用程式,并且需要更少的vm和作業系統。
虛拟機是将一台伺服器轉換為多台伺服器的實體硬體的抽象。使用虛拟機部署應用除了應用和其依賴的庫之外,還要包含完整的作業系統。
Docker的基本組成
Docker由以下幾部分組成:
- Docker Client 用戶端;
- Docker Daemon 守護程序;
- Docker Image 鏡像;
- Docker Container 容器;
-
Docker Registry 倉庫;
基本結構組成:
docker學習筆記1what is a docker?Docker的基本組成Docker底層技術
Docker 用戶端/守護程序
Docker采取的C/S結構。Docker client同Docker daemon通訊,Docker daemon負責維護docker 容器的建構,運作和分發。
Client和Daemon可以再同一台主機上面執行,也可以分開執行。本地的client可以連接配接遠端的daemon。Client可以通過socker或者REST API同daemon通訊。
通過Docer用戶端執行指令,Docker用戶端會将這些指令傳給Docker守護程序。守護程序還會将指令執行的結果傳回給用戶端,通過用戶端可以檢視指令運作的結果。
Docker Image鏡像
Image鏡像是容器的基石,它是由層疊隻讀層(read-only layer)組成的隻讀檔案系統。每一個鏡像由一系列的層 (layers) 組成。Docker 使用 UnionFS(Union File System:統一檔案系統)來将這些層聯合到單獨的鏡像中。UnionFS 允許獨立檔案系統中的檔案和檔案夾(稱之為分支)被透明覆寫,形成一個單獨連貫的檔案系統。
通常情況下,新的Image都在舊的Image之上建立。通過編寫并執行Dockerfile檔案,可以自行建立一個新的Docker Image。
Docker 鏡像發生改變時,一個新的層會被建立。程式更新時,不需要替換或重建立立鏡像,隻添加一個新的層或更新層。
Docker Container容器
Docker容器包含了所有的某個應用運作所需要的環境。容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一差別在于容器的最上面那一層是可讀可寫的。每一個 Docker 容器都是從 Docker 鏡像建立的。Docker 容器可以運作、開始、停止、移動和删除。每一個 Docker 容器都是獨立和安全的應用平台,Docker 容器是 Docker 的運作部分。 通過
docker run
指令可運作容器。
Docker Registries倉庫
Docker Registry 用來存儲Docker鏡像,類似代碼管理倉庫。Docker Hub和Docker Cloud上提供了龐大的鏡像集合供使用。可直接下載下傳
docker pull
使用現有的Image或在他人的Image上建立新的Image,使用
docker push
可以推送自己的Image
Docker底層技術
Docker是用Go編寫的,它依賴于Linux核心的幾個功能來提供其功能。
Namespaces命名空間
類似c++等程式設計語言中的namnespaces,Docker利用namespces技術來實作工作空間的的隔離。當運作一個container時,Docker就會為其建立namespaces, 容器的各個層都在一個單獨的命名空間中運作,其通路權限僅限于該命名空間。
Docker Engine 使用了這幾項linux命名空間:
- pid:Process ID 程序隔離
- net:Network網絡隔離
- ipc:Interprocess Communicate跨程序通路
- mnt:Mount 管理挂載點
- uts:Unix Timesharing System隔離核心和版本辨別
Control Groups控制組
control groups 是linux核心提供的一種可以限制、控制、隔離程序組所使用的實體資源的機制。控制組允許Docker Engine将可用的硬體資源共享給容器,并可選擇強制執行限制和限制。它提供這幾項功能:
- 資源限制:可設定記憶體大小
- 優先級設定:可設定程序組使用資源的優先級
- 資源計量:計量程序組使用的資源
- 資源控制:程序組挂起和恢複
Union flie system
聯合檔案系統或UnionFS是,通過建立一系列層來組成的檔案系統,是一種輕量級的高性能分層檔案系統,支援将檔案系統中的修改進行送出和層層疊加,這個特性使得鏡像可以通過分層實作和繼承。同時支援将不同目錄挂載到同一個虛拟檔案系統下。 Docker Engine可以使用多種UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。
Container format
Docker Engine 将命名空間、控制組、unionfs結合、包裝起來,這個預設的包稱為libcontainer,利用libcontainer可建立新的Docker容器。