docker進階之架構

一、OCI

名為OCI,全稱 Open Container Initiative/開放容器倡議,其目的主要是為了制定容器技術的通用技術標準。目前主要有兩種標準:
?? ?1、容器運行時標準 (runtime spec)

?? ?2、容器鏡像標準(image spec)


?? ?

二、docker的架構? ??

1、組成

docker1.11版之后由單體分為了5大組成部分(解耦)

? ? 1、docker-client:客戶端命令
?? ?
?? ?2、dockerd守護進程:全稱docker daemon,主要提供客戶端命令接口,

?? ?
?? ?3、containerd服務:
?? ??? ?containerd獨立負責容器運行時的生命周期(如創建、啟動、停止、暫停、信號處理、刪除),其他一些比如鏡像構建、存儲卷管理、日志操作都是dockerd(docker daemon)的一些模塊管理
?? ??? ?
?? ?4、containerd-shim:
?? ??? ?該進程由containerd服務創建
?? ??? ?每創建一個容器,都會啟動一個containerd-shim進程,然后由該進程調用runc來具體創建容器
?? ??? ?
?? ?5、runc:
?? ??? ?最早期docker只是把Runc單拿出來捐贈給了OCI來作為容器運行時的標準,? ? ? ??
?? ??? ?即runc造出來的容器自然就符合OCI標準,使用runc創造出來的就是一個符合oci規范的標準容器

?

2、為何需要有containerd-shim

  • Runc創建出的容器需要依賴于某個進程或服務,如果容器直接依賴于containerd服務那意味著,一臺機器上啟動的多個容器都統一依附于containerd
  • 一旦containernd退出,該主機上的所有容器都跟著一起退出了

?? ?
?? ?
?? ?于是引入了containerd-shim進程這種設計,由該進程調用runc來創建容器,容器創建出來之后就依賴于該進程
? ??并且該進程雖然是由containerd服務創建的,但是containerd-shim進程是1號進程的父進程
? ? 即containerd只負責創建containerd-shim這個進程,創建出來之后containerd-shim進程就與containerd服務無關了? ??
?? ?所以說,此時containerd服務掛掉了,根本影響不到containerd-shim進程
?? ?containerd-shim進程作為容器的依賴它不出問題就影響不到容器
?? ?
?? ?? ? ps:live-restore就是基于該設計而來。

3、containerd、containerd-shim及容器進程的關系

? ? 層級:

? ? ? ? dockerd服務
?? ??? ??? ?containerd服務
?? ??? ??? ??? ?containerd-shim進程---》runc(只是一個功能,造完容器就消失)--->容器的1號進程
?? ??? ??? ??? ?containerd-shim進程---》runc--->容器的1號進程
?? ??? ??? ??? ?containerd-shim進程---》runc--->容器的1號進程

?? ?依賴關系:
?? ??? ?dockerd服務沒有依賴,它爹是1號進程? ? ? ??
?? ??? ?containerd服務沒有依賴,它爹是1號進程?? ??? ?
?? ??? ?chontainerd-shim是由containerd創建的,但是containerd-shim它爹是1號進程,
?? ??? ??? ?強調:
?? ??? ??? ??? ?containerd創出出containerd-shim進程之后,這個shim進程與containerd就無關了
?? ??? ??? ??? ?所以containerd-shim也沒有依賴

? ? ? ? ? ? ? ?
? ? ? ?
? ? ? ? 容器內的1號進程是有依賴,依賴于containerd-shim
?? ??? ??? ?1、容器內的1號進程的父進程是containerd-shim,容器一旦結束,進入僵尸進程狀? ? ? ? ? ? ? ? 態,會由containerd-shim來負責回收? ? ? ? ? ??
?? ??? ??? ?2、容器的一些如stdin、fd等都需要依賴于containerd-shim管理
?? ??? ??? ?所以containerd-shim一旦結束,容器就跟著一塊完蛋了

4、runtime

? ? runtime翻譯為容器運行時,指的就是用來管理鏡像或者容器的服務端軟件

? ? runtime分為兩大類

  • high-level runtime:比如docker、containerd、podman等,支持更多高級功能(如鏡像管理和gRPC / Web API),對于高級別運行時來說,他們是通過調用低級別運行時來管理容器(可以簡單的理解為高級別是在低級別基礎上的上層封裝),一般可以是runc作為低級別運行時?
  • low-level runtime: 比如lxc、runc、gvisor、kata等,只涉及到容器運行的一些基礎細節,比如namespace創建、cgroup設置

? ? ? ? ? ? ? ? 通常提到的都是低等級的runtime

containerd------是一個工業級標準的容器運行時,它強調簡單性、健壯性和可移植性,containerd 可以負責干下面這些事情:

  • 管理容器的生命周期(從創建容器到銷毀容器)
  • 拉取/推送容器鏡像
  • 存儲管理(管理鏡像及容器數據的存儲)
  • 調用 runc 運行容器(與 runc 等容器運行時交互)
  • 管理容器網絡接口及網絡

三、k8s與docker

  1. 1.20版本之后k8s可以找直接和containerd通信,1.20開始放棄docker支持,containerd已經由docker的一部分演變為一個獨立的組件,可以對接多種服務
  2. 從 k8s 的角度看,選擇 containerd作為運行時的組件,它調用鏈更短,組件更少,更穩定,占用節點資源更少

  • k8s不能直接與docker通信,只能與CRI運行時通信,要與 Docker 通信就必須使用橋接服務(dockershim)
  • docker比k8s發布的早,Dockershim -直都是 Kubernetes 為了兼容 Docker 獲得市場采取的臨時產案(決定)
  • k8s在過去因為 Docker 的熱門而選擇它,現在又因為高昂的維護成本而放棄它,對于已經統治市場的k8s來說,Docker的支持顯得非常雞肋,移除代碼也就順理成章
  • 在集群中運行的容器運行時往往不需要docker這么復雜的功能,k8s需要的只是 CRI 中定義的那些接口
  • 對于正式生產環境還是建議采用兼容CRI的containerd之類底層運行時。

四、docker中的cpu與gpu

定義

?? ?cpu:擅長邏輯控制,串行運算,cpu就好像一個老教授,老教授的特點是啥數學題都能算? ??
?? ?gpu:擅長大規模的并發計算機,gpu就好像是一群只會算簡單的加減法的小學生
?? ?

要想啟動一個容器使用gpu需要具備哪些條件:

? ? 1、宿主機上必須插一塊gpu卡
?? ?2、宿主機上需要為該gpu卡安裝驅動程序
?? ?3、安裝官方的容器引擎,例如docker容器引擎
?? ?4、配套安裝一個nvidia-container-runtime(對runc的擴展)
?? ?5、啟動容器采用參數--gpus指定啟動gpu,
?? ?或者修改配置文件把默認的runc替換為nvidia-container-runtime這樣就不用加--gpus參數啟動,容器默認都能訪問gpu
?? ?
?? ?強調:容器環境內必須有cuda環境才行(有cuda環境容器內的系統才能調用GPU)

? ? ? ? ? ? ? ?cuda 編程模型

  • 創建容器:docker -> dockerd-> containerd-> containerd-shim->runc-> container-process
  • 創建GPU容器:docker-> dockerd-> containerd-> containerd-shim->nvidia-container-runtime -> nvidia-container-runtime.hook -> libnvidia-container-> runc-> container->process

實現

docker19.03之前還需要安裝nvidia-docker,之后只用安裝nvidia-container-runtime即可使用

#下載對應GPU驅動#安裝nvidia-container-runtime
#在https://nvidia.github.io/nvidia-container-runtime/查看并添加源并直接安裝
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
sudo yum install nvidia-container-runtime#檢查安裝
docker run --help | grep -i gpus--gpus gpu-request               GPU devices to add to the container ('all' to pass all GPUs)#強調采用的鏡像里必須包含cuda
docker run -it --rm --gpus all nvidia/cuda:9.0-base nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00       Driver Version: 440.64.00       CUDA Version: 10.2 |#操作
所有顯卡都對容器可見:
docker run --gpus all --name 容器名 -d -t 鏡像id
只有顯卡1對容器可見:
docker run --gpus="1" --name 容器名 -d -t 鏡像id如果不指定 --gpus ,運行nvidia-smi 會提示Command not found注意:
1. 顯卡驅動在所有方式中,都要先安裝好,容器是不會有顯卡驅動的,一臺物理機的顯卡只對應一個顯卡驅動,當顯卡驅動安裝好后(即使未安裝cuda),也可以使用命令nvidia-smi
2. nvidia-smi顯示的是顯卡驅動對應的cuda版本,nvcc -V 顯示的運行是cuda的版本 
啟動容器時,容器如果想使用gpu,鏡像里必須有cuda環境,就是說,針對想使用gpu的容器,鏡像在制作時必須吧cuda環境打進去下面三個參數代表的都是是容器內可以使用物理機的所有gpu卡--gpus allNVIDIA_VISIBLE_DEVICES=all--runtime=nvidaNVIDIA_VISIBLE_DEVICES=2 只公開兩個gpu,容器內只能用兩個gpu舉例如下:
# 使用所有GPU
$ docker run --gpus all nvidia/cuda:9.0-base nvidia-smi# 使用兩個GPU
$ docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi# 指定GPU運行
$ docker run --gpus '"device=1,2"' nvidia/cuda:9.0-base nvidia-smi
$ docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:9.0-base nvidia-smi

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84473.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84473.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84473.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業產品網絡安全日志6月10日-WAF資費消耗排查

發生了什么事? 上個的費用賬單出來了,WAF費用有點飆升。比平時多了50%到100%。 周五的時候就已經知道這個事情了,但當時考慮肯定是攔截了一些惡意請求,所以。 反正也是上個月的事情了,所以周一過來復盤一下 數了下&a…

vue3+el-table 利用插槽自定義數據樣式

<el-table-column label"匹配度" prop"baseMatchingLevel"><template #default"scope"><div :style"{ color: scope.row.baseMatchingLevel > 0.8 ? #00B578 : #FA5151 }">{{ scope.row.baseMatchingLevel }}&l…

[密碼學實戰]C語言使用SDF庫構建國密算法RESTful服務(五)

[密碼學實戰]C語言使用SDF庫構建國密算法RESTful服務(五) 引言 在現代信息安全領域,國密算法(SM系列算法)作為中國自主研發的密碼算法標準,在金融、政務等領域得到廣泛應用。本文將詳細介紹如何使用C語言結合SDF(Security Device Function)庫,構建一個提供國密算法服…

ubuntu 22.04搭建SOC開發環境

目錄 AArch64位編譯器命名規則 安裝交叉工具鏈編譯 安裝aarch64-none-elf工具鏈 安裝aarch64-none-linux-gnu工具鏈 啟動板載系統 板卡啟動方式 硬件連接 準備階段 硬件連接 udev規則配置 啟動流程 開發板外觀圖 硬件準備清單 硬件連接 SSH登錄系統 設置Windows為…

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特點代碼演示 push和pop特點代碼演示 前言 在 iOS 開發中&#xff0c;push 和 present 是兩種不同的視圖控制器切換方式&#xff0c;它們有著顯著的區別。 present和dismiss 特點 在當前控制器上方新建視圖層級需要手動調用…

Java項目中常用的中間件及其高頻問題避坑

Java項目中常用的中間件及其高頻問題避坑如下: 一、常用中間件分類及作用 1. ??消息隊列中間件?? ??作用??:解耦系統、異步通信、削峰填谷。??代表產品??: ??Kafka??:高吞吐量流處理,適合日志收集、實時分析。??RocketMQ??:金融級可靠性,支持事務消…

發布一個angular的npm包(包含多個模塊)

為什么要發布npm包 根本原因時為了能夠在更廣泛的區域復用代碼&#xff0c;比如公司不支持一般的外部網絡&#xff0c;但是支持npm包的下載&#xff0c;那么就可以發布npm包&#xff0c;然后在公司內使用。 angular的npm不同嗎 angular library angular 目前已經到angular20…

Web后端基礎:Maven基礎

課程內容&#xff1a; 初始MavenMaven概述 Maven模型Maven倉庫介紹Maven安裝與配置 IDEA集成Maven依賴管理單元測試 1.初始Maven 1.1介紹 Maven 是一款用于管理和構建Java項目的工具&#xff0c;是Apache旗下的一個開源項目 。 Apache 軟件基金會&#xff0c;成立于1999年7月…

http協議同時傳輸文本和數據的新理解

首先&#xff0c;承認本人對于http協議認知確實不夠&#xff0c;從來沒有仔細研究這一塊。 其次&#xff0c;這回確實要把自己十幾年的理解更新一下了&#xff0c;主要還是自己過去沒有認真研究過http協議。 這一次是這么回事&#xff0c;碰到一個情況&#xff0c;要在一次消…

《安富萊嵌入式周報》第354期: 開源36通道16bit同步數據采集卡,開源PoE以太網GPIB,分體式鍵盤DIY,微軟WSL開源,USB轉車載以太網

周報匯總地址&#xff1a;嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 視頻版&#xff1a; https://www.bilibili.com/video/BV1kJThzxETY/ 《安富萊嵌入式周報》第354期: 開源36通道16bit同…

Hyperlane 框架詳解與使用指南

hyperlane 是一個高性能且輕量級的 Rust HTTP 框架&#xff0c;設計目標是簡化現代 Web 服務的開發&#xff0c;同時兼顧靈活性和性能表現。本文將詳細介紹 hyperlane 框架的核心功能、API 設計、生命周期模型、路由支持及性能測試結果&#xff0c;幫助開發者快速掌握和應用該框…

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;來自 Elastic Jeffrey Rengifo 學習如何將 ES|QL 與 JavaScript 的 Apache Arrow 客戶端工具一起使用。 想獲得 Elastic 認證嗎&#xff1f;了解下一期 Elasticsearch Engineer 培訓的時間吧&#xff01; Elasticsearch 擁有眾多新功能&#xff0c;助你為自己…

從零實現富文本編輯器#5-編輯器選區模型的狀態結構表達

先前我們總結了瀏覽器選區模型的交互策略&#xff0c;并且實現了基本的選區操作&#xff0c;還調研了自繪選區的實現。那么相對的&#xff0c;我們還需要設計編輯器的選區表達&#xff0c;也可以稱為模型選區。編輯器中應用變更時的操作范圍&#xff0c;就是以模型選區為基準來…

一個小小的 flask app, 幾個小工具,拼湊一下

1. 起因&#xff0c; 目的: 自己的工具&#xff0c;為自己服務。給大家做參考。項目地址&#xff1a; https://github.com/buxuele/flask_utils 2. 先看效果 3. 過程: 一個有趣的 Flask 工具集&#xff1a;從無到有的開發歷程 緣起&#xff1a;為什么要做這個項目&#xff…

織夢dedecms怎樣用標簽調用隨機數?

?在使用織夢模板建站中&#xff0c;隨機數作為一個偶爾使用到的參數&#xff0c;在具體使用中雖然用的少&#xff0c;但是今天跟版網小編給大家介紹下&#xff0c;大家可以參考下&#xff1a; 實現隨機數的調用可以使用下面的js&#xff1a; 方法一&#xff1a;js代碼 Math…

訪問服務器項目,服務器可以ping通,但是端口訪問不到

原因&#xff1a;端口未開放 假設項目部署服務器為205&#xff0c;在90服務器訪問205項目 1、首先在205確定項目啟動&#xff0c;看端口是否占用 # Windows&#xff08;檢查端口占用&#xff09; netstat -ano | findstr "8103"期望輸出&#xff1a; TCP 0.0.…

云原生核心技術 (7/12): K8s 核心概念白話解讀(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;歡迎來到《云原生核心技術》系列的第七篇&#xff01; 在上一篇&#xff0c;我們成功地使用 Minikube 或 kind 在自己的電腦上搭建起了一個迷你但功能完備的 Kubernetes 集群。現在&#xff0c;我們就像一個擁有了一塊嶄新數字土地的農場主&#xff0c;是時…

華為云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建網站智能客服助手

目錄 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介紹與應用場景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介紹 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用場景 2.3 開通MaaS服務 2.4 開通DeepSeek-V3商用服務 三、華為云Flexus簡介 3.1 …

『uniapp』url攔截屏蔽 避免webview中打開淘寶店鋪自動跳轉淘寶

目錄 分析1. wv.overrideUrlLoading2. 參數 `mode: allow`3. 參數 `match: ^(http|https)://.*`4. 回調函數 `function(e) { console.warn(allow url:, e.url); }`作用:可能的應用場景:核心代碼總結歡迎關注 『uniapp』 專欄,持續更新中 歡迎關注 『uniapp』 專欄,持續更新…

將對透視變換后的圖像使用Otsu進行閾值化,來分離黑色和白色像素。這句話中的Otsu是什么意思?

Otsu 是一種自動閾值化方法&#xff0c;用于將圖像分割為前景和背景。它通過最小化圖像的類內方差或等價地最大化類間方差來選擇最佳閾值。這種方法特別適用于圖像的二值化處理&#xff0c;能夠自動確定一個閾值&#xff0c;將圖像中的像素分為黑色和白色兩類。 Otsu 方法的原…