Swarm 集群产生两种不同类型的流量:
控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开 Swarm,这种类型的流量总是被加密的.(涉及到集群内部的 hostname,ip-address,subnet,gateway 等)
应用数据层面:包括容器与客户端的通信等.(涉及到防火墙,端口映射,网口映射,VIP 等)
在 Swarm Service 中有三个重要的网络概念:
Overlay networks 管理 Swarm 中 Docker 守护进程间的通信.你可以将服务附加到一个或多个已存在的 overlay 网络上,使得服务与服务之间能够通信.
ingress network 是一个特殊的 overlay 网络,用于服务节点间的负载均衡.当任何 Swarm 节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块.IPVS 跟踪参与该服务的所有 IP 地址,选择其中的一个,并通过 ingress 网络将请求路由到它.
初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本允许你自定义.
docker_gwbridge 是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络.默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络.
docker_gwbridge 网络在初始化或加入 Swarm 时自动创建.大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义.
Manager 节点的网络情况
► Swarm Services 网络
以 mongo 和 mongo-express (MongoDB 数据 web 可视化) 镜像作为示例,演示 Swarm 下服务间的网络应用.
1,创建 overlay 网络,作用范围为 swarm
提示:overlay 网络创建可以在 Swarm 集群下的任意节点执行,并同步更新到所有节点.
2,将服务附加到指定网络 mongo_network
docker network create \
--driver overlay \
mongo_network
示例:启动 2 个副本的 MongoDB 服务 mongo.
此处服务没有对外发布端口,外部无法连接 MongoDB.3,服务间网络通信
docker service create \
--name mongo \
--replicas 2 \
--network mongo_network \
mongo
示例:启动 1 个副本的 MongoExpress 服务 mongo-express,连接到 mongo 服务,并对外暴露 80 端口,使得外部可以访问.
当前服务
docker service create \
--name mongo-express \
--network mongo_network \
--publish published=80,target=8081 \
-e ME_CONFIG_MONGODB_SERVER="mongo" \
-e ME_CONFIG_MONGODB_PORT=27017 \
mongo-express
此时,mongo-express 服务已映射到 Swarm 所有节点的 80 端口.虽然这个服务只部署了一个副本,但是访问任意节点的都能请求到
mongo-express.
各节点的端口映射
MongoExpress
如上图所示,Hostname 有两个不同的值,分别对应到 mongo 服务下两个副本的容器 ID.由于,在 Swarm 集群下创建服务,网络默认使用 VIP 模式,会为该服务生成一个虚拟 IP,该 IP 会在所有副本容器节点轮训漂移,这样,mongo-express 会轮训的连接到 mongo 的 2 个副本容器.
4,查看 VIP 地址
显示网络详情
docker service inspect mongo
5,查看 MongoDB 容器地址
查看容器所在的节点
docker service ps mongo
查看容器 IP
docker inspect容器ID
6,总结
未完待续...
来源: http://www.jianshu.com/p/60bccbdb6af9