本文是借鉴别人的文章,找不到原文在什么地方了,若是侵权,请联系当即删除...php
大规模的容器技术运用历来不是一项独立工程,而是一个聚集虚拟化技术、容器编排、任务调度、操做系统、容器仓库、跨节点网络、分布式存储、动态扩缩、负载均衡、日志监控、故障自恢复等系统性难题的复杂有机体。随着Docker的诞生和Google等互联网公司的推波助澜,这个领域出现了一大批优秀的开源项目,它们在简化容器技术使用成本的同时,也常常使得刚刚接触容器时间不太长的开发者和企业用户感到不知所措。linux
将知识分类是梳理零散信息的一种有效方式。对于容器技术的生态圈来讲,其中涉及领域众多,有的项目横跨多个细分领域,有的项目则是针对特定场景需求定制的,难以对其功能类型作精肯定义。不过,若仅考虑通用领域里的相关产品和工具,大体来讲能够划分红14种主要类别。ios
如下将围绕容器生态,分别举例介绍这些类别中的典型开源项目,以及部分虽未开源但比较经常使用的100个周边产品。git
容器引擎是容器集群生态圈的核心部分,它是与内核Namespace和CGroup等功能直接交互,并提供相应API使得外部可以与之集成的工具或服务。Docker无疑是目前为止最成功、普遍最使用的容器引擎之一。实际上从1.12版本之后,Docker的容器化功能已经由独立的项目RunC来实现,但Docker仍做为一个开源产品为用户提供完整的容器化解决方案。此外,社区中还有许多容器引擎项目,例如:github
这些项目只是众多支持不一样平台和具备不一样特性的容器引擎的冰山一角。例如Google曾经主导的lmctfy(http://lmctfy.io/)项目也是个十分优秀的容器引擎,然而该项目自2015年之后就再也不被维护了。而最近Google刚刚开源的gVisor则是该领域中的新秀。另外值得一说的是,Hyper采用虚拟机的方式对环境进行隔离,并非一种基于容器的隔离方案,但它能很好地与Docker或Kubernetes等容器集群技术相结合,取代其环境隔离的功能,所以也归属此列。docker
因为容器基于内核的特殊隔离方式,对容器性能和状态的监控与虚拟机存在一些差异。传统的虚拟机监控工具,例如Nagios和Zabbix等,对容器监控的原生支持并不十分易用。而一些新起的开源项目对这种场景具备更友好的体验,例如:apache
其中的TICK-Stack指的是Influxdata推出的Telegraf、InfluxDB、Chronograf、Kapacitor四款开源工具,不过从1.0之后,这些工具在开源版基础上提供了企业版本,后者提供了例如高可用、云端存储等企业级功能。api
可视化是用户友好性十分重要的一部分,Shipyard和Decking是Docker早期时十分受欢迎的可视化工具,以后Docker也收购了Kitematic做为官方的容器管理UI。但随着容器应用集群化,早期的UI工具再也不流行,一些针对特定集群平台定制的新型管理UI开始出现。例如Kubernetes官方推出了Dashboard项目用于可视化的管理集群,Cockpit则是红帽公司推出的Kubernetes集群管理界面。如下是其中一些开源的容器管理UI项目:安全
DockStation:https://dockstation.io网络
容器集群的实施是须要以硬件基础设施做为依托的,有些辅助工具可以简化这个过程。这些项目每每与具体的底层平台相关,例如:
Nova-docker和Magnum都是在OpenStack集成容器集群的项目,不过目前OpenStack官方正在尝试经过让Kubernetes直接建立虚拟机的方式来统一它在IaaS层和CaaS层的差别,其中的Nova-docker已经被废弃了。Machine是Docker公司推出的基础设施管理工具,Boot2Docker曾经是在Windows和Mac上使用Docker的官方方案,但随着Docker 1.12版本发布了多种操做系统的发行版后,已经再也不被推荐使用了。
编排和调度是容器集群的基本功能,所以选择编排和调度工具实际上就是在选择容器集群的方案。如下是一些开源的容器任务编排调度工具:
其中的OpenShift主要是指其3.0以后的发行版,它是红帽公司基于Kubernetes二次开发的集持续集成和交付于一体的容器集群方案,具备开源和商业两个版本。
镜像仓库是基于容器的在软件发布流程中必要的组成部分,Docker开源了其镜像仓库的最小实现,但对于企业级应用来讲,它缺乏了高可用、权限控制、管理界面等必要功能。Docker Hub和国内的许多容器云平台都提供了公有云的企业级仓库服务,社区中也有一些容器仓库的开源或免费的实现,例如:
其中的Nexus是一种通用的软件包仓库解决方案,支持包括Maven、NPM、PIP、RPM等许多主流打包格式的分发和管理,它是在3.0之后的版本中开始支持做为Docker镜像仓库的。VMWare推出的Habor是目前相对经常使用的企业级开源Docker仓库解决方案。Portus和Docker Registry UI是基于官方Repository镜像仓库的界面化管理工具。Dragonfly是一款P2P协议的镜像分发工具,并不是直接提供镜像存储功能,但也属于仓库辅助类的工具。
服务发现和域名服务其实是微服务架构和容器集群的调度工具所需的组件,它们在容器集群中十分常见,也是这个生态圈中举足轻重的一部分,如下是其中一些在实际工程中被说起较多的工具:
和容器集群的监控同样,收集容器中的服务运行日志与虚拟机中的方式一样存在许多差别。目前Docker直接经过插件可以支持的日志收集工具包括Rsyslog、Splunk和Fluentd,虽然FileBeat不在此列,但因为其小巧便捷的部署机制,也获得了许多用户青睐。一些过去用于虚拟机的日志收集器,好比LogStash或Flume,一样可以使用与容器中的服务,但它们都再也不是首选的方案。
ElasticStack是Beats、Logstash、ElasticSearch和Kibana四款开源项目的统称,这是一套十分流行的日志汇聚、处理、存储和展现的工具组合。其中的ElasticSearch和Kibana也能够与Fluentd配合,造成端到端日志处理方案。另外值得指出的是,Splunk并非开源或免费的,但它在企业级日志处理方案中的应用十分普遍。
有些Linux发行版是为容器运行而优化的,Atomic和ClearLinux系统都属于此类。另外一些Linux发行版在设计之初就充分地将容器机制融入了系统的架构理念,例如CoreOS。有的系统甚至将Docker做为系统的核心服务来管理其余用户进程,例如RancherOS和Hyper容器引擎所使用的操做系统。相似的项目还有许多,它们都是架设容器集群时十分称手的基础设施,例如:
SmartOS:https://www.joyent.com/smartos
容器平台是大规模容器运用的产物,它一般会与持续集成、持续交付的工具结合,成为链接上层应用服务和底层基础设施、帮助使用者快速实现从代码提交到产品上线全过程的端到端交付过程。如下是其中一些相关的开源项目:
除了这些开源的容器平台服务实现以外,互联网上还有许多在线按量付费的容器即服务平台,它们也是整个容器集群生态的一部分。
容器技术在解决环境隔离和配额问题的同时,也引入了网络层面的复杂性。因为使用了Network Namespace,每一个容器均可以得到独立的IP地址,这对于单个主机的状况并没有大碍,但对于容器集群的状况,IP地址的分配和互联就成为了新的问题。所以在设计容器集群时,一般须要专门为网络的链接方式加以考虑。经常使用的开源方案例如:
这些网络方案大多采用了七层网络的Overlay Network方式,也就是在容器之间通讯的网络包上封装了用于路由寻址的额外包头,这种方式会致使网络通讯效率的降低,具体影响程度与所封装的额外数据大小有关。而Calico采用修改每一个主机节点上的IPtables和路由表规则实现容器间数据路由和访问控制,属于三层网络的方式,这种方案在节点规模不太大(最多几百个节点)时的效率优点十分明显,是一种比较受推荐的容器网络工具。除了这些较经常使用的方案外,一些条件容许的企业也会结合MacVLAN等二层网络方案实现容器的互联,以得到更好的网络性能。
容器安全性问题的根源在于容器和宿主机共用内核,所以受***的面特别大。另外,若是容器里的应用致使Linux内核崩溃,整个宿主机系统都会崩溃,这一点与虚拟机是不一样的。此外,镜像的安全性也是容器安全的一部分,如何保障用户下载的镜像是可信的、未被篡改过的,以及如何保证镜像中不会意外包含具备大量漏洞的老旧软件都是须要考虑的问题。目前这些安全课题主要在一些企业级应用中引发较多重视,下面是一些相关的开源工具和项目:
容器是一种不可变的基础设施,容器的数据应该经过Volume的方式保存到外部的介质上,容器持久化存储本质上就是要解决如何简便地将外部存储挂载到容器中使用的问题。Docker在1.9版本后提供了存储的插件,这也为许多存储方案提供了便利,如下列举几个例子:
其中Ceph是通用的网络存储工具,同时提供块存储和对象存储能力,对容器化场景下的应用数据持久化具备良好的支持。
容器的镜像能够被看做一种新型的应用打包方式,所以容器经常与软件的开发和持续集成、持续交付流程相结合,提供不一样环境一致性部署能力。如下是一些利用容器改善软件开发和交付的工具或平台: