国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Web服務器 > 正文

Docker Runc容器生命周期詳細介紹

2024-09-01 13:49:28
字體:
來源:轉載
供稿:網友

Docker Runc容器生命周期

容器的生命周期涉及到內部的程序實現和面向用戶的命令行界面,runc內部容器狀態轉換操作、runc命令的參數定義的操作、docker client定義的容器操作是不同的,比如對于docker client的create來說,

語義和runc就完全不同,這一篇文章分析runc的容器生命周期的抽象、內部實現以及狀態轉換圖。理解了runc的容器狀態轉換再對比理解docker client提供的容器操作命令的語義會更容易些。

容器生命周期相關接口

  • 最基本的required的接口
    • Start: 初始化容器環境并啟動一個init進程,或者加入已有容器的namespace并啟動一個setns進程;執行postStart hook; 阻塞在init管道的寫端,用戶發信號替換執行真正的命令
    • Exec: 讀init管道,通知init進程或者setns進程繼續往下執行
    • Run: Start + Exec的組合
    • Signal: 向容器內init進程發信號
    • Destroy: 殺掉cgroups中的進程,刪除cgroups對應的path,運行postStop的hook
    • 其他
      • Set: 更新容器的配置信息,比如修改cgroups resize等
      • Config: 獲取容器的配置信息
      • State: 獲取容器的狀態信息
      • Status: 獲取容器的當前運行狀態: created、running、pausing、paused、stopped
      • Processes: 返回容器內所有進程的列表
      • Stats: 容器內的cgroups統計信息
    • 對于linux容器定義并實現了特有的功能接口
      • Pause: free容器中的所有進程
      • Resume: thaw容器內的所有進程
      • Checkpoint: criu checkpoint
      • Restore: criu restore

接口在內部的實現

  • 對于Start/Run/Exec的接口是作為不同os環境下的標準接口對開發者暴露,接口在內部的實現有很多重復的部分可以統一,因此內部的接口實際上更簡潔,這里以linux容器為例說明
    • 對于Start/Run/Exec在內部實現實際上只用到下面兩個函數,通過傳入flag(容器是否處于stopped狀態)區分是創建容器的init進程還是創建進程的init進程
      • start: 創建init進程,如果status == stopped,則創建并執行newInitProcess,否則創建并執行newSetnsProcess,等待用戶發送執行信號(等在管道寫端上),用用戶的命令替換掉
      • exec: 讀管道,發送執行信號
    • Start直接使用start
    • Run實際先使用start(doInit = true),然后exec
    • Exec實際先使用start(doInit = false), 然后exec

對用戶暴露的命令行參數與容器接口的對應關系,以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命令行的動作序列對容器狀態機的影響

  • 對于一個容器的生命周期來說,穩定狀態有4個: stopped、created、running、paused
  • 注意下面狀態轉換圖中的動作是runc命令行參數動作,不是容器的接口動作,這里沒考慮checkpoint相關的restore狀態
   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 ---------------------------|

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榆林市| 麻江县| 额尔古纳市| 衡东县| 惠安县| 峨眉山市| 江口县| 鹿泉市| 山东省| 息烽县| 龙里县| 德江县| 大竹县| 雅安市| 青州市| 宁安市| 河曲县| 合作市| 广西| 合山市| 云南省| 亳州市| 莫力| 涟源市| 张北县| 大邑县| 井陉县| 牡丹江市| 武定县| 阿拉善左旗| 甘孜| 清徐县| 吉林省| 滕州市| 岑巩县| 溆浦县| 共和县| 房产| 常宁市| 饶阳县| 东安县|