runc中文翻译系列一 runc入门

runc 是一个 CLI 工具,用于根据 OCI 规范在 Linux 上孕育和运行容器。

发布

你可以在 release 页面找到 runc 的正式发布版本。

构建

runc 仅支持 Linux。它必须使用 Go 1.19 或更高版本构建。

为了启用 seccomp 支持,你需要在你的平台上安装 libseccomp

例如 CentOS 的 libseccomp-devel 或 Ubuntu 的 libseccomp-dev

# 在 GOPATH/src 中创建 "github.com/opencontainers
cd github.com/opencontainers
git clone https://github.com/opencontainers/runc
cd runcmake
sudo make install

你也可以使用 go get 安装到你的 GOPATH,前提是你已经在 src 下创建了一个 github.com 父文件夹:

go get github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make
sudo make install

runc将被安装到系统中的/usr/local/sbin/runc`。

编译标志

runc 支持可选的编译标志,以编译支持各种特性、其中一些标签默认已启用(参见顶级 Makefile 中的 BUILDTAGS)。要更改默认的联编标志,请为 make 设置 BUILDTAGS 变量、例如,禁用 seccomp:

make BUILDTAGS=""
构建标志特性默认开启依赖
seccomp使用 libseccomp 过滤系统调用。libseccomp
!runc_nodmz通过使用小型 C 二进制文件减少 CVE-2019-5736 保护的内存使用量,[更多详情请参见 memfd-bind][contrib-memfd-bind]。runc_nodmz 会禁用此功能,并导致 runc 使用不同的保护机制,这将在容器启动期间暂时进一步增加内存使用量。也可以通过设置 RUNC_DMZ=legacy 环境变量在运行时禁用此功能。
runc_dmz_selinux_nocompat禁用 SELinux DMZ 解决方法(新发行版应设置此项)。详情请参阅 [dmz README] 。

以下构建标记曾在早期使用,但现已过时:

  • nokmem(自 runc v1.0.0-rc94 版起内核内存设置被忽略)
  • apparmor(自 runc v1.0.0-rc93,该功能始终处于启用状态)
  • selinux(自 runc v1.0.0-rc93 起始终启用该功能)

contrib-memfd-bind

dmz README

运行测试套件

runc 目前支持通过 Docker 运行测试套件。要运行测试套件,只需键入 make test

make test

有一些额外的 make target 可用于在容器外运行测试,但不建议这样做,因为编写测试时希望它们能在任何地方写入和删除。

你可以通过设置 TESTFLAGS 变量来运行特定的测试用例。

# make test TESTFLAGS="-run=SomeTestFunction"

您可以通过设置 TESTPATH 变量来运行特定的集成测试。

# make test TESTPATH="/checkpoint.bats"

通过设置 ROOTLESS_TESTPATH 变量,可以运行特定的无根集成测试。

# make test ROOTLESS_TESTPATH="/checkpoint.bats"

您可以通过设置 CONTAINER_ENGINE_BUILD_FLAGSCONTAINER_ENGINE_RUN_FLAGS 变量,使用容器引擎的标志运行测试。

# make test CONTAINER_ENGINE_BUILD_FLAGS="--build-arg http_proxy=http://yourproxy/" CONTAINER_ENGINE_RUN_FLAGS="-e http_proxy=http://yourproxy/"

依赖关系管理

runc 使用 Go Modules 进行依赖管理。请参阅 Go Modules,了解如何添加或更新新的依赖项。

# 更新供应商依赖关系
make vendor
# 验证全部依赖
make verify-dependencies

使用 runc

请注意,runc 是一个低级工具,在设计时并没有考虑最终用户的需求。。它主要由其他更高级别的容器软件使用。

因此,除非有某些特定用例阻止使用Docker 或 Podman 等工具,否则不建议直接使用 runc。

如果你仍然想使用 runc,下面是使用方法。

创建 OCI Bundle

要使用 runc,你的容器必须是 OCI Bundle格式。如果你已经安装了 Docker,可以使用它的 export 方法从现有的 Docker 容器中获取根文件系统。

# 创建最顶层的目录
mkdir /mycontainer
cd /mycontainer# 创建rootfs目录
mkdir rootfs# 通过docker把busybox导出到rootfs目录
docker export $(docker create busybox) | tar -C rootfs -xvf -

在填充根文件系统后,您只需在 bundle 中以 config.json 文件的格式生成规范。runc 提供了一个 spec 命令来生成基本模板规范,然后您就可以对其进行编辑。
要查找规范中字段的功能和文档,请参阅 specs 资源库。

runc spec
运行容器

假设你在上一步中获得了一个 OCI Bundle,你可以用两种不同的方式执行容器。

第一种方式是使用便捷命令 run,它将处理容器的创建、启动和退出后的删除。

# 以root用户运行
cd /mycontainer
runc run mycontainerid

如果你使用未修改的 runc spec 模板,就会在容器内生成一个 sh 会话。

启动容器的第二种方法是使用规范生命周期操作。这使您对容器运行时的创建和管理方式拥有更多权力。这也将在后台启动容器,因此您必须编辑config.json,删除下面简单示例中的 terminal 设置。请参阅 runc 终端处理 的更多详情。
您在 config.json 中的进程字段应该如下所示,其中包含 "terminal": false"args": ["sleep", "5"]

        "process": {"terminal": false,"user": {"uid": 0,"gid": 0},"args": ["sleep", "5"],"env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","TERM=xterm"],"cwd": "/","capabilities": {"bounding": ["CAP_AUDIT_WRITE","CAP_KILL","CAP_NET_BIND_SERVICE"],"effective": ["CAP_AUDIT_WRITE","CAP_KILL","CAP_NET_BIND_SERVICE"],"inheritable": ["CAP_AUDIT_WRITE","CAP_KILL","CAP_NET_BIND_SERVICE"],"permitted": ["CAP_AUDIT_WRITE","CAP_KILL","CAP_NET_BIND_SERVICE"],"ambient": ["CAP_AUDIT_WRITE","CAP_KILL","CAP_NET_BIND_SERVICE"]},"rlimits": [{"type": "RLIMIT_NOFILE","hard": 1024,"soft": 1024}],"noNewPrivileges": true},

现在,我们可以在 shell 中进行生命周期操作了。

# 以root用户身份运行
cd /mycontainer
runc create mycontainerid# 查看容器是否已创建并处于 "created "状态
runc list# 启动容器内的进程
runc start mycontainerid# 5 秒后查看容器是否已退出并处于停止状态
runc list# 现在删除容器
runc delete mycontainerid

这样,高层系统就可以在容器创建后和/或删除前设置各种设置,从而增强容器的创建逻辑。例如,容器的网络堆栈通常是在 "创建 "之后但在 "启动 "之前设置的。

无 root 权限的容器

runc 可以在没有 root 权限的情况下运行容器。这被称为 rootless。要运行无根容器,需要向 runc 传递一些参数。请参见下文并与之前的版本进行比较。

注意: 要使用此功能,必须在内核中编译并启用 “User Namespace”。根据发行版的不同,有多种方法可以做到这一点:

  • 确认内核配置中设置了 CONFIG_USER_NS=y(通常在 /proc/config.gz)。
  • Arch/Debian: echo 1 > /proc/sys/kernel/unprivileged_userns_clone.
  • RHEL/CentOS 7: echo 28633 > /proc/sys/user/max_user_namespaces `.
    以普通用户身份运行以下命令:
# 和第一个例子一样
mkdir ~/mycontainer
cd ~/mycontainer
mkdir rootfs
docker export $(docker create busybox) | tar -C rootfs -xvf -# --rootless参数指示 runc spec 生成无根容器的配置,这将允许你以非 root 用# 户身份运行容器。
runc spec --rootless# 根参数告诉 runc 在哪里存储容器状态。用户必须可以写入目录。
runc --root /tmp/runc run mycontainerid
监督

runc 可以与进程监管程序和 init 系统一起使用,以确保容器在退出时重新启动。
systemd 单元文件的示例如下。

[Unit]
Description=Start My Container[Service]
Type=forking
ExecStart=/usr/local/sbin/runc run -d --pid-file /run/mycontainerid.pid mycontainerid
ExecStopPost=/usr/local/sbin/runc delete mycontainerid
WorkingDirectory=/mycontainer
PIDFile=/run/mycontainerid.pid[Install]
WantedBy=multi-user.target

更多文档

  • 规格一致性
  • cgroup v2
  • 检查点和恢复
  • systemd cgroup 驱动程序
  • 终端和标准 IO
  • 实验功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

磁盘database数据恢复: ddrescue,dd和Android 设备的数据拷贝

ddrescue和dd 区别: GNU ddrescue 不是 dd 的衍生物,也与 dd 没有任何关系 除了两者都可用于将数据从一台设备复制到另一台设备。 关键的区别在于 ddrescue 使用复杂的算法来复制 来自故障驱动器的数据,尽可能少地造成额外的损坏。ddrescue…

AutoSAR(基础入门篇)9.3-通信相关机制

目录 一、Signal Groups 二、Update Bit 三、Notification Mechanisms 四、Deadline Monitoring 1、超时监控

mysql8.0.36主从复制(读写分离)配置教程

1、关闭防火墙 使用命令行关闭防火墙 在Ubuntu系统中,可以使用以下命令关闭防火墙: sudo ufw disable执行该命令后,系统会提示是否要关闭防火墙,确认后即可关闭防火墙。 查看防火墙状态 使用以下命令可以查看防火墙当前的状…

敏捷软件开发价值观和原则重温

敏捷软件开发宣言 个体和交互胜过过程和工具可以工作的软件胜过面面俱到的文档客户合作胜过合同谈判响应变化胜过遵循计划 个体和交互胜过过程和工具 软件开发是人的活动,人是软件开发中最重要的因素。如果没有优秀的成员,再好的过程也无法挽救项目。…

OpenVDB Cookbook 笔记

目录 Hello WorldCreating and writing a gridPopulating a grid with valuesReading and modifying a gridStream I/OHandling metadataAdding metadataRetrieving metadataRemoving metadata IterationNode IteratorLeaf Node IteratorValue IteratorIterator Range Interpol…

Vegeta压测工具学习与使用

Vegeta压测工具学习与使用 目标: 能够在命令行下使用Vegeta对指定API进行测试了解如何导出结果,以及能获得什么样的结果(P99,P99.9,QPS)探索能否导出其他结果,是否能够执行复杂命令或简易脚本等 时间比较紧迫,预计两到三个小时内完…

详解tomcat中的jmx监控

目录 1.概述 2.如何开启tomcat的JMX 3.tomcat如何实现JMX的源码分析 1.概述 本文是博主JAVA监控技术系列文章的第二篇,前面一篇文章中我们介绍了JAVA监控技术的基石——jmx: 【JMX】JAVA监控的基石-CSDN博客 本文我们将从使用和源码实现两个方面聊…

BLDC驱动刹车电路、能量泄放电路

不同STM32的性能; APM2.8飞控整合资料: APM2.8飞控说明书 GitBook BLDC的制动首先要考虑MOS的泄放电阻的选择,参考前面博客。 刹车电阻制动: 如图所示就是一种通过功率电阻耗散电机制动过程中产生电能的电路。因为功率电阻在这个电路中起…

【AI视野·今日Robot 机器人论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 17 Jan 2024 Totally 49 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Safe Mission-Level Path Planning for Exploration of Lunar Shadowed Regions by a Solar-Powered Rover Authors Olivier L…

【并发编程】ThreadPoolExecutor类

📝个人主页:五敷有你 🔥系列专栏:并发编程⛺️稳重求进,晒太阳 ThreadPoolExecutor 1) 线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量 状态名 高三位 …

rtt设备io框架面向对象学习-uart设备

目录 1.uart设备基类2.uart设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.uart设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的serial.h定义了如下uart设备基类 struc…

Transformer实战-系列教程18:DETR 源码解读5(BackboneBase类/Backbone类)

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1(项目配置/CocoDetection类) …

我的NPI项目之嵌入式总线系列(一) -- SPI 接口

如我的NPI项目之Android 安全系列 -- 外挂SE集成(SPI)接口-CSDN博客 提到SPI的接口,基本的电气特性已经给出。这边文章就针对协议部分进行详细解析。从协议网找到了原文:SPI protocol 还有wilipedia SPI 主要涉及一下几个方面&a…

bat 定时收缩sqlserver2017

如果你希望使用批处理(.bat)文件来定时收缩SQL Server的数据库,你可以编写一个脚本来执行这个任务。但首先,需要注意的是,定期收缩数据库通常不是一个好的做法,因为它可能会对性能产生负面影响,…

全闭环直播推流桌面分享远控系统

直播推流涉及多协议,多端技术栈和知识点,,想要做好并不容易,经过几年时间的迭代,终于小有成就,聚集了媒体服务器,实时会议sfu,远控kvm等功能。可以做一个音视频应用的瑞士小军刀。主…

详解Vue文件结构+实现一个简单案例

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

测试开发-2-概念篇

文章目录 衡量软件测试结果的依据—需求1.需求的概念2.从软件测试人员角度看需求3.为什么需求对软件测试人员如此重要4.如何才可以深入理解被测试软件的需求5.测试用例的概念6.软件错误(BUG)的概念7.开发模型和测试模型8.软件的生命周期9.瀑布模型&#…

MATLAB知识点:randperm函数(★★★★★)将一个数字序列进行随机打乱

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第…

Codeforces Round 923 - A.B.C.D

文章目录 A. Make it WhiteB. Following the StringC.Choose the Different Ones!D. Find the Different Ones! A. Make it White #include<bits/stdc.h>using namespace std;void solve() {int n;cin >> n;string s; cin >> s;int flag 0;int x 0, y -1…

django中admin页面汉化

在Django中&#xff0c;将admin界面汉化为中文需要进行一些配置和翻译文件的添加。下面是一个基本的步骤指南&#xff0c;帮助你实现Django admin的汉化&#xff1a; 一&#xff1a;安装并配置Django: 如果你还没有安装Django&#xff0c;首先通过pip安装它&#xff1a; pip…