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
  • introduction
  • 我们希望这个引擎能够:

Was this helpful?

  1. EXEC DRIVER

4. 标准极简容器runC

introduction

这玩意儿是啥, 有点神秘 , 名字带run都有点神秘, 神秘 (神必). 现在你知道 (顿), 容器相关的神奇表现是怎么搞出来的, 但你也知道 (顿), 这些是我们自己打的草稿, 离真正的docker, 架构那些设计, 还有一些距离. 我想弥补这些距离, 讲真的, 我想弥补这些距离

  1. linux, 提供了一些可以拿来隔离的手段

  2. libcontainer, 包装了这些手段, 然后你调用库函数就能实现隔离

  3. runC, 包装了这个库, 变成了一个启停容器的命令行的工具

  4. docker, 包装了runC, 变成了一个特性丰富的, 管容器的, 命令行的工具

为什么呢? 你要包装一下LinuxAPI方便docker调用我可以理解, 但为什么要做出两套命令行工具呢? 原因是某一天大家觉得容器真好用, 于是每家就都想自己做出一套自己的容器, 整出自己的"Docker". 可是这样不行, 容器引擎五花八门就跟铁轨修的乱七八糟一样麻烦. 于是就找来几家大佬, 说你们自研没问题, 但我们得符合一些容器规范, 于是我们就有了Open Container Format规范, Docker说好的我提供一种引擎能起容器, 也符合这套规范, 于是就有了runC

我们希望这个引擎能够:

那么关于这套标准, 他是这样说的: 我们希望这个引擎能不受硬件制约, 无论在任何架构上, 你的引擎都能起出一模一样的容器. 同时我们希望你的引擎应该老老实实的做好一个引擎该做的事, 无论是什么客户端, 无论是任何编排工具来了都能通过调你接口起容器. 标准里, 启动一个容器需要的材料包含:

  • config.json , 配置文件 : 比如环境变量, 初始(pid=0)进程的运行参数, 配置信息, 是否绑定终端, 内存限制, 文件系统的挂载点设置, 支持设置容器运行前/后执行的脚本文件(钩子)

  • rootfs, 包含 /bin, /lib等, 值得一提, 为了能起容器我们其实只要求rootfs下包含所需要的目录与文件, 但是并没有要求过镜像. 镜像这种特性其实是docker为了方便存储rootfs自己想出来的, runC作为纯粹的容器引擎, 没有

👆除去上面用于启动一个容器的文件, 我们还需要为每个容器生成一个名为 state.json 的文件, 用于记录容器的运行状态. 里面包含有 容器ID, pid 等.

Previous3. 切换根目录是什么概念Next5. 尝试安装runc工具

Last updated 4 years ago

Was this helpful?