鸟瞰容器生态系统

一谈到容器,大家都会想到 Docker。

Docker 现在几乎是容器的代名词。确实,是 Docker 将容器技术发扬光大。同时,大家也需要知道围绕 Docker 还有一个生态系统。Docker 是这个生态系统的基石,但完善的生态系统才是保障 Docker 以及容器技术能够真正健康发展的决定因素。

大致来看,容器生态系统包含核心技术、平台技术和支持技术。

下面分别介绍。

容器核心技术

容器核心技术是指能够让 container 在 host 上运行起来的那些技术。

这些技术包括容器规范、容器 runtime、容器管理工具、容器定义工具、Registry 以及 容器 OS,下面分别介绍。

容器规范

容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。

目前 OCI 发布了两个规范:runtime spec 和 image format spec。
有了这两个规范,不同组织和厂商开发的容器能够在不同的 runtime 上运行。这样就保证了容器的可移植性和互操作性。

容器 runtime

runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。

如果大家用过 Java,可以这样来理解 runtime 与容器的关系:

Java 程序就好比是容器,JVM 则好比是 runtime。JVM 为 Java 程序提供运行环境。同样的道理,容器只有在 runtime 中才能运行。

lxc、runc 和 rkt 是目前主流的三种容器 runtime。

lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。

runc 是 Docker 自己开发的容器 runtime,符合 oci 规范,也是现在 Docker 的默认 runtime。

rkt 是 CoreOS 开发的容器 runtime,符合 oci 规范,因而能够运行 Docker 的容器。

容器管理工具

光有 runtime 还不够,用户得有工具来管理容器啊。容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。这就好比除了 JVM,还得提供 java 命令让用户能够启停应用不是。

lxd 是 lxc 对应的管理工具。

runc 的管理工具是 docker engine。docker engine 包含后台 deamon 和 cli 两个部分。我们通常提到 Docker,一般就是指的 docker engine。

rkt 的管理工具是 rkt cli。

容器定义工具

容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。

docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。

dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。

ACI (App Container Image) 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。

Registry

容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。

企业可以用 Docker Registry 构建私有的 Registry。

Docker Hub(https://hub.docker.com )是 Docker 为公众提供的托管 Registry,上面有很多现成的 image,为 Docker 用户提供了极大的便利。

Quay.io(https://quay.io/  )是另一个公共托管 Registry,提供与 Docker Hub 类似的服务。

容器 OS

由于有容器 runtime,几乎所有的 Linux、MAC OS 和 Windows 都可以运行容器。但这不并没有妨碍容器 OS 的问世。

容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。

目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表。

最新文章

  1. CodeForces - 274B Zero Tree
  2. android:TableLayout表格布局详解
  3. C++ char*,const char*,string的相互转换
  4. PLSQL 设置
  5. ADO
  6. ios registerNib: and registerClass:
  7. Web前端浏览器兼容初探
  8. Ubuntu安装与初始配置
  9. OSC本地库推送到远程库
  10. javascript 工作必知(四) 类型转换
  11. [HDU 1973]--Prime Path(BFS,素数表)
  12. __NSAutoreleaseNoPool(): ... utoreleased with no pool in place - just leaking
  13. 聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计
  14. java 读取excel(Map结构)xls
  15. Chrome浏览器扩展开发系列之十九:扩展开发示例
  16. VIM的字符编码设置
  17. 深入浅出Hadoop之mapreduce
  18. sql server 查询当前月份日期列表数据
  19. python3 bytes数据类型探讨
  20. 非post请求时整个url作为参数传递出现bug

热门文章

  1. JRE和JVM的区别
  2. centos7.5部署ELk
  3. CDN技术之-介绍
  4. 常用跨域方法总结(2)——CORS
  5. python find()函数
  6. 重写__eq__函数——对象list中使用in index()——获得list中不同属性对象个数
  7. CTF 密码学(一)
  8. intellij IDEA2016如何打可执行的jar包
  9. textarea高度随文本内容变化,且不出现滚动条
  10. 转 Jmeter参数化--Post请求的Post body 参数化