docker基礎_docker引擎內部原理
docker引擎內部原理
docker主要由以下主要元件構成:docker客戶端、docker守護程序(daemon)、containerd、runc、shim
daemon
daemon的主要功能包括映象管理、映象構建、REST API、身份驗證、安全、核心網路以及編排。
containerd
主要任務就是對容器的生命週期管理---start|stop|pause|rm......
shim
shim是實現無daemon的容器(用於將執行中的容器與daemon解耦,以便進行daemon升級等的操作)
containerd指揮runc來建立新容器。事實上,每次建立容器時它都會fork一個新的runc示例,一旦容器建立完成對應runc程序會退出,然後containerd-shim程序就會成為容器的父程序,shim部分職責如下
- 保持所有STDIN和STDOUT流是開啟狀態,從而當daemon重啟的時候,容器不會因為管道的關閉而終止
- 將容器的退出狀態反饋給daemon
runc
runc生來只有一個作用-----建立容器,這一點它速度很快
啟動一個新的容器
docker container run -it --name test 7faaec683238 bash
-
當使用docker命令列工具執行如上命令是,docker客戶端會將其轉換為合適的api格式,併發送到正確的api端點
-
api是在daemon中實現的。這套功能豐富、基於版本的rest api已經成為docker的標誌
-
一旦daemon接收到建立新容器的命令,它就會向containerd發出調令。(daemon已經不會再包含任何建立程式碼的模組了 分工明確)
-
雖然名叫containerd 但是它並不負責建立容器,而是指揮runc去做。containerd將docker映象轉換為oci bundle 並讓runc基於此建立一個新容器
-
runc與作業系統核心介面進行通訊,基於所有必要的工具來建立容器。容器程序作為runc的子程序啟動,啟動完畢後,runc將會退出,然後containerd-shim程序就會成為容器的父程序
-
由於將所有用於啟動、管理容器的邏輯和程式碼都從daemon中移除,意味著容器執行時與daemon是解耦的,對於docker daemon的升級維護工作不會影響到執行中的容器