runc的安装与使用

安装runc

其中安装runc之前要保证系统上安装了 Go 语言开发环境

参考文章:
ubuntu系统下go环境安装

[Go语言]Go开发环境搭建 —— Linux&Ubuntu

1.访问 Go官网 查看最新版本号(例如 1.24.5)

访问 Go官网 查看最新版本号

2.下载并且安装

wget https://dl.google.com/go/go1.24.5.linux-amd64.tar.gz # 可以自行替换版本号
sudo tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz

3.配置环境变量

Go的核心环境变量需要配置到用户或系统的bash配置中(这里以当前用户为例):

打开bash配置文件

vim ~/.bashrc

在文件末尾添加以下内容(根据你的实际路径调整):

Go环境变量

export GOROOT=/usr/local/go       # Go安装根目录(一般不需要修改)
export GOPATH=$HOME/go            # Go工作区(存放项目和依赖)
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH  # 将Go工具和项目可执行文件加入PATH

其中我的$HOME的地址是/home/fanbao

保存后执行以下命令使配置生效:

source ~/.bashrc  # 重启终端

4.验证安装

检查Go版本,确认安装成功:

fanbao@sea:/home$ go version
go version go1.24.5 linux/amd64

5.配置国内代理(加速依赖下载)​

国内访问Go官方仓库较慢,建议配置代理(如阿里云、七牛云):

设置全局代理(推荐)

go env -w GOPROXY=https://goproxy.cn,direct

安装runc

出现的问题

1.当执行sudo make install时,报错如下

fanbao@sea:~/go/src/github.com/opencontainers/runc$ sudo make install
/bin/bash: 行 1: go: 未找到命令
install -D -m0755 runc /usr/local/sbin/runc

说明sudo make install 运行时找不到 go 命令,但后面这句:

install -D -m0755 runc /usr/local/sbin/runc

其实是已经执行成功了,也就是说 runc 已经被安装到了 /usr/local/sbin/runc

检查是否安装成功:

fanbao@sea:~/go/src/github.com/opencontainers/runc$ runc --version
runc version 1.3.0-rc.1+dev
commit: v1.3.0-rc.1-187-g34c64e2a
spec: 1.2.1+dev
go: go1.24.5
libseccomp: 2.5.3

参考文章:
runc使用教程
探索runc

使用runc

创建runc容器的最小可运行单元

创建一个OCI Bundle

OCI Bundle(Open Container Initiative Bundle)是指满足OCI标准的一系列文件,这些文件包含了运行容器所需要的所有数据,它们存放在一个共同的目录,该目录包含以下两项:

container 的 root filesystem
config.json:包含容器运行的配置数据

创建容器的根文件系统

docker pull busybox             //Docker 会从官方仓库下载最新版 busybox:latest 镜像
mkdir -p /tmp/mycontainer/rootfs
cd /tmp/mycontainer
docker export $(docker create busybox) | tar -C rootfs -xvf -

busybox:

  • BusyBox = 迷你版的 GNU/Linux 工具箱,比如 ls、cp、sh、ping、tar 等都被打包进一个不到 1MB 的可执行文件
  • BusyBox 的“文件系统”实际上就是一个极简 Linux 根文件系统(rootfs),它被打包在镜像里,只包含运行 BusyBox 所需的最小文件集合。你可以把它看作一个超小的 Linux 用户空间,没有 systemd、没有包管理器,甚至没有 glibc(通常用 musl 或 uClibc)

遇到的问题

这里docker pull busybox拉取太慢,老是拉取失败,把 /etc/docker/daemon.json 里改成多个国内镜像,首推“DaoCloud+中科大”组合(2024-08 验证有效)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerproxy.com",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

然后通过重启生效

sudo systemctl daemon-reload && sudo systemctl restart docker

验证并且重新拉取

docker info | grep -i "registry mirrors"   # 看到配置的地址即生效
docker pull busybox                        # 再拉就快了

关键指令解析

docker export $(docker create busybox) | tar -C rootfs -xvf -
内容 含义
docker create busybox 从镜像 busybox 创建一个未启动的容器,返回容器 ID(只创建不运行)
$(...) shell 命令替换,把容器 ID 传给后面的 docker export
docker export <容器ID> 将该容器的整个文件系统导出为一个 tar 归档,输出到标准输出(stdout)
tar -C rootfs -xvf - 把从 stdin(-)收到的 tar 包解压到 rootfs/ 目录下

完成后,rootfs/ 目录就会包含 BusyBox 的根文件系统,比如:
复制

rootfs/
├── bin/
│   ├── ls
│   ├── sh
│   └── ...
├── etc/
├── lib/
└── ...

创建config.json文件

有了root filesystem,还需要config.json,runc spec可以生成一个基础模板,之后我们可以在模板基础上进行修改

runc spec

config.json 文件的内容都是 OCI Container Runtime 的订制,其中每一项值都可以在Runtime Spec找到具体含义,OCI Container Runtime 支持多种平台,因此其 Spec 也分为通用部分(在config.md中描述)以及平台相关的部分(如linux平台上就是config-linux)

  • process:指定容器启动后运行的进程运行环境,其中最重要的的子项就是args,它指定要运行的可执行程序, 在上面的修改后的模板中,我们将其改成了"sleep 5"
  • root:指定容器的根文件系统,其中path子项是指向前面导出的中root filesystem的路径
  • linux: 这一项是平台相关的。其中namespaces表示新创建的容器会额外创建或使用的namespace的类型

这里修改terminal和args的内容,不开启终端,执行命令休眠五秒:

	"process": {
        "terminal":false,     <--  这里改为 true
		"user": {
			"uid": 0,
			"gid": 0
		},
		"args": [
			"sh"               <-- 这里改为 "sleep","5"
		],

运行容器

创建

cd /mycontainer
sudo runc create mybox    //这里如果不用sudo无法执行,当前用户想以非 root 身份运行 runc,但内核/系统尚未开启或未正确配置 user namespace,因此 runc 拒绝启动

想要在非root用户下创建容器,则要设置user namespace,这里先不涉及

查看

sudo runc list       //这里也要用sudo,如果用runc list ,结果则为空(因为普通用户看不到 root 的容器)

ID          PID         STATUS      BUNDLE                         CREATED                          OWNER
mybox       36739       created     /home/fanbao/tmp/mycontainer   2025-07-21T05:50:28.931351145Z   root

启动

sudo runc start mybox

启动后5秒内查看列表显示状态为running

fanbao@sea:~/tmp/mycontainer$ sudo runc list
ID          PID         STATUS      BUNDLE                         CREATED                          OWNER
mybox       36739       running     /home/fanbao/tmp/mycontainer   2025-07-21T05:50:28.931351145Z   root

启动后五秒后再次查看列表显示状态为stopped

fanbao@sea:~/tmp/mycontainer$ sudo runc list
ID          PID         STATUS      BUNDLE                         CREATED                          OWNER
mybox       0           stopped     /home/fanbao/tmp/mycontainer   2025-07-21T05:50:28.931351145Z   root

删除

sudo runc delete mybox

这里参考博客

posted @ 2025-07-21 14:22  爱吃鸡魔人zf  阅读(181)  评论(0)    收藏  举报