安装
不折腾, 那是不可能的, 无论遇到什么, 折腾就完事儿了. 我们第一步是安装 runc 这个命令行工具 (网上很多教程其实已经过时了), 我们先安装它吧
# Golang要支持Gomod, 最新版runc用gomod模式编译
# 没安装的去 studygolang.com/dl 下载, 速度飞快
$ go version
go version go1.15.4 linux/amd64
# 下载并安装, 可能会遇到libseccomp.pc找不到的问题
# 使用 sudo apt install libseccomp-dev 安装
$ git clone https://github.com/opencontainers/runc
$ make
$ make install
# 试试看安装好了吗
$ runc -v
runc version 1.0.0-rc92+dev
准备原材料
按照上一章的要求, 起一个容器需要有rootfs, 这里图方便我们就从镜像里导出来一份现成的了, 你要想折腾你也可以自己整
# 这里为什么用create/export的方式, 而不用 docker save
# 因为 docker save 是把镜像导出来, 拿到手的还是一些镜像层
# 而create/export就能整出一个完整的容器内目录, 有区别的
$ docker create busybox:latest
4eb04316774a840a19d547873327ac
$ docker export 4eb0 > busybox.tar
# 按照要求, 我们需要准备一个名为rootfs的文件夹, 搞出一个工作目录
$ mkdir -p runc/rootfs && cd runc
# 你看这里是容器内的文件目录, 跟镜像还是有区别的
$ tar -C rootfs -xvf busybox.tar && ls
bin dev etc home proc root sys tmp usr var
除去rootfs 我们还要求了 config.json文件, spec可以自动给你整上一个模板文件, 没有多高级但是至少能直接拿来用, 如果你还想折腾, 可以折腾折腾这个config.json文件
# 生成配置文件
$ runc spec && ls
config.json rootfs
开始运行
$ runc run xiaohan
/ $ pwd
/ $ ps -a
PID USER TIME COMMAND
1 root 0:00 sh
8 root 0:00 ps -a
/ $ env
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
非常赞哦, 我们已经在一个自制容器里了, 这个容器并不是从Docker起的, 而是从一个容器引擎起的. 也许这可能是我们手动起的第一个非Docker容器, 重新开一个 tty, 看看这个容器咋样了
# 看到了我们刚刚起的名为 xiaohan 的容器, 状态是运行中
# 容器内的初始进程, 在宿主机上显示为18078
# 挂载的路径为 /root/runc/busybox
$ runc list
ID PID STATUS BUNDLE OWNER
xiaohan 18078 running /root/runc/busybox root
$ ps -ax | grep 18078
18078 pts/0 Ss+ 0:00 sh