5. 尝试安装runc工具

安装

不折腾, 那是不可能的, 无论遇到什么, 折腾就完事儿了. 我们第一步是安装 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

Last updated

Was this helpful?