覆盖网络驱动程序

overlay 网络驱动程序在多个 Docker 守护进程主机之间创建分布式网络。该网络位于(覆盖)主机特定网络之上,允许连接到它的容器在启用加密时安全地进行通信。Docker 透明地处理每个数据包到来自正确 Docker 守护进程主机和正确目标容器的路由。

您可以使用 docker network create 创建用户定义的 overlay 网络,与创建用户定义的 bridge 网络的方式相同。服务或容器可以同时连接到多个网络。服务或容器只能通过它们各自连接的网络进行通信。

覆盖网络通常用于在 Swarm 服务之间创建连接,但您也可以使用它来连接在不同主机上运行的独立容器。当使用独立容器时,仍然需要使用 Swarm 模式在主机之间建立连接。

本页面描述了覆盖网络的一般情况,以及在与独立容器一起使用时的情况。有关 Swarm 服务的覆盖网络信息,请参阅 管理 Swarm 服务网络

创建覆盖网络

在开始之前,您必须确保参与节点能够通过网络进行通信。下表列出了参与覆盖网络的每个主机需要打开的端口。

端口描述
2377/tcp默认的 Swarm 控制平面端口,可以使用 docker swarm join --listen-addr 进行配置
4789/udp默认的覆盖网络流量端口,可以使用 docker swarm init --data-path-addr 进行配置
7946/tcp, 7946/udp用于节点之间的通信,不可配置

要创建一个其他 Docker 主机上的容器可以连接到的覆盖网络,请运行以下命令

$ docker network create -d overlay --attachable my-attachable-overlay

--attachable 选项允许独立容器和 Swarm 服务连接到覆盖网络。如果没有 --attachable,只有 Swarm 服务才能连接到网络。

您可以指定 IP 地址范围、子网、网关和其他选项。有关详细信息,请参见 docker network create --help

在覆盖网络上加密流量

使用 --opt encrypted 标志加密通过覆盖网络传输的应用程序数据

$ docker network create \
  --opt encrypted \
  --driver overlay \
  --attachable \
  my-attachable-multi-host-network

这会在虚拟可扩展局域网 (VXLAN) 级别启用 IPsec 加密。此加密会造成不可忽略的性能损失,因此您应该在生产环境中使用此选项之前对其进行测试。

警告

不要将 Windows 容器附加到加密的覆盖网络。

Windows 不支持覆盖网络加密。当 Windows 主机尝试连接到加密的覆盖网络时,Swarm 不会报告错误,但 Windows 容器的网络会受到以下影响

  • Windows 容器无法与网络上的 Linux 容器通信
  • 网络上 Windows 容器之间的数据流量不会被加密

将容器附加到覆盖网络

将容器添加到覆盖网络使它们能够与其他容器通信,而无需在各个 Docker 守护进程主机上设置路由。执行此操作的先决条件是主机已加入同一个 Swarm。

要使用 busybox 容器加入名为 multi-host-network 的覆盖网络,请执行以下操作

$ docker run --network multi-host-network busybox sh

注意

这仅适用于可附加的覆盖网络(使用 --attachable 标志创建)。

容器发现

在覆盖网络上发布容器的端口会将这些端口打开到同一网络上的其他容器。可以通过使用容器名称执行 DNS 查找来发现容器。

标志值描述
-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

覆盖网络的连接限制

由于 Linux 内核设置的限制,当 1000 个容器位于同一主机上时,覆盖网络会变得不稳定,并且容器之间的通信可能会中断。

有关此限制的更多信息,请参阅 moby/moby#44973.

下一步