覆盖网络驱动程序

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

您可以使用 创建用户定义的overlay网络docker network create,就像创建用户定义的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

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

警告

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

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

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

将容器附加到覆盖网络

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

multi-host-network要加入以容器命名的覆盖网络busybox

$ 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 端口映射到8080Overlay 网络上的 TCP 端口,并将容器中的 UDP 80 端口映射到8080Overlay 网络上的 UDP 端口。

覆盖网络的连接限制

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

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

下一步