覆盖网络驱动

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

这使得虚拟可扩展局域网(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 映射到 overlay 网络上的端口 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个容器时,overlay网络会变得不稳定,容器间的通信可能会中断。

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

后续步骤