PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家。
说起生态,不禁让人想起贾跃亭的乐视,想当初我多次被它的生态布局给震撼到,一度相信它将要超越百度,坐拥互联网三大江山的宝座,但没过时日,各种劲爆的新闻就把它推到了风口浪尖上,现在想想也是让人唏嘘,但不管怎么说,愿它好吧,毕竟这种敢想敢做的精神还是值得敬佩的。
回到技术这个领域,不得不说,技术更新迭代的速度快得让人应接不暇,就容器技术这个领域来说,从 Docker 面世短短的 2-3 年时间里,就衍生出多种与之相关的技术框架,由此形成了一个小小的生态系统。
一谈到容器,大家都会想到 Docker,本文也主要从 Docker 角度来讲容器生态系统。
容器基础技术
Docker 的本质是利用 Linux 内核的 namespace 和 cgroups 机制,构建出一个隔离的进程(容器进程)。所以,容器的基础技术主要涉及到 Linux 内核的 namespace 和 cgroups 技术。
容器核心技术
容器核心技术保证容器能够在主机上运行起来,包括容器规范、容器 runtime、容器管理工具、容器定义工具、Registry 和容器 OS。
容器规范旨在将多种容器(如 OpenVZ,rkt,Docker 等)融合在一起,解决各种兼容问题,为此还专门成立了一个叫 OCI(Open Container Initiative)的组织来专门制定相关的容器规范。
容器 runtime 是容器真正运行的地方,一般需要依赖内核,也有运行在专门制定的容器 OS 上,关于容器 OS,下面会做介绍。lxc 、runc 和 rkt 是目前三种主流的 runtime。
lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。runc 是 Docker 自己开发的容器 runtime,符合 oci 规范,也是现在 Docker 的默认 runtime。rkt 是 CoreOS 开发的容器 runtime,符合 oci 规范,因而能够运行 Docker 的容器。
容器管理工具是对外提供给用户的 CLI 接口,方便用户管理容器,对内与 runtime 交互。对应于不同的 runtime,分别有三种不同的管理工具:lxd、docker engine 和 rkt cli。
容器定义工具允许用户定义容器的内容和属性,如容器需要什么镜像,装载什么应用等。常用有三种工具:docker image、Dockerfile 和 ACL(App Container Image)。
docker image 是容器镜像,runtime 依据 docker image 创建容器。dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。ACI 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。
Registry 是存放容器镜像的仓库,包括 Docker Registry、Docker Hub 和 Quay.io,以及国内的 DaoCloud.io。企业可以用 Docker Registry 构建私有的 Registry。
容器 OS 不同于 runtime,是专门制定出来运行容器的操作系统,与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表。
容器平台技术
随着容器部署的增多,容器也逐步过渡到容器云,容器平台技术就是让容器作为集群在分布式的环境中运行,包括了容器编排引擎、容器管理平台和基于容器的 PaaS。
容器编排引擎就是管理、调度容器在集群中运行,以保障资源的合理利用。有名的三大编排引擎为 docker swarm、kubernetes 和 mesos。其中,kubernetes 这两年脱颖而出,成为其中的佼佼者。
容器管理平台是在编排引擎之上更为通用的一个平台,它抽象了编排引擎的底层实现细节,能够支持多种编排引擎,提供友好的接口给用户,极大方便了管理。Rancher 和 ContainerShip 是容器管理平台的典型代表。
基于容器的 PaaS 基于容器的 PaaS 为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。
容器支持技术
容器的出现又重新让一些古老的技术焕发第二春,如监控、网络、数据管理、日志等技术,由于容器技术的不同,需要制定相应的符合容器规范的技术框架,由此有了容器支持技术,用于支持容器提供更丰富能力的基础设施。
其中包括容器网络、服务发现、监控、数据管理、日志管理和安全性。
容器网络主要用于解决容器与容器之间,容器与其他实体之间的连通性和隔离性。包括 Docker 原生的网络解决方案 docker network,以及第三方的网络解决方案,如 flannel、weave 和 calico。
服务发现保证容器使用过程中资源动态变化的感知性,如当负载增加时,集群会自动创建新的容器;负载减小,多余的容器会被销毁。容器也会根据 host 的资源使用情况在不同 host 中迁移,容器的 IP 和端口也会随之发生变化。在这种动态环境下,就需要有一种机制来感知这种变化,服务发现就是做这样的工作。etcd、consul 和 zookeeper 是服务发现的典型解决方案。
监控室保证容器健康运行,且让用户实时了解应用运行状态的工具,除了 Docker 原生的监控工具 docker ps/top/stats 之外,也有第三方的监控方案,如 sysdig、cAdvisor/Heapster 和 Weave Scope 。
数据管理保证容器在不同的 host 之间迁移时数据的动态迁移。有名的方案是 Flocker。
日志管理为问题排查和事件管理提供了重要依据。docker logs 是 Docker 原生的日志工具。而 logspout 对日志提供了路由功能,它可以收集不同容器的日志并转发给其他工具进行后处理。
容器安全性保证容器的安全,不被攻击,OpenSCAP 能够对容器镜像进行扫描,发现潜在的漏洞。
PS:本文借鉴了知名云计算博主 CloudMan 的博文:
http://www.cnblogs.com/CloudMan6/p/6706546.html,感谢 CloudMan 呈现这么好的内容。