xiaohanliang
Docker
Docker
  • hi
  • STORAGE DRIVER
    • 1. 什么叫联合挂载
    • 2. 镜像ID是从哪来的
    • 3. 如何组装出一个镜像
    • 4. 为什么有这么多fs@aufs
    • 5. 为什么有这么多fs@overlay
    • 6. 为什么有这么多fs@dm
    • 7. 正确安装devicemapper
  • EXEC DRIVER
    • 1. 资源限制-cgroup
    • 2. 制造小型监狱
    • 3. 切换根目录是什么概念
    • 4. 标准极简容器runC
    • 5. 尝试安装runc工具
  • KUBERNETES NETWORK
    • 0. [WIP]我想串联容器网络的故事
    • 1. 容器网络是什么样的网络
    • 2. cnm认为应该怎样让容器组网
    • 3. 为什么会有一大堆cni插件
    • 4. 为什么要设计出pod
    • 5. 怎样形成一个服务
    • 6. Service就是iptables规则
    • 7. IPVS也能实现Service
    • 8. 从集群外访问服务-nodeport
    • 9. 从集群外访问服务-ingress
    • 10. 想要把域名变成IP
    • 11. DNS是怎么实现的
    • 12. 最常见的方案@flannel
    • 13. 使用tun设备封包@flannel
    • 14. 使用vxlan设备封包@flannel
    • 15. 可不可以不封包@flannel
Powered by GitBook
On this page
  • 安装
  • 准备原材料
  • 开始运行

Was this helpful?

  1. EXEC DRIVER

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
Previous4. 标准极简容器runCNext0. [WIP]我想串联容器网络的故事

Last updated 4 years ago

Was this helpful?