【引子】近来,老码农又一次有机会实施IaC 了, 但是环境有了新的变化,涵盖了云环境、虚拟机、K8S 以及Docker,而网络自动化则是IaC中的重要组成,温故知新,面向Docker 的网络是怎样的呢?
Docker 网络机制不仅构建了容器之间以及与外部服务间的高效通信桥梁,还通过灵活的配置选项满足了不同应用场景下的网络隔离与互联需求。每个Docker容器在启动时,都可以选择或指定加入到一个或多个Docker网络中,这些网络可以是Docker自动创建的默认网络(如bridge模式网络),也可以是用户根据需要自定义的网络(如overlay网络,用于支持跨主机容器通信)。
1. Docker 网络
Docker 附带了一个较为强大的网络管理系统,这个系统被设计得既直观又灵活,旨在简化容器、Docker 宿主机以及外部网络之间的复杂通信过程。该系统不仅提供了网络配置、监控和故障排除的工具,还允许用户根据具体需求选择最适合的网络类型,从而实现高效的资源利用和增强的安全性。
Docker 为核心网络功能提供了5个标准网络驱动程序:
-
Bridge
-
Host
-
Overlay
-
IPvLAN
-
Macvlan
Docker 网络管理系统通过隔离不同网络来增强容器的安全性。每个网络都可以视为一个独立的虚拟网络环境,容器之间的通信被限制在它们所加入的网络内部。此外,系统还支持网络策略(如防火墙规则)的配置,以进一步控制容器间的流量和访问权限,防止潜在的安全威胁。
网络管理系统还提供了丰富的监控和调试工具,帮助用户实时了解网络状态、流量分布和潜在问题。通过这些工具,用户可以快速定位并解决网络延迟、丢包等常见问题,确保容器化应用的稳定运行。另外。Docker 网络管理系统支持动态网络配置,允许用户在运行时修改网络设置,而无需停止或重启容器。这一特性大大提高了应用的灵活性和可扩展性。
1.1 桥接网络(Bridge Network)
桥接网络在主机系统与容器环境之间构筑起一座虚拟的联通桥梁,确保网络上的容器能够无缝地进行相互通信,同时与未加入此网络的容器保持隔离状态,维护了网络环境的清晰边界。
每个容器均被赋予了一个独特的IP地址,这一设计不仅促进了容器间的独立识别与交互,还通过与主机的桥接连接,赋予了容器访问本地局域网(LAN)乃至互联网的能力。然而,值得注意的是,尽管这些容器能够参与网络交互,但它们并不以物理实体的形式直接暴露于LAN之中,确保了网络架构的灵活性与安全性。
1.2 主机网络(host network)
采用主机网络模式的容器,其网络配置完全融入了宿主机的网络环境中,实现了无隔离的网络共享。这些容器不再拥有独立的IP地址,而是直接利用宿主机的网络堆栈进行通信。因此,当容器中的进程监听于某一端口(如8888端口)时,该端口即被视为宿主机的一部分,外部用户可通过宿主机的IP地址(如192.168.1.101)及相应端口号(6666)直接访问到容器内的服务,无需进行复杂的端口映射配置。
同理,若数据库服务在容器内监听于3300端口,该服务同样能够通过宿主机的IP地址结合3300端口号被外部访问,体现了主机网络模式下容器与宿主机网络的高度融合。
值得注意的是,在主机网络模式下,容器发出的任何网络活动都将直接以宿主机的身份进行,这使得从网络层面难以区分这些活动是由宿主机还是容器发起的,进一步强调了该模式在简化网络配置的同时,也需对网络安全和隔离性进行额外考量。
1.3 覆盖网络
覆盖网络(Overlay Networks)是构建于多个Docker主机之上的虚拟网络架构,它们巧妙地跨越了物理界限,使得分布在不同Docker主机上的容器能够无缝地进行相互通信,这一过程无需依赖底层操作系统的路由管理。这种网络模式极大地提升了跨主机容器通信的灵活性与效率。
在Docker Swarm集群环境中,覆盖网络被广泛应用于实现容器间的网络互联,但它们的用途并不局限于集群场景。即使面对两个独立运行的Docker Engine实例,且存在直接通信需求的容器间,覆盖网络同样能够大显身手,允许用户在不依赖Docker Swarm完整集群功能的前提下,自行构建出类似集群环境的网络互联能力,从而实现了网络配置的灵活定制与扩展。
尤为值得一提的是,在覆盖网络环境中,不仅容器能够获取到虚拟IP地址以实现跨主机通信,就连Docker主机本身也有机会获得同一网段内的虚拟IP地址。这一设计使得网络拓扑更加清晰,管理更为便捷,同时也为复杂的分布式应用架构提供了坚实的网络支撑。
1.4 IPvLAN 网络
IPvLAN 提供了一种高度灵活且强大的机制,允许对容器内的 IPv4 和 IPv6 地址进行精细化的配置与控制。它不仅限于地址分配,还深入处理第二层(L2)和第三层(L3)的VLAN标记与路由逻辑,确保了网络流量的高效管理与隔离。
在需要将容器化服务无缝集成至现有物理网络架构的场景中,IPvLAN 展现出了其独特的优势与便利性。通过为容器网络分配独立的接口,它实现了与物理网络更为紧密且高效的连接,其性能表现往往优于传统的基于桥接的网络配置,为容器化应用提供了更低的延迟和更高的吞吐量。
在 IPvLAN 的配置下,每个容器都被赋予了独立的 IP 地址,并作为网络的一个直接成员存在,这种设计既保证了容器间的相互独立性,又促进了它们与物理网络之间的无缝通信,为构建复杂、高性能的混合云环境奠定了坚实的基础。
1.5 Macvlan 网络
Macvlan 赋予容器以类似于网络中物理设备的身份进行运作的能力,其核心在于为每个容器分配一个独一无二的 MAC 地址。这一设计使得容器在网络层面上表现得如同直接连接在物理网络上的独立设备一般,极大地增强了容器间以及与外部网络交互的灵活性和效率。
为了支持这种网络类型,用户需要将主机上的一个物理网络接口(如以太网接口)作为资源分配给虚拟网络,以此作为容器接入网络的桥梁。随着 Docker 主机上容器数量的增加,管理并维护大量 MAC 地址成为了一个挑战。因此,构建一个能够高效处理众多 MAC 地址的扩展性网络架构显得尤为重要,以确保网络环境的稳定性和性能。通过精心规划和管理,Macvlan 能够为大型容器化应用提供强大而灵活的网络支持。
2. 使用哪种类型的Docker网络
桥接网络因其广泛的适用性和便捷性,成为了大多数容器化部署场景下的首选。这些网络构建了一个虚拟环境,使得容器之间能够利用 IP 地址和 DNS 名称轻松实现相互通信,同时保持与互联网及本地网络的顺畅连接,满足了多样化的网络需求。
对于特定场景,如要求容器直接利用主机的网络接口,且无需额外网络隔离时,主机网络模式则显得尤为合适。此模式下,容器化应用程序仿佛成为了主机网络体系中的一部分,直接共享网络资源,简化了配置并提升了效率。
而覆盖网络则是跨越多台 Docker 主机实现容器间直接通信的关键技术。它们为构建分布式系统提供了强大的支持,通过增强系统的可靠性和扩展性,成为提升应用性能和服务质量的理想选择。
此外,当应用场景需要对容器进行更为精细化的网络控制,比如要求容器在网络中表现得如同物理设备一般(例如,用于网络流量监控),Macvlan 网络便展现出了其独特的价值。而 IPvLAN 网络则更进一步,专为满足高级网络管理需求而设计,允许用户对容器的 IP 地址、VLAN 标签及路由策略实施精确的定制化配置,以满足最为严苛的网络环境要求。
3. Docker网络的使用示例
以桥接网络为例。使用 docker network create 命令就可以创建新的Docker网络,通过设置-d 标志来指定的网络类型,例如桥接网络或主机网络。如果省略该标志,则默认创建桥接网络。
在一个终端窗口中运行以下命令:
go
$ docker network create kd-network -d bridge
创建网络完成后会得到网络ID ,因为没有连接任何容器,新的网络目前还没啥用。但是可以通过使用 docker run 命令设置 -- network 标志 将新容器附加到网络。
go
$ docker run -it --rm --name container1 --network kd-network busybox:latest
这时如果启动另一个 Ubuntu 容器,这次没有 -- network 标志:
go
$ docker run -it --rm --name container2 busybox:latest
这些容器还不在同一个网络中,因此它们不能直接相互通信,可以将 Container 2连接到网络:
go
$ docker network connect test-network container2
这些容器现在共享一个网络,能够彼此发现。Docker 允许在不重新启动容器的情况下自由地管理网络连接,还可以将容器从它们不再需要参与的网络中移除:
$ docker network disconnect test-network container2
而且,所做的任何更改都将立即生效。如果想删除一个网络,断开或停止所有使用它的 Docker 容器,也非常方便:
$ docker network rm test-network
4. 一句话小结
Docker 的网络子系统提供了多样化的策略,用以精细地管理容器间的通信方式、它们与相邻容器的互操作性,以及它们与 Docker 主机之间的交互。在同一网络域内的容器,能够灵活地通过各自的名称或分配的 IP 地址建立连接,这种设计极大地简化了网络配置,并促进了容器间的无缝协作。
尽管 Docker 容器间的网络隔离程度相较于传统虚拟机(VM)而言显得较为宽松,但 Docker 依然提供了诸如 macvlan 这样的高级网络模式,使得容器能够在网络层面表现得如同物理设备一般,直接参与网络流量的转发与处理,从而满足了特定场景下对网络深度集成与灵活控制的需求。
关于IaC的更多内容,可以参考本人参与翻译的《基础设施即代码(IaC)》一书。
【管理阅读】