前言
本文主要介绍 Swarm 中的三类网络,overlay、ingress 和 docker_gwbridge。并逐一了解这些网络的应用及如何自定义配置。
Swarm service networks
Swarm 网络中有三类:
- overlay network,能够管理 Docker 进程之间的通信。可以自定义创建 overlay network,也可以把容器服务加入之中,实现服务到服务的通信。在 Docker 网络中 overlay network 属于
overlay网络驱动类型。 - ingress network,特殊的 overlay network,能够在服务节点之间实施负载均衡。当任意Swarm 节点的开放端口接收到请求,会将该请求转接至
IPVS模块 (IP Virtual Server,用于负载均衡),IPVS 会持有服务的所有 IP 地址,并择一将请求路由到那里。此时,请求走的是 Docker 网络中的 ingress 网络。当主机节点应用或加入了 Swarm,就会自动创建 ingress 网络。 - docker_gwbridge,桥接网络,能够把 overlay network (包括 ingress network) 连接到 Docker 守护进程的物理网络。默认地,每个运行的服务容器都会连接到本地主机 Docker 守护进程的 docker_gwbridge 网络。docker_gwbridge 网络同样在应用或加入了 Swarm,就会自动创建。
创建overlay network
创建 overlay 网络特别地需要指定--driver overlay。
docker network create \
--driver overlay \
my-network
需要注意 overlay network 的 scope 是 swarm,这意味着只有应用了 Swarm 的主机才能访问这类网络。
将服务加入overlay network
Swarm service 可以在创建 (--network) 或更新 (--network-add) 时加入网络。
docker service update --network-add my-network my-app
加入到同一个 overlay network 的服务就能够通过服务名通信 (ingress network 则不支持)。
ping my-app
自定义ingress network
大部分时候并不需要配置ingress网络,不过 Docker 也允许这么做。在自动选择的子网范围与已有的网络冲突时,或需要设置 MTU 时就要配置了。
自定义ingress网络包括移除和重新创建,这些通常在创建 Swarm 服务之前操作。如果已有开放端口的服务存在,则需要先将这些服务移除才能删除ingress网络。
在没有ingress网络期间,存在的服务中未开放端口的可以继续运作但不会被负载均衡。同时也会影响到已开放端口的服务。
1.执行以下命令可检查ingress网络。
docker network inspect ingress
2.移除已存在的ingress网络。
docker network rm ingress
3.创建一个新的 overly 网络并使用--ingress标识,并设置想要自定义的选项。
在此例中设置了 MTU 为 1200,子网为10.11.0.0/16,并且设置网关为10.11.0.2。
注意:新的 ingress 网络可以自主命名,但总的只能有一个ingress网络。
docker network create \
--driver overlay \
--ingress \
--subnet=10.11.0.0/16 \
--gateway=10.11.0.2 \
--opt com.docker.network.driver.mtu=1200 \
my-ingress
4.重启之前停止的服务。
自定义docker_gwbridge
docker_gwbridge 是一个虚拟网桥,将 overlay network (包括 ingress network) 连接到 Docker 守护进程的物理网络。在初始化 Swarm 或加入 Swarm 时 Docker 会自动创建。docker_gwbridge 并不属于 Docker 设备,它是存在于主机内核中的。如果需要自定义配置,则需要在加入 Swarm 前或暂时脱离 Swarm 后操作。
要删除已有的网桥,需要先安装brctl,其包名为bridge-utils。
1.先停止Docker。
2.使用brctl show docker_gwbridge命令检查是否存在docker_gwbridge网桥设备,如果是,则通过brctl delbr docker_gwbridge删除。
3.启动Docker。先不要加入或创建 Swarm 集群。
4.创建或重新创建docker_gwbridge网桥并自定义配置。在下面的例子中使用了子网10.11.0.0/16。完整的自定义选项查看此处:Bridge driver options 。
docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge
5.此后就可以创建或加入 Swarm 集群。