详解五种Docker容器的网络模式

  Docker 网络设置了容器如何与其他容器和外部服务通信。为了获得网络访问,容器需要是 Docker 网络的一部分。容器可以通信的方式取决于它的网络连接。

  Docker 提供了五种标准网络模式来执行核心网络功能:

  •   Bridge(桥接)
  •   Host(主机)
  •   Overlay(重叠)
  •   IPvLAN
  •   Macvlan

1、桥接网络(Bridge)

  桥接网络在主机机器和容器之间形成一个虚拟桥接。该网络上的容器可以相互通信,但与未连接到该网络的容器隔离。 

 特点:

  每个容器都会获得一个独一无二的 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、使用哪种网络类型

  桥接网络(Bridge)适用于大多数情况。这些网络上的容器可以使用 IP 地址和 DNS 名称相互通信。它们还可以连接到互联网和本地网络。

  主机网络(Host Network)在需要直接使用主机的网络接口并且不需要分离容器网络时很有用。此设置使容器化的应用程序像主机网络的一部分一样运行。

  重叠网络(Overlapping Networks)在容器位于不同 Docker 主机上时需要直接通信时是必需的。它们非常适合为了提高可靠性创建分布式应用。

  在容器需要像网络上的物理设备一样运行时,Macvlan 网络很有用,例如监控网络流量。IPvLAN 网络适用于高级需求,例如对容器 IP 地址、标记和路由的特定控制。

7、创建网络

  使用 docker network create 命令创建一个新网络。通过设置 -d 标志来指定要使用的驱动程序,例如桥接或主机。如果省略标志,将创建一个桥接网络。

docker network create -d ipvlan --subnet $subnet --gateway $gateway -o parent=${ip_net} -o ipvlan_mode=l2 ipvlan_${ipvlan}
docker network create:创建一个新的Docker网络。
-d ipvlan:指定网络驱动类型为ipvlan。
--subnet:指定网络的子网范围。
--gateway:指定网络的网关地址。
-o parent=${ip_net}:指定宿主机上的网络接口。
-o ipvlan_mode=l2:指定ipvlan的模式(这里选择了L2模式,意味着容器将直接连接到宿主机的二层网络。)。
ipvlan_${ipvlan}:指定网络名称,通常使用某种命名模式以区分不同的网络。
参数示例
假设以下变量设置:

subnet="192.168.1.0/24"
gateway="192.168.1.1"
ip_net="eth0"
ipvlan="myipvlan"

创建网络的命令

docker network create -d ipvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
-o parent=eth0 \
-o ipvlan_mode=l2 \
ipvlan_myipvlan

8、容器使用示例(ipvlan)

启动容器的脚本

#/bin/bash
for i in `cat hostslist_ip`
    do
    ip=$i
    name=$(echo $i|sed 's#\.#-#g')
    echo -n "$ip;启动start;$(date +%F-%H:%M:%S)"  >> /tmp/start && docker run -itd --net=ipvlan_192.168.1.0 --ip=$ip --name=docker-$name 镜像名 && echo ";启动end;$(date +%F-%H:%M:%S)"  >> /tmp/start
    #echo -n "$ip;启动start;$(date +%F-%H:%M:%S)"  >> /tmp/start && docker run -itd --net=ipvlan_192.168.1.0 --ip=$ip --name=docker-$name 镜像名 && docker exec -i docker-$name arping -U $ip -c 2 && echo ";启动end;$(date +%F-%H:%M:%S)"  >> /tmp/start
    #sleep 3
done

 

# 创建vlan
docker network create -d ipvlan --subnet 192.168.0/20 --gateway 192.168.1.1 -o parent=eth0 -o ipvlan_mode=l2 ipvlan_192.16.1.1
# 启动容器
docker run --rm --net=MACNET --name openapi-gitbook_192-168-1-21 --hostname=192-168-1-21 --ip=192.168.1.21 -v "/u01/GitBook:/gitbook" registry.01zhuanche.com/gitbook/openapi-gitbook:v0.1 gitbook init

 9、ipvlan的L2模式和L3模式对比

9.1 L2 模式(Layer 2 模式)

9.1.1 特性:

  • 工作在数据链路层(Layer 2):在这个模式下,容器直接桥接到宿主机的物理网络接口,和宿主机在同一个二层网络中。
  • MAC 地址:每个容器都有自己的MAC地址,与宿主机的MAC地址不同。
  • 广播域:容器能够接收到网络中的广播和多播流量。
  • 需要交换机支持:由于容器有自己的MAC地址,交换机必须能够处理每个容器的MAC地址。

9.1.2 使用场景:

  • 适用于需要在同一个二层网络中运行多个容器的场景。
  • 适合对网络延迟敏感的应用程序。

9.2 L3 模式(Layer 3 模式)

9.2.1 特性:

  • 工作在网络层(Layer 3):在这个模式下,容器直接路由到宿主机的物理网络接口,而不是桥接。
  • IP 地址:每个容器有自己的IP地址,但使用宿主机的MAC地址。
  • 无广播:容器无法接收网络中的广播流量,只能接收目标地址明确的数据包。
  • 独立的子网:通常需要为容器指定一个独立的子网,该子网与宿主机的网络分开。

9.2.2 使用场景:

  • 适用于需要隔离广播域并依赖路由来通信的场景。
  • 适合更复杂的网络拓扑,其中容器之间的通信需要通过路由器或防火墙。

9.3 总结

  • L2 模式:容器在同一个二层网络中,有各自的MAC地址,适合需要广播和多播支持的应用。
  • L3 模式:容器在不同的子网中,通过路由进行通信,适合需要隔离广播域并依赖路由通信的应用。

  选择使用哪种模式,取决于你的具体应用需求和网络拓扑。L2模式提供更高的灵活性和广播支持,而L3模式提供更好的网络隔离和路由能力。

 
posted @ 2024-07-04 17:20  Hello_worlds  阅读(12)  评论(0编辑  收藏  举报