Docker生态系统:常规组件简介
内容简介
容器技术旨在通过一种可移植且可预测的方式实现应用程序的分发与部署。为实现这一目标,容器技术对各组件进行打包,并将其关联为一套标准化、隔离性的轻量级处理环境,这就是所谓“容器”。目前已经有众多企业倾向于在应用程序与服务设计当中考量这种面向分布式系统的便捷部署方式,从而保证该系统能够轻松实现扩展,同时及时发现设备与应用故障问题。作为一套着眼于简化与标准化部署需求的容器方案,Docker的广泛普及极大推动了上述设计与管理思路的实现。事实上,这套分布式容器管理生态系统也得到了大量软件开发商的认同与采纳。
Docker与容器化
Docker是目前最具人气的容器化软件选项。尽管市面上还存在着其它一些容器化系统,但Docker不仅让容器的创建与管理变得更为轻松,同时亦集成有大量其它开源项目。
通过这张图片,大家可以了解到容器在主机系统中的实际作用。容器负责隔离各类不同应用程序,并利用经过Docker抽象化处理的操作系统资源。在右侧的分解图中可以看到,容器系统亦可“分层”构建,其中多套容器共享同一底层,从而尽可能降低资源使用量。
Docker的主要优势包括:
- 轻量化资源占用:相较于虚拟机所采用的整体操作系统,容器系统能够以进程级别实现隔离并使用同一套主机内核。
- 可移植性: 容器化应用程序的全部关联性都被绑定在该容器之内,这就使其能够轻松被迁移至其它Docker主机上并继续正常运行。
- 可预测性: 主机自身并不关注容器之内运行的实际内容,而容器亦不关注其究竟运行在何种硬件平台之上。因此接口具有标准化特性,交互亦可预测。
一般来讲,着眼于Docker进行应用程序或者服务设计时,我们最好将功能拆分成多个单独容器之内,这就是我们常说的面向服务架构。通过这种方式,大家能够轻松实现各独立组件的后续规模伸缩与更新。正是由于这种灵活性,人们才乐于使用Docker用于应用或服务的开发以及部署。
欲了解更多Docker容器化应用相关的信息,请点击此处进行查看。
服务发现与全局配置存储
服务发现属于整体策略中的组成部分,旨在确保容器部署具备可扩展性与灵活性。在服务发现机制的帮助下,容器能够在无需管理员介入的前提下了解其当前运行环境,具体包括发现其所需交互之对象组件的连接信息,甚至可进行自我注册以通知其它协作工具。这些工具通常作为全局分布式配置存储机制,负责分发配置设定以保证基础设施之上各组件的正常执行。
在上图当中,大家可以看到示例流程内的应用程序向发现服务系统注册其连接信息。注册完成后,其它应用即可查询该发现服务,从而了解如何与该已注册应用进行对接。
这些工具通常采取简单的键-值存储机制,并立足于集群化环境分布在各主机当中。总体而言,键-值存储提供HTTP API以访问并设置各相关值。其中一些还包含其它安全机制,例如加密条目或者访问控制等等。这种分布式存储方案对于管理集群化Docker主机至关重要,同时亦保证了其为各新容器提供自我配置信息这一重要能力。
服务发现存储机制的部分作用包括:
- 允许应用程序容纳其与服务对接所必需的数据。
- 允许服务出于以上目的对自身连接信息进行注册。
- 提供一个全局可访问位置以存储任意配置数据。
- 根据任意集群管理软件的需要,存储集群成员相关信息。
目前人气较高的服务发现工具与相关项目包括:
- etcd: 服务发现/全局分布式键-值存储方案
- consul: 服务发现/全局分布式键-值存储方案
- zookeeper: 服务发现/全局分布式键-值存储方案
- crypt: 用于对etcd条目进行加密
- confd: 观察键-值存储变更,并利用新值触发服务重新配置
欲了解更多与Docker服务发现相关的信息,请点击此处阅读我们的指南文章。
网络工具
容器化应用程序采用面向服务设计,旨在将既有功能拆分为众多组件。这种作法虽然能够简化管理与规模伸缩工作,但却要求我们根据功能及可靠性对不同组件间的网络连接进行细化处理。Docker本身即提供必要的基础性网络结构,帮助我们实现容器到容器以及容器到主机等通信需求。
Docker的原生网络功能提供两种对不同容器进行hook的机制。其一为显示容器端口并将其映射至主机系统,从而实现外部路由。大家可以选定映射指向的主机端口,或者允许Docker为其随机选定一个未使用的高位端口。这种处理方式较为常见,适合大多数容器用例。
另一种方法是允许容器利用Docker的“链接”进行通信。一套链入容器能够获取与其相对应的连接信息,我们通过配置要求其监测相关变量以实现自动连接。在这种情况下,同一主机上的不同容器将实现彼此通信,而不必了解服务被指定的具体端口或者地址。
这种基础网络层级适用于单一主机或者封闭管理环境。然而,Docker生态系统也提供多种其它项目以扩展并满足运维人员及开发人员对网络功能的需求。目前常用的网络扩展功能包括:
- 覆盖网络以简化并统一多主机间各地址空间。
- 虚拟专用网络,旨在提供不同组件之间的安全通信机制。
- 为每台主机或者每款应用程序分配子网。
- 建立macvlan接口以实现通信。
- 为容器配置定制化MAC地址以及网关等。
而当前人气较高的Docker网络改进项目包括:
- flannel:覆盖网络并为每台主机提供独立子网。
- weave: 覆盖网络并利用全部容器建立单独网络。
- pipework: 高级网络工具包,用于实现更多高级网络配置能力。
欲了解更多与Docker相关之网络实现方法,请点击此处进行查看。
调度、集群管理与编排
构建集群化容器环境的另一大必要组件就是调度器。调度器负责在可用主机之上启动各容器系统。
上图所示为一套经过简化的调度决策流程。请求通过API或者管理工具进行传递。在这里,调度器会评估请求条件以及可用主机状态。在示例当中,其从分布式数据存储/发现服务(如上所述)中提取容器密度信息,从而将新应用部署在运行强度最低的主机之上。
这一主机选择过程正是调度器的核心作用之一。通常来讲,其还能够为管理员提供控制选项,从而帮助特定容器以自动化方式实现这项任务。这部分选项包括:
- 将当前容器调度至另一给定容器运行所在之主机。
- 确保该容器不被部署至另一给定容器运行所在之主机。
- 将容器部署至标签或者元数据与要求相匹配的主机之上。
- 将容器部署至运行强度最低的主机之上。
- 将该容器运行于集群中的每一台主机之上。
调度器负责在相关主机上进行容器载入,同时启动、停止及管理该流程的生命周期。
由于调度器必须与群组中的每台主机进行交互,因此我们还需要引入集群管理功能。这些功能将保证调度器能够获取到各集群成员的信息,同时执行必要的管理任务。在这种情况下,编排工具闪亮登场并负责将容器调度与主机管理工作加以结合。
目前的高人气调度器与集群管理工具包括:
- fleet: 调度器与集群管理工具。
- marathon: 调度器与服务管理工具。
- Swarm: 调度器与服务管理工具。
- mesos: 用于承载抽象服务,而抽象服务则负责合并主机资源以供调度器使用。
- kubernetes: 提供先进调度器功能以实现容器群组管理。
- compose: 用于创建容器群组的容器编排工具。
欲了解更多与Docker内基础调度、容器、群组以及集群管理软件相关的信息
结论
到这里,大家应该已经对Docker生态系统当中的各类常见软件及其功能有所了解了。另外,我们也分享了多种软件管理、设计以及部署策略,相信能够充分满足各位的可扩展性需求。有了这样的认知储备,大家将能够执行复杂的应用部署,并凭借容器技术的出色灵活性应对实际场景下不断变化的操作要求。
英文原文:The Docker Ecosystem: An Introduction to Common Components By Justin Ellingwood
翻译:diradw