一,容器的核心技术:
(1)容器规范:
目前OCI发布了两个规范:runtime spec 和 image format spec
有了这两个规范,不同组织和厂商开发的容器能够在不同的runtime上运行,这样就保证了容器的可移植性和互操作性。
(2)容器runtime
runtime是容器真正运行的地方,runtime需要跟操作系统kernel紧密协作,为容器提供运行环境。容器只有在runtime中才能运行。
lxc/runc和rkt是目前主流的三种容器runtime。
lxc是linux上的老牌容器runtime,docker最初也是用lxc作为runtime的。
runc是Docker自己开发的容器runtime,符合oci规范,也是现在Docker的默认runtime。
rkt是CoreOS开发的容器runtime,符合OCI规范,因而能够运行Docker容器。
(3)容器管理工具
光有runtime还不够,用户得有工具来管理容器,容器管理工具对内与runtime交互,对外为用户提供接口,比如CLI,这就好比除了JVM,还得提供java命令让用户能
够启停应用。
lxd是lxc对应的管理工具
runc的管理工具是docker engine,它包含后台deamon和cli两个部分。我们通常提到Docker,一般就是指的docker engine。
rkt的管理工具是rkt cli
(4)容器定义工具
容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存/共享和重建,
docker image是Docker容器的模板,runtime 依据docker image 创建容器。
dockerfile是包含若干命令的文本文件,可以通过这些命令创建出 docker image.
ACI与docker image类似,只不过它是由CoreOS开发的rkt容器的image格式。
(5)Registry
容器是通过image创建的,需要有一个仓库在统一存放image,这个仓库就叫做Registry。
企业可以用Docker Registry构建私有的Registry。
Docker Hub是Docker为公众提供的托管Registry,上面有很多现成的image,为Docker用户提供了极大的便利。
Quay.io是一个公共托管Registry,提供与 、docker Hub类似的服务。
(6)容器OS
由于有容器的runtime,几乎所有的Linux,MAC OS和indows都可以运行容器,但这并没有妨碍容器OS的问世。
容器OS是专门运行容器的操作系统。与常规OS相比,容器OS通常体积更小,启动更快,因为是为容器定制的OS,通常他们运行容器的效率会更高。
目前已经存在不少容器OS,CoreOS、Atomic和Ubuntu Core 是其中杰出的代表,
二,容器平台技术
容器核心技术使得容器能够在单个host上运行,而容器平台技术能够让容器作为集群在分布式环境中运行。
容器平台技术包括容器编排引擎,容器管理平台和基于容器的PaaS,
(1)容器编排引擎
基于容器的应用一般会采用微服务架构,在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过API对外提供服务,为了保证应用的高
可用,每个组件都可能会运行多个相同的容器,这些容器会组成集群,及群众的容器会根据业务需要被动态的创建,迁移和销毁。
大家可以看到,这样一个基于微服务架构的应用系统实际上是一个动态的可伸缩的系统,这对我们部署环境提出了新的要求,我们需要有一种高校的方法来管理容器
集群,而这,就是容器编排引擎要干的工作。
所谓编排,通常包括容器管理,调度,集群定义和服务发现等。通过容器编排引擎,容器被有机地组合成微服务应用,实现业务需求。
docker swarm是Docker开发的容器编排引擎,
kubernetes是Google领导开发的开源容器编排引擎,同时支持Docker和CoreOS容器。
mesos是一个通用的集群资源调度平台,mesos与marathon一起提供容器编排引擎功能,
以上三者是当前主流的容器编排引擎。
(2)容器管理平台
容器管理平台是架构在容器编排引擎之上的一个更为通用的平台,通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的
功能,比如application catalog 和一键应用部署等。
Rancher和ContainerShip是容器管理平台的典型代表。
(3)基于容器的PaaS
基于容器的PaaS为微服务应用开发人员和公司提供了开发,部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。
Deis、Flunn和Dokku都是开源容器PaaS的代表,
三,容器支持技术
下面这些技术被用于支持基于容器的基础设施。
(1)容器网络
容器的出现使网络拓扑变的更加动态和复杂,用户需要专门的解决方案来管理容器与容器,容器与其他实体之间的连通性和隔离性。
docker network 是 Docker原生的网络解决方案,除此之外,我们还可以采用第三方开源解决方案,例如,flannel、weave和calico,不同方案的设计和实现方式不
同,各有优势和特点,应根据实际需求来选型。
(2)服务发现
动态变化是微服务应用的一大特点,当负载增加时,集群会自动创建新的容器,负载减少,多余的容器会被销毁,容器也会根据host的资源使用情况在不同host中迁
移,容器的IP和端口也会随之发生变化。
在这种动态的环境下,必须要有一种机制让client能够知道如何访问容器提供的服务,这就是服务发现来完成的工作,
容器发现会保存容器集群中所有微服务最新的信息,比如IP和端口,并对外提供API,提供服务查询功能,
etcd、consul和zookeeper是服务发现的经典解决方案。
(3)监控
监控对于基础架构非常重要,而容器的动态特征对监控提出更多挑战,针对容器环境,已经涌现出很多监控工具和方案,
docker ps/top/stats是Docker原生的命令行监控工具,除了命令行,Docker也提供了stats API,用户可以通过HTTP请求获取容器的状态信息。
sysdig,cAdvisor/Heapster和Weave Scope是其他开源的容器监控方案。
(4)数据管理
容器经常会在不同的host之间迁移,如何保证持久化数据也能够动态迁移,是Rex-Ray这类数据管理工具提供的能力。
(5)日志管理
日志为问题排查和事件管理提供了重要依据,日志工具有两类
docker logs 是Docker原生的日志工具,而logspout对日志提供了路由功能,他可以收集不同容器的日志并转发给其他工具进行后处理。
(6)安全性
对于年轻的容器,安全性一直是业界争论的焦点,OpenSCAP是一种容器安全工具,能够对容器镜像进行扫描,并发现潜在的漏洞。