热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dockerOCIruntime(待完善)

OpenContainerInitiative(OCI)目前有2个标准:runtime-spec以及image-spec。前者规定了如何运行解压过的filesystembundle

  Open Container Initiative(OCI)目前有2个标准:runtime-spec以及image-spec。前者规定了如何运行解压过的filesystem bundle。OCI规定了如何下载OCI镜像并解压到OCI filesystem bundle,这样OCI runtime就可以运行OCI bundle了。OCI(当前)相当于规定了容器的images和runtime的协议,只要实现了OCI的容器就可以实现其兼容性和可移植性。implements中列出了部分OCI标准的实现。本文不讨论windows下的实现,具体参见Open Container Initiative Runtime Specification

system bundle是个目录,用于给runtime提供启动容器必备的配置文件和文件系统。标准的容器bundle包含以下内容:

config.json:该文件包含了容器运行的配置信息,该文件必须存在bundle的根目录,且名字必须为config.json
容器的根目录,可以由config.json中的root.path指定

下面使用runc来运行一个容器,runc是根据OCI标准生成的一个cli工具。前面两个命令用于提取filesystem,最后一个用于生成config.json,两者组织在一起就是一个filesystem bundle

# mkdir rootfs
# docker export $(docker create busybox) | tar -C rootfs -xvf -
# runc spec

  使用runc来运行这个bundle,可以使用state查看该容器的状态

# runc run busybox
# runc state busybox
{
  "ociVersion": "1.0.0",
  "id": "busybox",
  "pid": 41732,
  "status": "running",
  "bundle": "/home/test",
  "rootfs": "/home/test/rootfs",
  "created": "2018-12-25T14:41:58.82202891Z",
  "owner": ""

 

OCI runtime包含runtime,runtime-linux,config,config-linux

  • runtime规定了如下内容
    • state
      • ociVersion:创建容器时的OCI版本
      • id:容器唯一的ID
      • status:容器的runtime状态,可以为如下值
        • creating:容器正在被创建(lifecycle的第2步)
        • created:容器完成创建,但没有返回错误且没有执行用户程序(lifecycle的第2步之后)
        • running:容器正在执行用户程序且没有返回错误(lifecycle的第5步之后)
        • stoped:容器进程退出(lifecycle的第7步)
      • pid:host上看到的容器进程
      • bundle:host上容器bundle目录的绝对路径
      • annotation:容器相关的标注,可选

由于runc实现了OCI runtime,使用runc state查看上述busybox可以得到state相关的信息

{
   "ociVersion": "1.0.0",
    "id": "busybox",
    "pid": 41732,
    "status": "running",
    "bundle": "/home/test",
    "rootfs": "/home/test/rootfs",
    "created": "2018-12-25T14:41:58.82202891Z",
    "owner": ""
}
    • lifecycle 描述了容器从创建到退出的事件触发点
      1. OCI runtime的create调用与bundle的路径和id相关
      2. OCI runtime的必须依据config.json中的设置来创建环境,如果无法创建config.json中指定的环境,则返回错误。此阶段主要创建config.json中的资源,并没有执行用户程序。该步骤之后任何多config.json的修改都不会影响容器
      3. runtime使用容器的唯一id来执行start容器命令
      4. runtine必须执行 prestart hooks,如果 prestart hooks执行失败,则返回错误,并停止容器,执行第9条操作
      5. runtime必须执行用户程序
      6. runtime必须执行poststart hooks,如果poststart hooks执行失败,则必须记录warning日志,而poststart hooks和lifecycle继续运行
      7. 容器进程退出,可能由错误退出,人为退出,程序崩溃或runtime 执行kill命令引起
      8. runtime使用容器的唯一id来执行delete容器操作
      9. 如果在容器创建阶段(第2步)没有完成某些步骤,则容器必须被销毁
      10. runtime必须执行poststop hooks,如果poststop hooks执行失败,则必须记录warning日志,而poststop hooks和lifecycle继续运行
    • operation runtime必须支持如下操作
      • query state:state ,参见上述state描述
      • create:create ,runtime应该提供检测id唯一性的功能。该操作中会用到config.json除process之外的配置属性(因为process实在start阶段用到的)。实现中可能会与本规范不一致,如在create操作之前实现了pre-create
      • start:start ,执行config.json的process中定义的程序,如果process没有设定,则返回错误
      • kill:kill ,向一个非running状态的容器发送的信号会被忽略。此操作用于向容器进程发送信号
      • delete:delete ,尝试删除一个非stopped的容器会返回错误。容器删除后其id可能会被后续的容器使用
# runc delete busybox
cannot delete container busybox that is not stopped: running
    • hooks:定义了每个操作前后的动作,参见runtime configuration for hooks
  • configuration定义了进程运行,环境变量等配置。现有json和go版本的配置,其中go中定义了与平台(linux,solaris,windows相关的tag),如下:
// Linux is platform-specific configuration for Linux based containers.
Linux *Linux `json:"linux,omitempty" platform:"linux"`
// Solaris is platform-specific configuration for Solaris based containers.
Solaris *Solaris `json:"solaris,omitempty" platform:"solaris"`
// Windows is platform-specific configuration for Windows based containers.
Windows *Windows `json:"windows,omitempty" platform:"windows"`
// VM specifies configuration for virtual-machine-based containers.
VM *VM `json:"vm,omitempty" platform:"vm"`
    • Specification version:必选,指定了bundle使用的OCI的版本
    • root:
      • path:容器的bundle路径,可以是相对路径和绝对路径,该值通常为rootfs
      • readonly:当设置为true时,容器的根文件为只读,默认false
    • mount:按照配置的顺序进行挂载
      • destination:容器中的挂载点,必须是绝对路径
      • source:挂载的设备名称,文件或目录名称(bind mount时),当option中有bind或rbind时改mount类型为bind mount
      • option:mount的选项,参见mount
    • process:定义了容器的进程信息
      • terminal:默认false,为true时,linux系统会为该进程分配一个pseudoterminal(pts),并使用标准输入输出流
      • consoleSize:指定terminal的长宽规格,width和height
      • cwd:执行命令的绝对路径
      • env:环境变量
      • args:命令参数,至少需要指定一个参数,首参数即被execvp执行的文件

根据平台不同支持如下配置

POSIX process 支持设置POSIX和Linux平台

    • rlimits:设置进程的资源,如cpu,内存,文件大小等,参见getrlimit。docker里面使用--ulimit来设置单个进程的资源
      • type:linux和Solaris
      • soft:内核分配给该进程的资源
      • hard;可配置的资源的最大值,即soft的最大值。unprivileged进程(没有CAP_SYS_RESOURCE capability)可以将soft设置为0-hard之间的值

Linux process:

    • apparmorProfile:指定进程的apparmor文件
    • capabilities:指定进程的capabilities
    • noNewPrivileges:设置为true后可以防止进程获取额外的权限(如使得suid和文件capabilities失效),该标记位在内核4.10版本之后可以在/proc/$pid/status中查看NoNewPrivs的设置值。更多参见no_new_privs
    • oomScoreAdj :给进程设置oom_score_adj值,进程的oom涉及以下3个文件,oom_adj和oom_score_adj功能类似,oom_adj主要用于兼容老版本,oomScoreAdj的功能就是设置/proc/$PID/oom_score_adj中的值(范围-1000~1000),系统通过该值和oom_score来决定kill进程的优先级。oom_score为只读文件,oom通过对系统所有进程的oom_score进行排序,值越大,越可能在内存不足时被kill掉。(参见linux oom机制分析和oom介绍)
/proc/$PID/oom_adj
/proc/$PID/oom_score
/proc/$PID/oom_score_adj

可以通过如下命令查看系统所有进程的oom_score

ps -eo pid,comm,pmem --sort -rss | awk {"cat /proc/"$1"/oom_score" | getline oom; print $0"\t"oom}
    • selinuxLabel :设置进程的SELinux 标签,即MAC值
    • user 用于控制运行进程的用户
      • uid:指定容器命名空间的user id
      • gid:指定容器命名空间的group id
      • additionalGids:指定容器命名空间中附加的group id
    • hostname:指定容器进程看到的hostname
    • Platform-specific configuration:包含在linux,Windows,solaris,vm等host平台上使用namespaces,cgroup等。下面以linux为例
      • Default Filesystems:如下路径需要正确挂载到容器中,以便容器进程的正确执行
Path        Type
/proc       proc
/sys        sysfs
/dev/pts    devpts
/dev/shm    tmpfs
      • namespaces,为包含如下参数的数组
        • type:指定namespace类型,为ipc,mount,user,network,uts,pid,cgroup,如果没有指定namespace type,则继承父namespace的属性
        • path:namespace的文件,如果没有指定,则生成一个新的namespace
      • User namespace mappings,uidMappings和gidMappings指定了user和group从host到容器的映射关系,为结构图数组,包含containerid,hostid和size这3个属性
      • device:列出了必须在容器中存在的设备,为结构体数组,有如下属性
        • type:设备的类型
        • path:容器中的全路径
        • major, minor:设备的主设备号和次设备号,主设备号表示类型,次设备号表示分区,可以使用"ls -al /dev"查看主次设备号。设置可以参见device
        • fileMode:文件ADC访问权限
        • uid:容器中设备的uid
        • gid:容器中设备的gid
      • cgroup:用于控制容器的资源以及设备接入等。
        • Cgroups Path:cgroup的路径(待cgroup完善湖更新)
    • POSIX-platform Hooks:支持使用hooks来设置lifecycle中用户自定义动作
      • hooks
        • prestart:在用户程序运行前以及容器命名空间创建后执行,包含如下属性的数组:
          • path:类似execv的路径,为均对路径
          • args:类似execv的参数
          • env:环境变量
          • timeout:终端hooks的超时时间
        • poststart:在用户程序执行之后且在start步骤返回前执行,同 prestart的数组一样
        • poststop:在容器删除之后且在delete步骤返回前执行,同prestart的数组一样
    • Annotations:为key-value类型的任意字符串,如果没有annotation,该字段可以为空,也可以不存在
    • extensibility:遇到无法识别的字段需要返回错误
  • Linux Runtime:该规范规定了容器文件描述符相关的内容。默认下runtime只会打开stdin, stdout和stderr这3个文件描述符

 

runtime包含1, config.md, config-linux.md, and runtime-linux.md.

参考:

https://cizixs.com/2017/11/05/oci-and-runc/

https://github.com/opencontainers/runtime-spec/blob/master/config.md

https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go

docker OCI runtime(待完善)


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
顽童0006_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有