Docker Runc容器生命周期詳細(xì)介紹
Docker Runc容器生命周期
容器的生命周期涉及到內(nèi)部的程序?qū)崿F(xiàn)和面向用戶的命令行界面,runc內(nèi)部容器狀態(tài)轉(zhuǎn)換操作、runc命令的參數(shù)定義的操作、docker client定義的容器操作是不同的,比如對于docker client的create來說,
語義和runc就完全不同,這一篇文章分析runc的容器生命周期的抽象、內(nèi)部實現(xiàn)以及狀態(tài)轉(zhuǎn)換圖。理解了runc的容器狀態(tài)轉(zhuǎn)換再對比理解docker client提供的容器操作命令的語義會更容易些。
容器生命周期相關(guān)接口
- 最基本的required的接口
- Start: 初始化容器環(huán)境并啟動一個init進(jìn)程,或者加入已有容器的namespace并啟動一個setns進(jìn)程;執(zhí)行postStart hook; 阻塞在init管道的寫端,用戶發(fā)信號替換執(zhí)行真正的命令
- Exec: 讀init管道,通知init進(jìn)程或者setns進(jìn)程繼續(xù)往下執(zhí)行
- Run: Start + Exec的組合
- Signal: 向容器內(nèi)init進(jìn)程發(fā)信號
- Destroy: 殺掉cgroups中的進(jìn)程,刪除cgroups對應(yīng)的path,運(yùn)行postStop的hook
- 其他
- Set: 更新容器的配置信息,比如修改cgroups resize等
- Config: 獲取容器的配置信息
- State: 獲取容器的狀態(tài)信息
- Status: 獲取容器的當(dāng)前運(yùn)行狀態(tài): created、running、pausing、paused、stopped
- Processes: 返回容器內(nèi)所有進(jìn)程的列表
- Stats: 容器內(nèi)的cgroups統(tǒng)計信息
- 對于linux容器定義并實現(xiàn)了特有的功能接口
- Pause: free容器中的所有進(jìn)程
- Resume: thaw容器內(nèi)的所有進(jìn)程
- Checkpoint: criu checkpoint
- Restore: criu restore
接口在內(nèi)部的實現(xiàn)
- 對于Start/Run/Exec的接口是作為不同os環(huán)境下的標(biāo)準(zhǔn)接口對開發(fā)者暴露,接口在內(nèi)部的實現(xiàn)有很多重復(fù)的部分可以統(tǒng)一,因此內(nèi)部的接口實際上更簡潔,這里以linux容器為例說明
- 對于Start/Run/Exec在內(nèi)部實現(xiàn)實際上只用到下面兩個函數(shù),通過傳入flag(容器是否處于stopped狀態(tài))區(qū)分是創(chuàng)建容器的init進(jìn)程還是創(chuàng)建進(jìn)程的init進(jìn)程
- start: 創(chuàng)建init進(jìn)程,如果status == stopped,則創(chuàng)建并執(zhí)行newInitProcess,否則創(chuàng)建并執(zhí)行newSetnsProcess,等待用戶發(fā)送執(zhí)行信號(等在管道寫端上),用用戶的命令替換掉
- exec: 讀管道,發(fā)送執(zhí)行信號
- Start直接使用start
- Run實際先使用start(doInit = true),然后exec
- Exec實際先使用start(doInit = false), 然后exec
- 對于Start/Run/Exec在內(nèi)部實現(xiàn)實際上只用到下面兩個函數(shù),通過傳入flag(容器是否處于stopped狀態(tài))區(qū)分是創(chuàng)建容器的init進(jìn)程還是創(chuàng)建進(jìn)程的init進(jìn)程
對用戶暴露的命令行參數(shù)與容器接口的對應(yīng)關(guān)系,以linux容器為例
- create -> Start(doInit = true)
- start -> Exec
- run -> Run(doInit = true)
- exec -> Run(doInit = false)
- kill -> Signal
- delete -> Signal and Destroy
- update -> Set
- state -> State
- events -> Stats
- ps -> Processes
- list
- linux specific
- pause -> Pause
- resume -> Resume
- checkpoint -> Checkpoint
- restore -> Restore
runc命令行的動作序列對容器狀態(tài)機(jī)的影響
- 對于一個容器的生命周期來說,穩(wěn)定狀態(tài)有4個: stopped、created、running、paused
- 注意下面狀態(tài)轉(zhuǎn)換圖中的動作是runc命令行參數(shù)動作,不是容器的接口動作,這里沒考慮checkpoint相關(guān)的restore狀態(tài)
delete |------| /-------------------------------------------------------------| | | / |----- start ---| | | V / | | | |---------| ----------- create ----------> |---------|<---------/ | | stopped | | created |------------| | |---------| <-------- delete(with kill)--- |---------| | | ^ ^ | | | | | | | run | |--------------- delete(-f with kill) ---| exec | | delete(-f with kill) | | | | | | | | | | resume | V | | |---------| -----------------------------> |----------| | | | paused | | running |<----------|-------| |---------| <---------------------------- |----------| | ^ pause ^ | | | | | | | |--exec--| | | | |--------------------------- pause ---------------------------|
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Docker 修改docker存儲位置 修改容器鏡像大小限制操作
這篇文章主要介紹了Docker 修改docker存儲位置 修改容器鏡像大小限制操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11windows server 2016安裝docker的方法步驟
這篇文章主要介紹了windows server 2016安裝docker的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06詳解使用docker 1.12 搭建多主機(jī)docker swarm集群
本篇文章主要介紹了使用docker 1.12 搭建多主機(jī)docker swarm集群,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07數(shù)據(jù)卷(Data Volumes)及dockefile詳解
在生產(chǎn)環(huán)境中使用Docker,往往需要對數(shù)據(jù)進(jìn)行持久化,或者需要在多個容器之間進(jìn)行數(shù)據(jù)共享,這必然涉及容器的數(shù)據(jù)管理操作,今天給大家介紹下數(shù)據(jù)卷(Data Volumes)及dockefile的相關(guān)知識,感興趣的朋友一起看看吧2023-01-01Docker搭建 Nginx+PHP+MySQL 環(huán)境并部署WordPress實踐
本文給大家分享的是作者基于Docker搭建 Nginx+PHP+MySQL 環(huán)境并部署WordPress的詳細(xì)過程,非常的全面,有需要的小伙伴可以參考下2017-02-02詳解使用Docker進(jìn)行Redis主從復(fù)制實踐
這篇文章主要介紹了詳解使用Docker進(jìn)行Redis主從復(fù)制實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04