29. Swarm 网络1. Swarm 网络概述Swarm 模式提供了多种网络驱动用于解决跨主机容器通信问题。Overlay 网络是 Swarm 中最常用的网络驱动它创建一个跨所有 Swarm 节点的虚拟网络。┌─────────────────────────────────────────────────────────────┐ │ Swarm Overlay 网络 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Overlay Network │ │ │ │ 10.0.0.0/24 │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ Node A │◄────────►│ Node B │ │ │ │ │ │10.0.0.2 │ VXLAN │10.0.0.3 │ │ │ │ │ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ │ │ │ │ ┌───────┐ ┌───────┐ │ │ │ │ │ web-1 │ │ web-2 │ │ │ │ │ │ 容器 │ │ 容器 │ │ │ │ │ └───────┘ └───────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ Overlay 网络特点 │ │ - 跨主机容器通信 │ │ - VXLAN 封装 │ │ - 加密选项 │ │ - 服务发现 │ │ │ └─────────────────────────────────────────────────────────────┘2. Overlay 网络2.1 创建 Overlay 网络# 创建 Overlay 网络不可附加dockernetwork create-doverlay my-overlay# 创建可附加的 Overlay 网络允许独立容器连接dockernetwork create-doverlay--attachablemy-overlay# 创建带子网的 Overlay 网络dockernetwork create-doverlay\--subnet10.0.10.0/24\--gateway10.0.10.1\my-overlay# 创建带加密的 Overlay 网络dockernetwork create-doverlay\--optencrypted\my-overlay# 查看网络dockernetworklsdockernetwork inspect my-overlay2.2 服务使用 Overlay 网络# 创建服务并连接到 Overlay 网络dockerservicecreate--nameweb\--networkmy-overlay\--replicas3\nginx# 创建另一个服务同一网络dockerservicecreate--nameapi\--networkmy-overlay\--replicas3\myapi# 访问验证dockerservicelogs web3. 网络类型对比网络驱动用途范围适用场景overlay跨主机容器通信Swarm 集群服务间通信overlay (attachable)独立容器连接Swarm 集群调试混用bridge单机容器通信单节点本地开发host共享宿主机网络单节点高性能macvlan直接使用物理网络单节点特定 IP 需求4. Ingress 网络4.1 概述Ingress 网络是 Swarm 默认创建的 overlay 网络负责处理外部请求的负载均衡。# 查看 Ingress 网络dockernetworkls|grepingress# Ingress 网络详情dockernetwork inspect ingress# 创建服务时自动使用 Ingress 网络端口发布dockerservicecreate--nameweb\--publish8080:80\--replicas3\nginx# 请求流程# 外部 → 任意节点 8080 → Ingress 网络 → 目标节点容器4.2 Routing Mesh# Routing Mesh 工作原理# 1. 服务发布端口 8080:80# 2. 所有节点监听 8080 端口# 3. 请求到达任一节点Ingress 网络负载均衡到后端容器# 验证 Routing Mesh# 查询节点 IPdockernodels# 从任意节点访问curlhttp://node1:8080curlhttp://node2:8080curlhttp://node3:8080# 都能访问到服务5. 服务发现与 DNS5.1 内置 DNS# Swarm 提供内置 DNS 服务# 服务名解析到 VIP# 创建服务dockerservicecreate--nameapi--replicas3myapi# 其他服务通过服务名访问# ping api# curl http://api:8080# 查看服务的 VIPdockerserviceinspect api--format{{.Endpoint.VirtualIPs}}5.2 任务级别的 DNS# 访问特定任务dockerservicecreate--nameweb--replicas3nginx# 任务 DNS 格式task-name.service-name# web.1.web# web.2.web# web.3.web# 解析任务 IPdockerexec-itcontainernslookupweb.1.web6. 网络加密6.1 启用加密# 创建加密的 Overlay 网络dockernetwork create-doverlay\--optencrypted\encrypted-net# 查看加密状态dockernetwork inspect encrypted-net|grepencrypted# 使用加密网络dockerservicecreate--namesecure-app\--networkencrypted-net\--replicas3\myapp6.2 加密配置# Swarm 加密参数# --opt encrypted: 启用 IPSec 加密# 自动处理密钥轮换# 验证加密dockernetwork inspect encrypted-net|grep-A10Options7. 网络隔离7.1 多网络隔离# 创建不同网络dockernetwork create-doverlay frontend-netdockernetwork create-doverlay backend-netdockernetwork create-doverlay database-net# 前端服务只能访问前端网络dockerservicecreate--nameweb\--networkfrontend-net\nginx# API 网关连接前端和后端dockerservicecreate--nameapi\--networkfrontend-net\--networkbackend-net\myapi# 数据库只能被后端访问dockerservicecreate--namedb\--networkbackend-net\mysql# 通信路径# web → api (通过 frontend-net)# api → db (通过 backend-net)# web 无法直接访问 db7.2 内部网络# 创建内部网络无外网访问dockernetwork create-doverlay\--internal\internal-net# 服务只能与内部网络通信无法访问外网dockerservicecreate--nameinternal-app\--networkinternal-net\myapp8. 负载均衡8.1 内置负载均衡# Swarm 提供两种负载均衡# 1. Ingress 负载均衡外部请求# 2. 服务 VIP 负载均衡内部请求# 创建服务dockerservicecreate--nameweb\--publish8080:80\--replicas5\nginx# 查看负载均衡配置dockerserviceinspect web--format{{.Endpoint.Spec}}8.2 外部负载均衡# 使用外部负载均衡如 Nginx、HAProxy# 方案1配置外部负载均衡器指向所有 Swarm 节点dockerservicecreate--nameweb\--publish80:80\--modeglobal\nginx# 方案2使用 DNS 轮询dockerservicecreate--nameweb\--endpoint-mode dnsrr\--replicas5\nginx9. 网络调试9.1 查看网络# 列出所有网络dockernetworkls# 查看网络详情dockernetwork inspect my-overlay# 查看网络连接的容器dockernetwork inspect my-overlay--format{{range .Containers}}{{.Name}} {{.IPv4Address}}{{\n}}{{end}}# 查看服务网络信息dockerserviceinspect web--format{{.Endpoint.Spec}}9.2 网络诊断# 进入容器测试网络dockerexec-itcontainerbash# 安装网络工具apt-getupdateapt-getinstall-yiputils-ping dnsutilscurl# 测试连通性pingapinslookupapicurlhttp://api:8080# 查看路由iproute# 查看网络统计netstat-tuln10. 网络性能优化10.1 调整 MTU# 创建 Overlay 网络时指定 MTUdockernetwork create-doverlay\--optcom.docker.network.driver.mtu1450\my-overlay10.2 使用 Host 网络# 高性能场景使用 host 网络dockerservicecreate--namehigh-perf\--networkhost\--modeglobal\myapp11. 完整网络示例#!/bin/bash# 创建完整的多层网络架构# 1. 创建三层网络dockernetwork create-doverlay frontend-netdockernetwork create-doverlay backend-netdockernetwork create-doverlay database-net# 2. Web 层只能访问前端dockerservicecreate\--nameweb\--networkfrontend-net\--publish80:80\--replicas3\nginx# 3. API 层前后端通信dockerservicecreate\--nameapi\--networkfrontend-net\--networkbackend-net\--replicas5\--limit-cpu0.5\myapi# 4. 缓存层redis_service# 5. 数据库层dockerservicecreate\--namedb\--networkbackend-net\--mounttypevolume,srcdb-data,dst/var/lib/postgresql/data\--replicas1\postgres# 6. 监控代理全局dockerservicecreate\--namemonitor\--modeglobal\--networkmonitoring-net\prom/node-exporter# 验证网络dockerservicelsdockernetworklsdockernetwork inspect frontend-net12. 常用命令速查操作命令创建 Overlay 网络docker network create -d overlay创建可附加网络docker network create -d overlay --attachable创建加密网络docker network create -d overlay --opt encrypted创建内部网络docker network create -d overlay --internal列出网络docker network ls查看网络docker network inspect删除网络docker network rm服务连接网络docker service create --network13. 常见问题Q1: Overlay 网络无法 ping 通检查防火墙是否允许 VXLAN 端口 (4789) 通信。Q2: 如何让容器访问外网使用非内部网络默认 Overlay 可以访问外网。Q3: 服务之间如何通信通过服务名Swarm DNS 自动解析。14. 小结Overlay 网络跨主机容器通信Ingress 网络处理外部请求负载均衡Routing Mesh任意节点访问服务网络加密IPSec 加密 Overlay 流量网络隔离多网络实现安全隔离服务发现内置 DNS 解析服务名负载均衡内置 VIP 负载均衡性能优化调整 MTU、使用 host 网络