第五部分-DockerCompose——29. Swarm 网络
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\--subnet=10.0.10.0/24\--gateway=10.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. 服务发现与 DNS
5.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-it<container>nslookupweb.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-it<container>bash# 安装网络工具apt-getupdate&&apt-getinstall-yiputils-ping dnsutilscurl# 测试连通性pingapinslookupapicurlhttp://api:8080# 查看路由iproute# 查看网络统计netstat-tuln10. 网络性能优化
10.1 调整 MTU
# 创建 Overlay 网络时指定 MTUdockernetwork create-doverlay\--optcom.docker.network.driver.mtu=1450\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\--mounttype=volume,src=db-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 --network |
13. 常见问题
Q1: Overlay 网络无法 ping 通?
检查防火墙是否允许 VXLAN 端口 (4789) 通信。
Q2: 如何让容器访问外网?
使用非内部网络,默认 Overlay 可以访问外网。
Q3: 服务之间如何通信?
通过服务名,Swarm DNS 自动解析。
14. 小结
- Overlay 网络:跨主机容器通信
- Ingress 网络:处理外部请求负载均衡
- Routing Mesh:任意节点访问服务
- 网络加密:IPSec 加密 Overlay 流量
- 网络隔离:多网络实现安全隔离
- 服务发现:内置 DNS 解析服务名
- 负载均衡:内置 VIP 负载均衡
- 性能优化:调整 MTU、使用 host 网络
