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容器的最小可运行单元
创建一个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
这里参考博客

浙公网安备 33010602011771号