Docker 网络设置了容器如何与其他容器和外部服务通信。为了获得网络访问,容器需要是 Docker 网络的一部分。容器可以通信的方式取决于它的网络连接。Docker 提供了五种标准网络模式来执行核心网络功能:Bridge(桥接)、Host(主机)、Overlay(重叠)、IPvLAN、Macvlan。
1、桥接网络
桥接网络在主机机器和容器之间形成一个虚拟桥接。该网络上的容器可以相互通信,但与未连接到该网络的容器隔离。
每个容器都会获得一个独 一无二的 IP 地址。通过与主机的桥接连接,这些容器还可以相互交互,与本地网络(LAN)和 Internet 互联。然而,它们不会以物理设备的形式出现在 LAN 上。
2、主机网络(Host Network)
使用主机网络模式的容器使用与主机机器相同的网络设置,而不会被隔离。它们没有单独的 IP 地址。相反,它们使用的任何端口都直接链接到主机网络。例如,如果容器进程使用端口 8080,则可以通过 192.168.1.101:8080(即主机的 IP 地址和端口号)访问它。
由于应用程序容器使用端口 8080,因此不需要端口映射,因为在这种情况下,容器使用主机端口。我们的数据库使用端口 5432,因此可以通过主机的 IP 地址和 5432 端口进行访问。
3、重叠网络(Overlay Network)
重叠网络是跨越多个 Docker 主机的网络。它们可以让这些主机上的容器相互通信,而无需操作系统管理路由。
重叠网络用于 Docker Swarm 集群。但是,如果有两个单独运行的 Docker 引擎,并且需要直接连接它们的容器,也可以这样使用它们。
上图进行了简化。在真实场景中,正如容器一样,主机也会从重叠网络获取虚拟 IP 地址,而且它们的范围是相同的。
4、IPvLAN 网络
IPvLAN 是一种高级模式,可提供对容器的 IPv4 和 IPv6 地址进行详细控制的能力,它还可以处理第 2 层和第 3 层 VLAN 标记和路由。
如果你需要将容器服务连接到已有物理网络,此模式会很有用。IPvLAN 网络具有自己的接口,其性能可能比基于桥接网络的网络更好。
上图显示了 IPvLAN 设置中的所有内容,包括容器,都有自己的 IP 地址,并且是网络的一部分。
5、Macvlan 网络
Macvlan 是一种更高级的选项,让容器能像网络上的物理设备一样运行。它通过为每个容器分配自己的 MAC 地址来实现这一点。
对于此类型的网络,你需要将主机的一个物理网络接口分配给虚拟网络。此外,更广泛的网络还应设置为处理来自具有大量容器的 Docker 主机的许多 MAC 地址。
6、使用哪种网络类型
桥接网络适用于大多数情况。这些网络上的容器可以使用 IP 地址和 DNS 名称相互通信。它们还可以连接到互联网和本地网络。
主机网络在需要直接使用主机的网络接口并且不需要分离容器网络时很有用。此设置使容器化的应用程序像主机网络的一部分一样运行。
重叠网络在容器位于不同 Docker 主机上时需要直接通信时是必需的。它们非常适合为了提高可靠性创建分布式应用。
在容器需要像网络上的物理设备一样运行时,Macvlan 网络很有用,例如监控网络流量。IPvLAN 网络适用于高级需求,例如对容器 IP 地址、标记和路由的特定控制。
7、创建网络
使用 docker network create 命令创建一个新网络。通过设置 -d 标志来指定要使用的驱动程序,例如桥接或主机。如果省略标志,将创建一个桥接网络。
在第一个终端窗口中运行以下命令:
创建的网络 ID 将显示在终端中。目前,新网络还无法使用,因为还没有连接任何容器。
但是,你可以通过在 docker run 命令中设置 --network 标志将新容器连接到网络。在第二个终端窗口中运行以下命令:
接下来,在第三个终端窗口中启动另一个 Ubuntu 容器,这次不使用 --network 标志:
现在,使用它们的名称在两个容器之间进行通信:
容器尚未加入到同一个网络中,因此它们无法直接相互通信。
使用第一个终端窗口将 container2 连接到网络中:
容器现在共享同一个网络,这使它们能够相互发现:
Docker 可以在不重新启动容器的情况下自由管理网络连接。了解了如何在创建容器后连接容器,也可以从它们不再需要参与的网络中删除容器:
如果想删除一个网络,需要先断开或停止使用该网络的所有 Docker 容器,然后将网络的 ID 或名称传递给 network rm:
总结
Docker 的网络系统为管理容器如何与其他容器、相邻容器和 Docker 主机通信提供了多种方式。同一网络中的容器可以使用其名称或 IP 地址连接。