docker Use overlay networks
简介
overlay 网络驱动程序在多个Docker守护进程主机之间创建一个分布式网络.这个网络位于特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地通信。Docker透明地处理每个数据包与正确的Docker守护进程主机和正确的目标容器之间的路由。
当你初始化一个swarm或者将一个Docker主机加入到一个已有的swarm中时,会在这个Docker主机上创建两个新的网络:
- 覆盖网络 [ingress] 处理与swarm service相关的控制和数据流量。 当您创建swarm service而不将其连接到用户定义的覆盖网络时,默认情况下它连接到ingress网络。
- 桥接网络 [docker_gwbridge] 它将单个Docker守护进程连接到swarm中的其他守护进程。
你可以使用docker network create创建用户自定义的 overlay 网络,与创建用户自定义的桥接网络的方法相同。service或容器可以同时连接到多个网络。service或容器只能通过它们各自连接的网络进行通信。
尽管您可以将swarm service和独立容器连接到覆盖网络,但默认行为和配置关注点是不同的。因此,本主题的其余部分被划分为适用于所有覆盖网络的操作,适用于swarm service网络的操作,以及适用于独立容器使用的覆盖网络的操作。
覆盖网络操作
创建覆盖网络
基本条件
- 开放以下端口
- TCP端口2377用于集群管理通信
- TCP和UDP端口7946用于节点之间的通信
- UDP端口4789用于覆盖网络流量
- 在创建覆盖网络之前,您需要使用Docker swarm init将Docker守护进程初始化为swarm manager,或者使用Docker swarm join将其连接到现有的集群。这两种方式都会创建默认的入口覆盖网络,默认情况下swarm service使用该网络.即使您从未计划使用群集服务,也需要这样做。然后,您可以创建其他用户定义的覆盖网络。
要创建一个用于swarm服务的覆盖网络,可以使用如下命令:
[root@node1 ~]# docker network create -d overlay my-overlay
bbuxnziaskceip2pr7zu48hw1
要创建一个覆盖网络,可以让swarm服务或独立容器与运行在其他Docker守护进程上的其他独立容器通信,添加--attachable
docker network create -d overlay --attachable my-attachable-overlay
您可以指定IP地址范围、子网、网关和其他选项。有关详细信息,请参见docker network create --help。
在覆盖网络上加密通信
略
自定义默认的ingress网络
大多数用户从来不需要配置ingress网络,但Docker 17.05及更高版本允许这样做。
略
自定义docker_gwbridge接口
docker_gwbridge是一个虚拟桥,它将覆盖网络(包括入口网络)连接到单个Docker守护进程的物理网络。当您初始化swarm或将Docker主机加入swarm时,Docker会自动创建它,但它不是Docker设备。它存在于Docker主机的内核中。如果您需要自定义它的设置,则必须在将Docker主机加入到swarm之前或临时将主机从swarm中移除之后进行此操作。
- Stop Docker.
- 删除现有的docker_gwbridge接口
$ sudo ip link set docker_gwbridge down
$ sudo ip link del dev docker_gwbridge
- start docker,不要加入或初始化swarm
- 使用自定义设置手动创建或重新创建docker_gwbridgebridge,使用docker network create命令。本例使用子网10.11.0.0/16。有关可定制选项的完整列表,请参见桥接驱动程序选项
$ 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
- 初始化或加入swarm。由于bridge已经存在,Docker不使用自动设置创建桥。
swarm service 的操作
在覆盖网络上发布端口
swarm service 连接到相同的覆盖网络,有效地将所有端口相互公开.要使端口在外部可访问,该端口必须使用-p or --publish在docker service create or docker service update时发布。既支持传统的冒号分隔语法,也支持较新的逗号分隔值语法。建议使用长语法。
Flag value | Description |
---|---|
-p 8080:80 or | |
-p published=8080,target=80 | 将服务上的TCP端口80映射到路由网格上的端口8080。 |
-p 8080:80/udp or | |
-p published=8080,target=80,protocol=udp | 将服务上的UDP端口80映射到路由网格上的端口8080。 |
-p 8080:80/tcp -p 8080:80/udp or | |
-p published=8080,target=80,protocol=tcp -p published=8080,target=80,protocol=udp | 将服务上的TCP端口80映射到路由网格上的TCP端口8080,将服务上的UDP端口80映射到路由网格上的UDP端口8080。 |
Bypass the routing mesh for a swarm service
略
隔离控制网络和数据网络
默认情况,集群管理相关的流量与应用程序之间的通信运行在相同的网络上,通过swarm中的流量是加密的。您可以配置Docker来使用单独的网络接口来处理两种不同类型的流量。初始化或加入swarm时指定--advertise-addr and --datapath-addr。必须为加入群集的每个节点执行此操作。
独立容器的操作在覆盖网络中
将独立容器附加到覆盖网络
ingress网络是在没有--attachable的情况下创建的,这意味着只有集群服务可以使用它,而不是独立的容器。您可以将独立的容器连接到用户定义的覆盖网络,这些覆盖网络使用--attachable标志创建。这使运行在不同Docker守护进程上的独立容器能够进行通信,而不需要在单个Docker守护进程主机上设置路由。
Publish ports
Flag value | Description |
---|---|
-p 8080:80 | 将容器中的TCP端口80映射到覆盖网络上的端口8080。 |
-p 8080:80/udp | 将容器中的UDP端口80映射到覆盖网络上的端口8080。 |
-p 8080:80/sctp | 将容器中的SCTP端口80映射到覆盖网络上的端口8080。 |
-p 8080:80/tcp -p 8080:80/udp | 将容器中的TCP端口80映射到覆盖网络上的TCP端口8080,将容器中的UDP端口80映射到覆盖网络上的UDP端口8080。 |
容器的发现
对于大多数情况,您应该通过service name连接,该名称由支持服务的所有容器(“任务”)进行负载平衡和处理。要获取支持服务的所有任务的列表,请执行DNS查找tasks.