最佳实践系列丨Docker EE 服务发现参考架构(一)

简介: 服务发现对服务进行注册并发布其连接信息,以使其他服务了解如何连接到服务。随着应用向微服务和面向服务的架构转变,服务发现已经成为所有分布式系统的必要组成部分,增加了这些环境的运维复杂性。

screenshot

本文首发自“Docker公司”公众号(ID:docker-cn)
编译丨小东
每周一、三、五 与您不见不散!


服务发现对服务进行注册并发布其连接信息,以使其他服务了解如何连接到服务。随着应用向微服务和面向服务的架构转变,服务发现已经成为所有分布式系统的必要组成部分,增加了这些环境的运维复杂性。

Docker 企业版 (Docker EE) 包含服务发现和负载均衡功能,可为整个组织的开发运维计划提供助力。服务发现和负载均衡可以方便开发人员创建可动态互相发现的应用。另外,这些功能还简化了运维工程师扩展应用的过程。

Docker 使用称作服务的概念来部署应用。服务由基于相同的镜像创建的容器组成。每个服务都由在工作节点上执行并且会定义应用的状态的任务组成。部署服务时,服务定义在创建服务时完成。服务定义包含很多信息,其中包括,服务包含的容器、发布的端口、连接的网络和从节点的数量。所有这些任务共同组成服务的理想状态。如果某个节点未通过运行状况检查或服务定义中某个特定的服务任务未通过运行状况检查,那么集群将调整服务状态,使其与另一个运行状况良好的节点的服务状态一致。Docker EE 包含服务发现、负载均衡、扩展和调整事件,以使该编排可以无缝工作。


学习内容

此参考架构涵盖 Docker EE 提供的服务发现和负载均衡领域的解决方案。创建服务时,Docker 使用 DNS 实现服务发现,而且 Docker 内置了不同的网格路由,可确保应用高度可用。UCP 2.0 发行版引入了新的应用层网格路由,称为 HTTP 网格路由 (HRM),它基于 DNS 主机名路由 HTTP 流量。阅读完本文档之后,您将充分了解 HRM 的工作原理以及它如何与其他 Docker 服务发现和负载均衡功能集成。


使用 DNS 的服务发现

Docker 使用嵌入的 DNS 来为在单个 Docker 引擎上运行的容器和在 Docker Swarm 中运行的任务提供服务发现功能。Docker 引擎具备内部 DNS 服务器,可为用户定义的 bridge、overlay 和 MACVLAN 网络中的主机上的所有容器提供名称解析。每个 Docker 容器(或任务(swarm mode 中))都具备一个可将 DNS 查询转发到 Docker 引擎的 DNS 解析器,它充当 DNS 服务器。然后,Docker 引擎将在发送请求的容器所属的每个网络上检查 DNS 查询是否属于容器或服务。如果属于,Docker 引擎将在其键值存储中查找与容器、任务、或服务的名称匹配的 IP 地址,并将 IP 或服务虚拟 IP (VIP) 返回给请求方。

服务发现将网络作为范围,这意味着只有在相同网络上的容器或任务才可使用嵌入的 DNS 功能。不在相同网络上的容器无法解析彼此的地址。而且,只有在特定网络上具备容器或任务的节点才会存储该网络的 DNS 条目。这有助于提高安全性和性能。

如果目标容器或服务和源容器位于不同的网络上,Docker 引擎会将 DNS 查询转发到默认 DNS 服务器。

screenshot

本示例中,有一个具有两个容器的服务,称为 myservice。在相同的网络上还存在第二个服务 (client)。client 运行两个 curl 操作(为 docker.com 和 myservice)。以下为因此发生的操作:

  • client 为 docker.com 和 myservice发起 DNS 查询;
  • 容器的内置解析器在 127.0.0.11:53 上拦截 DNS 查询,并将其发送到 Docker 引擎的 DNS 服务器;
  • myservice 解析到服务的虚拟 IP (VIP),并在内部均衡分配到各个任务 IP 地址。容器名也将被解析,只不过是直接解析到其 IP 地址;
  • docker.com 没有作为服务名称存在于 mynet 网络中,所以请求被转发给已配置的默认 DNS 服务器;

内部负载均衡

当在 Docker Swarm 集群中创建服务时,将自动向其分配虚拟 IP (VIP),它是服务的网络的一部分。解析服务的名称时将返回 VIP。流向 VIP 的流量将被自动发送到整个 overlay 网络上该服务的所有运行状况良好的任务。此方法可避免由于在客户端进行任何负载均衡,因为仅有一个 IP 返回到客户端。Docker 会处理所有路由并将流量平均分发给运行状况良好的服务任务。

screenshot

要获取服务的 VIP,请按以下方式运行 docker service inspect myservice 命令:

# Create an overlay network called mynet

$ docker network create -d overlay mynet

a59umzkdj2r0ua7x8jxd84dhr

# Create myservice with 2 replicas as part of that network

$ docker service create --network mynet --name myservice --replicas 2 busybox ping localhost

8t5r8cr0f0h6k2c3k7ih4l6f5

# Get the VIP that was created for that service

$ docker service inspect myservice

...

“VirtualIPs":[
               {
                   "NetworkID":"a59umzkdj2r0ua7x8jxd84dhr",

                   "Addr":“10.0.0.3/24"
               },
]

DNS 轮询 (DNS RR) 负载均衡是适用于服务(使用 --endpoint-mode配置)的另外一个负载均衡选项。在 DNS RR 模式下,不为每个服务单独创建 VIP。Docker DNS 服务器通过轮询方式将服务名称解析到各个容器 IP。


外部负载均衡(Swarm Mode 网格路由)

创建或更新服务时,您可以使用 --publish 标志在外部公开服务。在 Docker swarm mode 下公开端口意味着集群中的每个节点都将侦听端口。但是,如果服务的任务不在侦听该端口的节点上应该怎么办呢?

在这种情况下需要使用网格路由。网格路由是 Docker 引擎 1.12 中的一项新功能,它将 ipvs 和 iptables 相结合以创建功能强大的全集群传输层 (L4) 负载均衡器。它允许所有 swarm 节点接受服务发布的端口上的连接。任何 swarm 节点收到发往运行中服务的已发布 TCP/UDP 端口的流量时,它会使用称为入口的预定义 overlay 网络将流量转发到服务的 VIP。入口网络的行为方式与其他 overlay 网络相似,但是其唯一的目标是将网格路由流量从外部客户端传输给集群服务。它使用与前一部分中所述相同的基于 VIP 的内部负载均衡功能。

启动服务后,您就可以为应用创建外部 DNS 记录,并将其映射到任何或所有 Docker swarm 节点。您无需担心容器在哪里运行,因为有了网格路由路由功能,集群中的所有节点就像一个整体。

#Create a service with two replicas and export port 8000 on the cluster

$ docker service create --name app --replicas 2 --network appnet --publish 8000:80 nginx

screenshot

该图表对网格路由的工作原理进行了说明。

  • 创建带有两个从节点的服务,并将其端口映射到外部端口 8000;
  • 网格路由在集群中的每个主机上公开端口 8000;
  • 发往应用的流量可从任何主机进入。在这种情况下,外部 LB 无需通过服务从节点就可将流量发送到主机;
  • 内核的 IPVS 负载均衡器将入口 overlay 网络上的流量重定向到运行状况良好的服务从节点;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
8月前
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
|
8月前
|
JSON 文字识别 BI
如何开发车辆管理系统中的加油管理板块(附架构图+流程图+代码参考)
本文针对中小企业在车辆加油管理中常见的单据混乱、油卡管理困难、对账困难等问题,提出了一套完整的系统化解决方案。内容涵盖车辆管理系统(VMS)的核心功能、加油管理模块的设计要点、数据库模型、系统架构、关键业务流程、API设计与实现示例、前端展示参考(React + Antd)、开发技巧与工程化建议等。通过构建加油管理系统,企业可实现燃油费用的透明化、自动化对账、异常检测与数据分析,从而降低运营成本、提升管理效率。适合希望通过技术手段优化车辆管理的企业技术人员与管理者参考。
|
8月前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
7月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
8月前
|
监控 供应链 前端开发
如何开发ERP(离散制造-MTO)系统中的财务管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO企业ERP系统中财务管理模块的搭建,聚焦应收账款与应付账款管理,涵盖核心功能、业务流程、开发技巧及Python代码示例,助力企业实现财务数据准确、实时可控,提升现金流管理能力。
1122 32
|
8月前
|
供应链 监控 JavaScript
如何开发ERP(离散制造-MTO)系统中的库存管理板块(附架构图+流程图+代码参考)
本文详解MTO模式下ERP库存管理的关键作用,涵盖核心模块、业务流程、开发技巧与代码示例,助力制造企业提升库存周转率、降低缺货风险,实现高效精准的库存管控。
|
8月前
|
前端开发 API 定位技术
如何开发车辆管理系统中的用车申请板块(附架构图+流程图+代码参考)
本文详细解析了如何将传统纸质车辆管理流程数字化,涵盖业务规则、审批流、调度决策及数据留痕等核心环节。内容包括用车申请模块的价值定位、系统架构设计、数据模型构建、前端表单实现及后端开发技巧,助力企业打造可落地、易扩展的车辆管理系统。
|
7月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
650 2
|
7月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
1249 3
|
8月前
|
消息中间件 JavaScript BI
如何开发ERP(离散制造-MTO)系统中的客户管理板块(附架构图+流程图+代码参考)
本文详解离散制造-MTO模式下ERP系统客户管理模块的设计与实现,涵盖架构图、流程图、功能拆解、开发技巧及TypeScript参考代码,助力企业打通客户信息与报价、生产、交付全链路,提升响应效率与订单准交率。

热门文章

最新文章