当前位置: 首页 > news >正文

OCI制作

1.制作OCI包并运行容器


容器镜像本质上就是一个根文件系统镜像。但容器镜像又不仅仅是一个根文件系统镜像,容器镜像有一个OCI标准规范,而runc命令用于运行根据OCI规范打包的应用程序,也就是说,runc命令是OCI规范的兼容实现。
OCI容器镜像是堆叠起来的根文件系统和config.json配置文件的捆绑(bundle),如图11-5所示。runc 命令符合OCI规范(具体来说,是runtime-spec),这意味着runc命令可以使用OCI镜像创建并运行一个容器。值得一提的是,创建并运行一个容器并不需要知道根文件系统是一个单层的普通文件系统,还是一个堆叠起来的根文件系统,因为不管是单层还是多层都会合并为一个容器层(container layer)根文件系统。换句话说,OCI包只是根文件系统和config.json配置文件的捆绑。层、标签、容器注册表和存储库等功能都不是OCI包(甚至容器运行时)规范的一部分。

图11-5 OCI容器镜像构成示意图
有一个单独的OCI-spec(image-spec)定义OCI镜像(OCI image)。OCI镜像是一种堆叠起来的文件系统,多层文件目录合并起来形成所需的根文件系统,多个层之间有依赖关系,这种依赖关系称为父子关系,被依赖的层为父层(parent)。底层文件系统往往都是只读的,容器在运行过程中系统只能修改最上层的可读写文件系统。
具体来说,从一个比较高层次的角度来看这个OCI镜像规范,一个镜像由4部分组成—— Manifest、Image Index(可选)、Layers、Configuration。Manifest包括镜像内容的元信息和镜像层(Layers)的摘要信息,这些镜像层可以解包部署成最后的运行环境。Image Index则从更高的角度描述了Manifest,主要应用于镜像跨平台。Configuration则包含了应用的参数环境。这些OCI镜像规范的主要目的是统一各种容器工具的镜像格式,让标准镜像能够在多种容器软件下使用。篇幅所限,这里不详述OCI镜像规范的细节。
OCI镜像、OCI包和OCI容器运行时如图11-6所示,OCI镜像可以解包(unpack)成OCI包,OCI容器运行时工具(比如runc)可以将OCI包在容器中运行起来。

图11-6 OCI镜像、OCI包和OCI容器运行时
制作OCI镜像的方法在11.4节介绍,这里仅给出一个简便的制作OCI包并运行容器的做法,提供如下命令仅供参考。

$ sudo apt install docker.io # 可以通过安装docker获得runc命令
$ mkdir oci-bundle
$ cd oci-bundle
~/oci-bundle $ wget https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-minirootfs-3.15.1-x86_64.tar.gz
~/oci-bundle $ mkdir rootfs
~/oci-bundle $ cd rootfs
~/oci-bundle/rootfs$ tar -zxvf ../alpine-minirootfs-3.15.1-x86_64.tar.gz
~/oci-bundle/rootfs$ ls
bin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
~/oci-bundle/rootfs$ cd ..
~/oci-bundle $ runc spec # 生成一个config.json文件
~/oci-bundle $ ls
alpine-minirootfs-3.15.1-x86_64.tar.gz  config.json  rootfs
~/oci-bundle $ sudo runc run test
/ # ls
bin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


借助runc spec命令生成config.json文件,从而将一个rootfs根文件系统做成OCI包,这时通过sudo runc run test命令运行一个容器。
runc符合OCI规范,可以生成OCI包,并可以通过调用namespace相关系统调用创建和运行容器。

相关文章:

  • Perl安装教程
  • Python基础入门例程50-NP50 程序员节(循环语句)
  • Vue3-Pinia快速入门
  • DB-GPT介绍
  • C++性能优化笔记-6-C++元素的效率差异-7-类型转换
  • 吴恩达《机器学习》4-6->4-7:正规方程
  • MacOS安装homebrew
  • 2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消
  • k8spod详解其二
  • 1-Docker虚拟化平台技术概述及简介
  • 大数据毕业设计选题推荐-智慧小区大数据平台-Hadoop-Spark-Hive
  • javaee实验:搭建maven+spring boot开发环境,开发“Hello,Spring Boot”应用
  • 栈相关代码
  • [hive]中的字段的数据类型有哪些
  • 关于ROS的网络通讯方式TCP/UDP
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 0基础学习移动端适配
  • gitlab-ci配置详解(一)
  • MySQL主从复制读写分离及奇怪的问题
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • NSTimer学习笔记
  • Twitter赢在开放,三年创造奇迹
  • ViewService——一种保证客户端与服务端同步的方法
  • WePY 在小程序性能调优上做出的探究
  • 动态魔术使用DBMS_SQL
  • 服务器从安装到部署全过程(二)
  • 前端
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 算法-插入排序
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序填坑清单
  • 线上 python http server profile 实践
  • 小而合理的前端理论:rscss和rsjs
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • #13 yum、编译安装与sed命令的使用
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #HarmonyOS:Web组件的使用
  • #if #elif #endif
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)斐波那契Fabonacci函数
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (译)2019年前端性能优化清单 — 下篇
  • (转)创业的注意事项
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • . Flume面试题
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net Core 中间件验签
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 事件模型教程(二)
  • .Net 应用中使用dot trace进行性能诊断
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net6使用WebSocket与前端进行通信