本文介紹Docker容器技術的概要和架構
一、什麼是容器
容器是對應用程式及其依賴關系的封裝。
1.容器的優點
- 容器與主機的作業系統共享資源,提高了效率,性能損耗低
- 容器具有可移植性
- 容器是輕量的,可同時運作數十個容器,模拟分布式系統
- 不必花時間在配置和安裝上,無需擔心系統的改動,以及依賴關系是否滿足
2.容器與虛拟機
運作在同一主機的3個虛拟機
運作在同一主機的3個容器
差別:
A.容器隻能運作與主機一樣的核心
B.程式庫可以共用
C.容器中執行的程序與主機的程序等價(沒有虛拟機管理程式的損耗)
D.隔離能力,虛拟機更高(将容器運作在虛拟機中)
3.容器與Docker
Docker利用現有的Linux容器技術,以不同方式将其封裝及擴充(通過提供可移植的鏡像及友好的接口),來建立及釋出方案。
兩部分:
- 負責建立與運作容器的Docker引擎
- 用來釋出容器的雲服務Docker Hub
二、Docker架構
1.總架構
主要子產品:
DockerClient(與Daemon建立通信,發起容器的管理請求)
DockerDaemon(接收Client請求,處理請求)
Docker Regisrty(鏡像管理)
Graph(存儲鏡像)
Drvier(鏡像管理驅動)
libcontainer(系統核心特性,提供完整、明确的接口給Daemon)
Docker Container
2.各子產品功能及實作
1)Docker Client
Docker架構中使用者與Docker Daemon建立通信的用戶端。
使用者可以使用可執行檔案docker作為Docker Client,發起Docker容器的管理請求。
三種方式建立通信:
tcp://host:port
unix://path_to_socket
fd://socketfd
Docker Client發送容器管理請求後,請求由Docker Daemon接收并處理,當Docker Client接收到傳回的請求響應并做簡單處理後,Docker Client一次完整的生命周期就結束了。
2)Docker Daemon
常駐在背景的系統程序。
主要作用:
接收并處理Docker Client發送的請求
管理所有的Docker容器
Docker Daemon運作時,會在背景啟動一個Server,Server負責接收Docker Client發送的請求;接收請求後,Server通過路由與分發排程,找到相應的Handler來處理請求。
三部分組成:
A.Docker Server
專門服務于Docker Client,接收并排程分發Client請求。
Server通過包gorilla/mux建立mux。Router路由器,提供請求的路由功能,每一個路由項由HTTP請求方法(PUT、POST、GET、DELETE)、URL和Handler組成。
每一個Client請求,Server均會建立一個全新的goroutine來服務,在goroutine中,Server首先讀取請求内容,然後做請求解析工作,接着比對相應的路由項,随後調用相應的Handler來處理,最後Handler處理完請求後給Client回複響應。
B.Engine
核心子產品,運作引擎。
存儲着大量容器資訊,管理着Docker大部分Job的執行。
handlers對象:
存儲衆多特定Job各自的處理方法handler。
例如:
{"create":daemon.ContainerCreate,}
當執行名為"create"的Job時,執行的是daemon.ContainerCreate這個handler。
C.Job
Engine内部最基本的執行單元,Daemon完成的每一項工作都展現為一個Job。
3)Docker Registry
存儲容器鏡像(Docker Image)的倉庫。
Docker Image是容器建立時用來初始化容器rootfs的檔案系統内容。
- 搜尋鏡像
- 下載下傳鏡像
- 上傳鏡像
方式:
- 公有Registry
- 私有Registry
4)Graph
容器鏡像的保管者。
5)Driver
驅動子產品,通過Driver驅動,Docker實作對Docker容器運作環境的定制,定制的次元包括網絡、存儲、執行方式。
作用:
将與Docker容器有關的管理從Daemon的所有邏輯中區分開。
實作:
A.graphdriver
用于完成容器鏡像管理。
初始化前的四種檔案系統或類檔案系統的驅動在Daemon中注冊:
aufs、btrfs、devmapper用于容器鏡像的管理
vfs用于容器volume的管理
B.networkdriver
完成Docker容器網絡環境的配置。
C.execdriver
執行驅動,負責建立容器運作時的命名空間,負責容器資源使用的統計與限制,負責容器内部程序的真正運作等。
Daemon啟動過程中加載ExecDriverflag參數在配置檔案中預設設為native。
6)libcontainer
使用Go語言設計的庫,不依靠任何依賴,直接通路核心中與容器相關的系統調用。
7)Docker Container
服務傳遞的最終展現。
使用者對Docker容器的配置:
- 通過指定容器鏡像,使得Docker容器可以自定義rootfs等檔案系統;
- 通過指定實體資源的配額,使得Docker容器使用受限的資源;
-
通過配置容器網絡及其安全政策,使得Docker容器擁有獨立且安全的網絡環境;
*通過指定容器的運作指令,使得Docker容器執行指定的任務。