runC:輕量級容器運行環境

s_xlli 8年前發布 | 15K 次閱讀 Docker 操作系統

runC(https://runc.io/)是一個輕量級通用容器運行環境。目前,它是一個命令行工具,可以根據開放容器方案(Open Container Initiative)生成和運行容器。它的遠景是:由Docker、Google、IBM、Microsoft、RedHat還有其他參與者創建一個通用且標準化的運行環境,提供容器運行時的元素可讀文檔,由Docker向OCI提供基于代碼的可用實現方法。這包括libcontainer,Docker使用的原生底層接口,支持操作系統構建。

假定runC是一個開源項目并固定周期發布版本,可以從GitHub上找到它的源碼和相應版本(https://github.com/opencontainers/runc)。如果你下載并編譯runC的二進制,你將會得到采用runC作為簡單容器運行環境的全部組件,包括1個JSON容器配置和1個根文件系統。如果你已經安裝了Docker1.11或者更高版本,將自動獲得一個近期版本的runC。它被命名為docker-runC,安裝在/usr/bin下,可以在在Docker環境外使用,就像正常安裝的runC一樣。

采用runC的好處

在OCI和runC存在以前,很多Docker的核心開發者用過runC的類似工具nsinit,它允許一個簡化的探針到運行和調試的底層容器的功能,不需要整個Docker守護進程的接口。現在runC存在了,這依然是個應用場景,特別是某些潛在挖掘新的linux隔離特性的人。例如,Linux用戶檢查點/恢復項目( Linux Checkpoint/Restore In Userspace,CRIU)中的檢查點/恢復特性已經通過runC實現,并且準備成為Docker守護進程中runC的更高一層。當然,隨著runC/OCI在Linux上的擴展,它也將會成為其他系統資源隔離的可能。例如,Solaris zones和Microsoft上基于Windows的容器,這兩者均期待具有OCI運行特性并通過runC來實現。

除了在操作系統層面的新特性,runC是一個有效的debug平臺,特別是處理需要debug容器進程上的整個Docker棧的復雜情況。

使用runC的門檻

開發者們已經習慣了Docker生態系統中從low-friction點到容器的方式,包括采用DockerHub或者私有registry的鏡像、直接運行 docker run 來開啟或者關閉容器的特性和配置。使用runC時,開發者必須要從其他系統中構建或者導出文件系統包,用于創建容器的入口。他們同樣需要配置一些JSON文件,用于實現類似 docker run 的參數,這些需要直接編碼在JSON文件中,因為runC有簡單的啟動、終止、暫停等接口,但是沒有相應參數。

綜合容器策略

它與開發人員總體策略的吻合度依賴于這是否是開發者的意愿和預期結果。對于一個尋找簡單地運行容器的模型而不需要Docker守護進程特性的開發者來說,runC類似Containerd(https://github.com/docker/containerd),另一個Docker開源項目,它在Docker1.11及更高版本中存在,或許是個更好的選擇。在西雅圖的DockerCon演講之后,我見到了多個開發者并分享他們構建的整個容器云架構,利用一個或者多個containerd和runC做有有趣的工作負載和容器生命周期管理。在很多場景下,runC將會是一個底層的細節,可能會也可能不會引起開發者的興趣。

稍微超出一些單純runC的討論,有個一直沒有討論的內容是runC對Docker和其他OCI工具的可插入性。雖然在OCI社區中有其他項目runv、runz還有其他用Solaris zones或者輕量級hypervisor實現的OCI運行時技術。另一方面,runC和類似runC的實現對關注隔離技術或者操作系統容器特性的開發者比較有吸引力。

映射容器特性,如Seccomp和用戶命名空間

由于libcontainer(一個操作系統層的庫)為操作系統提供容器隔離,它是runC的核心,相比起暴露給上層(如Docker),操作系統層的特性(例如sceccomp和用戶命名空間)必須在runC中優先實現,這個特性(沒有在runC中實現)是runC吸引人的地方。需要最新的特性已經暴露給Docker,并且在libcontainer和runC中已經可用。這同樣意味著在這些隔離特性或者增強安全特性開發期間,runC是一個非常好的工具用JSON文件來測試配置。

在他ContainerCon的演講中(https://lcccna2016.sched.org/speaker/estesp?iframe=no),Pill將會描述他的用例,還將展示如何用seccomp開啟或者關閉特定syscall,并觀察在應用程序上的效果。他還將利用開源工具來展示工作流提高開發者效率,利用當前Docker容器和鏡像作為輸入創建一個現有runC配置和根文件系統。

 

 

來自:https://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=2649691500&idx=1&sn=c06fd328426d923dc460919e7a674703&chksm=88932a0fbfe4a3192dd3e1e46bd5fcee2aae0f68f97abe078326ae756cda8d2976f92d359dba&scene=1&srcid=0907GnxMdl95MkY0CPOZLJy7&pass_ticket=7Jkhmr3lz5jo%2BxX9S3Ap6J0Z7nLNsRF%2FM7pGkZtyZTw%3D#rd

 

 本文由用戶 s_xlli 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!