覆盖网络驱动

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

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

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

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

创建一个覆盖网络

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

PortsDescription
2377/tcpThe default Swarm control plane port, is configurable with docker swarm join --listen-addr
4789/udpThe default overlay traffic port, configurable with docker swarm init --data-path-addr
7946/tcp, 7946/udpUsed for communication among nodes, not configurable

要创建一个其他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查找,可以发现容器。

Flag valueDescription
-p 8080:80Map TCP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/udpMap UDP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/sctpMap SCTP port 80 in the container to port 8080 on the overlay network.
-p 8080:80/tcp -p 8080:80/udpMap TCP port 80 in the container to TCP port 8080 on the overlay network, and map UDP port 80 in the container to UDP port 8080 on the overlay network.

覆盖网络的连接限制

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

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

下一步