Docker 容器介绍

2023-05-16

1. 简介

1.1 容器和VM

img

什么是容器:

  • 一种操作系统级别的虚拟化的方案
  • 只能运行相同或相似内核的操作系统
  • 依赖Linux内核特性:Namespace和Cgroups

1.2 依赖内核特性

  • Namespaces:命名空间,容器的独立资源

    • Mount
    • PID
    • Net
    • IPC
    • UTS: Unix Time-Sharing, allow a single system to appear to have different host and domain names to different processes.
    • User
  • Cgroups:控制组

    • 资源限制:对进程组使用的资源总额进行限制。例如设定应用运行时的内存上限,当超过该限额就会 OOM(Out of Memory)

    • 优先级分配:通过分配CPU时间片数量、硬盘IO及带宽大小来控制进程的优先级

    • 资源统计:统计系统的资源使用量,如CPU使用量,内存用量等

    • 进程控制:可以对进程组执行挂起、恢复等操作

1.3 分层文件系统

层状文件系统,当进程需要修改文件时,AUFS创建该文件的一个副本

  • aufs: ubuntu, 未合入内核
  • devicemapper (dm): centos, 性能差
  • overlay: 合入内核,当前主流

镜像:多个镜像层 (Image Layer) 叠加而成的只读文件系统 (UnionFile System)

  • bootfs:最底层文件系统,用于系统引导,包含bootloader和kernel,容器启动后会被卸载以节约内存资源
  • rootfs:位于bootfs之上,为容器的根文件系统
    • 传统模式:系统启动时,内核以“只读”模式挂载rootfs,完整性自检后,再重新挂载为“读写”模式
    • docker:rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

容器:在镜像的基础上,增加了一个读写层 (Top Layer)。运行状态下的容器,由一个可读写的文件系统、隔离的进程空间和进程构成

img

2. Docker

Docker 使用 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runC 和 containerd

img

2.1 启动容器

img

docker        ctr(独立于docker时)
 |             |
 V             V
 dockerd -> containerd ---> shim -> runc -> runc init -> process
                      |-- > shim -> runc -> runc init -> process
                      +-- > shim -> runc -> runc init -> process

组件通信流程:

img

  • dockerd:docker engine的守护进程
  • containerd:由dockerd启动的子进程,它们之间通过RPC进行通信
  • containerd-shim:被containerd拉起后,start/exec/create拉起runC进程,通过exit、control文件和containerd通信,通过父子进程关系和SIGCHLD监控容器中进程状态
  • runC:真正用户想启动的进程,由runc的init进程启动,即runc init [args …]
  • 在整个容器生命周期中,containerd通过epoll 监控容器文件,监控容器的OOM等事件

2.2 Containerd

img

Containerd 标准化的产物,主要负责:

  • 管理容器的生命周期(从创建到销毁)
  • 拉取/推送容器镜像
  • 存储管理(管理镜像及容器数据的存储)
  • 调用 runC 等容器运行时
  • 管理容器网络

Containerd 标准化

  • 彻底从docker引擎中分离
  • 可被 Kubernetes CRI 等项目直接调用
  • 当 containerd 和 runC 成为标准化容器服务的基石后,上层应用可以直接建立在 containerd 和 runC 之上。

Containerd 架构

img

  • 被设计成 snapshotter 的模式,这也使得它对于 overlay 文件系、snapshot 文件系统的支持比较好。
  • storage、metadata 和 runtime 的三大块划分非常清晰,通过抽象出 events 的设计,网络层面的复杂度交给了上层处理,仅提供 network namespace 相关的一些接口添加和配置 API。这样保留最小功能集合的纯粹和高效,将更多的复杂性及灵活性交给了插件及上层系统。

2.3 Containerd-shim

  • 允许 runC 在启动容器之后退出,即不必为每个容器一直运行一个容器运行时
  • 即使 containerd 和 dockerd 都挂掉,容器的标准 IO 和其它的文件描述符也都是可用的
  • 向 containerd 报告容器的退出状态

2.4 RunC

runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。

RunC 默认要支持 seccomp ( secure computing mode,即安全计算模型),编译时,先安装 libseccomp-dev

容器的状态转移:

img

3. 标准化

img

3.1 CRI

Container Runtime Interface (CRI), it defines an API between Kubernetes and the container runtime

  • containerd: it is a high-level container runtime that came from Docker, and implements the CRI spec. It pulls images from registries, manages them and then hands over to a lower-level runtime, which actually creates and runs the container processes.

  • CRI-O: it is another high-level container runtime which implements the Container Runtime Interface (CRI). It’s an alternative to containerd. It pulls container images from registries, manages them on disk, and launches a lower-level runtime to run container processes. It was born out of Red Hat, IBM, Intel, SUSE and others.

总结:CRI 是 K8S 调用 容器的 API 接口

3.2 OCI

Open Container Initiative (OCI), it is a group of tech companies who maintain a specification for the container image format, and how containers should be run.

  • runc: it is an OCI-compatible container runtime. It implements the OCI specification and runs the container processes。runc provides all of the low-level functionality for containers, interacting with existing low-level Linux features, like namespaces and control groups. It uses these features to create and run container processes.
  • crun: a container runtime written in C (by contrast, runc is written in Go.)
  • kata-runtime: from the Katacontainers project, which implements the OCI specification as individual lightweight VMs (hardware virtualisation)
  • gVisor: from Google, which creates containers that have their own kernel. It implements OCI in its runtime called runsc.

总结:OCI 规定容器镜像格式和容器运行的标准

3.3 Docker-shim

k8s 调用 docker:

img

kubelet:k8s 容器管理组件,负责对容器的创建、删除等调度行为的管理

docker-shim:kubelet和dockerd交互的中间接口。docker-shim 提供了一个标准接口,让kubelet能够专注于容器调度逻辑本身,而不用去适配 dockerd 接口变动。而其他实现了相同标准接口的容器技术也可以被kubelet集成使用,这个接口称作CRI。docker-shim 是对 CRI 接口调用 dockerd 的一种实现, docker-shim 并不是docker技术的一部分,而是k8s系统的一部分。

k8s 1.20+ 默认不再使用dockershim,并将在后续版本中删除dockershim,这意味着kubelet不再通过dockerd操作容器。在新架构中,kubelet直接与containerd交互,跳过了dockershim和dockerd这两个步骤。

img

cri-containerd:在k8s和containerd的适配过程中,还曾经出现过cri-containerd这个组件。在containerd1.0版本中,containerd提供了cri-containerd作为独立进程来实现CRI接口,其定位和docker-shim类似。但在containerd1.1版本中,就将这个功能改写成了插件形式直接集成到了containerd进程内部,使containerd可以直接支持CRI接口,cri-containerd也被合入了containerd,作为其一个内置插件包存在。

4. Podman

img

Podman主要由红帽发起和推动,原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。其包括如下三个模块:

  • Podman:运行容器,简单粗暴直接操作 runC
  • Skopeo:用于对容器镜像和镜像库执行各种操作,支持使用 OCI 镜像与原始的 Docker v2 镜像。支持不同镜像库同步等操作
  • Buildah:构建OCI镜像, 它复制了Dockerfile的所有命令。可以直接使用Dockerfiles构建镜像,并且不需要任何root权限

Podman 的不足:因为没有类似 docker daemon 守护进程,所以不支持 --restart 策略,不过使用 k8s 编排就不存在这个问题。

Podman 兼容大部分 Docker 命令,可配置简单

yum install podman
podman –version

alias docker=podman

# podman 网桥
ip addr show cni-podman0

5. 补充

LXC:LinuX Containers ,它是一个加强版的Chroot。其作用是将不同的应用隔离开来,有点类似于chroot,chroot是将应用隔离到一个虚拟的私有root下,而LXC在这之上更进了一步。LXC依赖 Kernel 的3种隔离机制(isolation infrastructure):Chroot、Cgroups、Namespaces。LXC提供一个共享kernel的OS级虚拟化方法,在执行时不用重复加载kernel,且conatiner的kernel与host共享,因此大大加快了container的启动过程,并显著减少了内存消耗。

libcontainer:docker0.9 开发了 libcontainer 模块来作为 LXC 的替代品实现容器底层特性,并在1.10版本彻底去除了LXC。在1.11版本拆分出runc后,libcontainer 也随之成为了runc的核心功能模块。

moby:docker公司发起的开源项目,其中最主要的部分就是同名组件moby,事实上这个moby就是dockerd目前使用的开源项目名称,docker项目中的engine(dockerd)仓库现在就是从moby仓库fork而来的。

docker-ce:docker的开源版本,CE指Community Edition。docker-ce中的组件来自于moby、containerd等其他项目。

docker-ee:docker的收费版本,EE指Enterprise Edition。

rkt与rktlet:CoreOS公司主导的容器技术,在早期得到了k8s的支持成为k8s集成的两种容器技术之一。随着CRI接口的提出,k8s团队也为rkt提供了rktlet模块用于与rkt交互,rktlet和dockersim的意义基本相同。随着CoreOS被Redhat收购,rkt已经停止了研发,rktlet已停止维护了。

CRI-O:Redhat公司推出的容器技术。从名字就能看出CRI-O的出发点就是一种原生支持CRI接口规范的容器技术。CRI-O同时兼容OCI接口和docker镜像格式。CRI-O的设计目标和特点在于它是一项轻量级的技术,k8s可以通过使用CRI-O来调用不同的底层容器运行时模块,例如runc。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 容器介绍 的相关文章

  • 【点云可视化】自制ply文件并使用open3d可视化点云

    使用open3d可视化点云 xff0c 需要将点云制作为ply文件传入函数中 安装open3d 直接使用pip安装 pip span class token function install span open3d ply文件 ply文件的
  • 【python】返回列表排序索引

    arr span class token operator 61 span span class token punctuation span span class token number 1 span span class token
  • 【win10】安装pytorch1.6.0+cuda10.1 + torch-geometric

    conda下新建一个环境 xff0c 使用python3 6 conda create name torch ge span class token assign left variable python span span class t
  • 【python】制作GIF

    导入库 span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as
  • 【3D体素可视化】

    可视化3D体素 xff0c voxel被表示为一个3维的数组 xff0c 每个位置为0或1 span class token keyword from span mpl toolkits span class token punctuati
  • OVS 使用总结

    1 简介 Open vSwitch 是一个用C语言开发的多层虚拟交换机 1 1 工作原理 内核模块实现了多个 数据路径 xff08 类似网桥 xff09 每个都可以有多个 vports xff08 类似网桥的端口 xff09 每个数据路径也
  • MySQL常用函数学习

    前言 MySQL函数是MySQL数据库提供的内置函数 xff0c 这些内置函数可以更方便处理表中的数据 下面简单介绍一下MySQL中包含的几类常用函数 聚合函数 聚合函数可实现根据一组数据求出一个值 xff0c 聚合函数的结果值只根据选定数
  • 【双指针(快慢指针)】链表中倒数第k个结点

    题目 输入一个链表 xff0c 输出该链表中倒数第k个结点 暴力解法 很多种 xff0c 先遍历一遍 xff0c 统计链表的长度 xff0c 让后找正数的第n k 1个节点 快慢指针 使用两个指针 xff0c fast和slow xff0c
  • 【反转链表】

    题目 输入一个链表 xff0c 反转链表后 xff0c 输出新链表的表头 题解 遍历一遍链表 xff0c 在遍历的过程中不断将指向关系反转 xff0c 可以想到需要两个指针fast和slow xff0c fast在前 xff0c slow在
  • 【python】argparse转换为字典

    在使用argparse定义程序参数时 xff0c 常规用法如下 xff1a span class token keyword import span argparse parser span class token operator 61
  • 【pytorch】多GPU训练

    使用多GPU训练pytorch模型只需要加一句DataParallel即可 xff0c 如下 span class token keyword from span torch span class token punctuation spa
  • pytorch列表添加模块

    在使用pytorch将多个模块添加到列表时不能使用简单的list xff0c 需要使用torch nn ModuleList xff0c 否则框架无法跟踪到模块且不能使用model cuda 将模型转移到GPU上 xff0c 会产生以下错误
  • 【python】将列表划分为多个子列表

    参考 将列表划分为包含3个元素的子列表 a span class token operator 61 span span class token punctuation span span class token number 1 span
  • 【pytorch】点乘、矩阵乘法

    点乘即两个相同大小的矩阵对应位置相乘 xff0c 使用torch mul a b xff0c a和b的大小需要相等 矩阵乘法需要满足矩阵乘法的原则 xff0c 使用torch matmul a b xff0c a和b需要满足矩阵乘法的规则
  • 【pytorch】1x1卷积

    对image进行1x1卷积 xff0c 输入为 b a t c h
  • VS code远程链接linux服务器开发

    https blog csdn net weixin 42864357 article details 105658765
  • 解决ValueError: Expected more than 1 value per channel when training

    出现这个问题是因为网络中存在BatchNormalization模块 xff0c 它需要多于1个数据来计算平均值 xff0c 当batch只有一个数据时会报错 如果使用pytorch xff0c 可以在获取数据集时 xff0c 将DataL
  • Etcd 入门简介

    1 简介 Etcd 是 CoreOS 基于 Raft 开发的分布式 key value 存储 xff0c 可用于服务发现 共享配置以及一致性保障 xff08 如数据库选主 分布式锁等 xff09 1 1 特性 Go 语言实现的高可靠 KV
  • 【torch.index_select】利用下标提取tensor中的值

    torch index select self Tensor dim Union str None index Tensor xff1a 第一个Tensor是被操作的tensor xff0c dim表示要操作的维度 xff0c index是
  • 【pytorch select】索引函数

    select dim index xff1a 第一个参数为索引的维度 xff0c 第二个参数为索引的维度的序列号 span class token keyword import span torch a span class token o

随机推荐

  • 【双y轴图】python制作双y轴图

    span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as spa
  • Linux上安装open3d

    pip install span class token operator span span class token operator span user open3d span class token operator span pyt
  • Linux下搜索软件的安装路径

    Linux下搜索软件的安装路径 xff0c 例如 xff0c hbase span class token function whereis span hbase
  • win10+VS2017安装PCL库

    参考博客 https www jianshu com p 463f54c91ab7 https blog csdn net weixin 41991128 article details 83864713 可能出现的问题 xff1a 使用V
  • 【python】使用open3d进行mesh sampling

    span class token keyword import span open3d span class token keyword as span o3d mesh path span class token operator 61
  • 【链表】两个链表的第一个公共结点

    题目描述 输入两个链表 xff0c 找出它们的第一个公共结点 xff08 注意因为传入数据是链表 xff0c 所以错误测试数据的提示是用其他方式显示的 xff0c 保证传入数据是正确的 xff09 解法 这题首先需要理解两个链表的公共节点的
  • 【链表】链表中环的入口结点

    题目描述 给一个链表 xff0c 若其中包含环 xff0c 请找出该链表的环的入口结点 xff0c 否则 xff0c 输出null 快慢指针法 求解链表中关于环的问题最常见的是使用快慢指针 xff0c fast指针和slow指针均从链表的头
  • 【链表】删除链表中的重复节点

    题目描述 在一个排序的链表中 xff0c 存在重复的结点 xff0c 请删除该链表中重复的结点 xff0c 重复的结点不保留 xff0c 返回链表头指针 例如 xff0c 链表1 gt 2 gt 3 gt 3 gt 4 gt 4 gt 5
  • Etcd 使用总结

    1 简介 Etcd API 特性 xff1a 原子性 xff1a 一个操作要么全部执行 xff0c 要么全部不执行一致性 xff1a 不论客户端请求的是哪个etcd服务器 xff0c 它都能读取到相同的事件 xff0c 而且这些事件的顺序也
  • 【torch.nn.AdaptiveMaxPool】

    Pytorch提供了自适应池化层torch nn AdaptiveMaxPool xff0c 这种层和一般的池化层一样 xff0c 都没有参数 xff0c 都是对特征进行降采样 xff0c 自适应的意思是在使用池化层时不需要指定核的大小步长
  • 【链表】复杂链表的复制

    题目描述 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针random指向一个随机节点 xff09 xff0c 请对此链表进行深拷贝 xff0c 并返回拷
  • 【数组】顺时针打印矩阵

    题目 输入一个矩阵 xff0c 按照从外向里以顺时针的顺序依次打印出每一个数字 xff0c 例如 xff0c 如果输入如下4 X 4矩阵 xff1a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出
  • 【数组】数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半 xff0c 请找出这个数字 例如输入一个长度为9的数组 1 2 3 2 2 2 5 4 2 由于数字2在数组中出现了5次 xff0c 超过数组长度的一半 xff0c 因此输出2 如果不
  • java for循环的几种写法

    参考 xff1a https blog csdn net qq 36804363 article details 87539927 span class token keyword int span span class token pun
  • 【双指针】和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S xff0c 在数组中查找两个数 xff0c 使得他们的和正好是S xff0c 如果有多对数字的和等于S xff0c 输出两个数的乘积最小的 输入 1 2 4 7 11 15 15 返回值 4 1
  • 【动态规划】连续子数组的最大和

    题目描述 输入一个整型数组 xff0c 数组里有正数也有负数 数组中的一个或连续多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为 O n 输入 xff1a 1 2 3 10 4 7 2 5 返回值 xff1a 18 说明
  • Java交换字符串中两个位置的值

    需求 xff1a 对一字符串abcd xff0c 要求交换位置0和位置2的两个字符 xff0c 交换结果为cbad java高效实现方案 xff0c 先将String转换为char数组 xff0c 数组可以修改任意位置的值 xff0c 进行
  • 【动态规划、递归回溯】字符串的排列

    题目描述 输入一个字符串 按字典序打印出该字符串中字符的所有排列 例如输入字符串abc 则按字典序打印出由字符a b c所能排列出来的所有字符串abc acb bac bca cab和cba 输入一个字符串 长度不超过9 可能有字符重复 字
  • 【数组】把数组排成最小的数

    题目描述 输入一个正整数数组 xff0c 把数组里所有数字拼接起来排成一个数 xff0c 打印能拼接出的所有数字中最小的一个 例如输入数组 3 xff0c 32 xff0c 321 xff0c 则打印出这三个数字能排成的最小数字为32132
  • Docker 容器介绍

    1 简介 1 1 容器和VM 什么是容器 xff1a 一种操作系统级别的虚拟化的方案只能运行相同或相似内核的操作系统依赖Linux内核特性 xff1a Namespace和Cgroups 1 2 依赖内核特性 Namespaces xff1