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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 方法的原…