详解五种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 模式)
特性:
- 工作在数据链路层(Layer 2):在这个模式下,容器直接桥接到宿主机的物理网络接口,和宿主机在同一个二层网络中。
- MAC 地址:每个容器都有自己的MAC地址,与宿主机的MAC地址不同。
- 广播域:容器能够接收到网络中的广播和多播流量。
- 需要交换机支持:由于容器有自己的MAC地址,交换机必须能够处理每个容器的MAC地址。
使用场景:
- 适用于需要在同一个二层网络中运行多个容器的场景。
- 适合对网络延迟敏感的应用程序。
9.2 L3 模式(Layer 3 模式)
特性:
- 工作在网络层(Layer 3):在这个模式下,容器直接路由到宿主机的物理网络接口,而不是桥接。
- IP 地址:每个容器有自己的IP地址,但使用宿主机的MAC地址。
- 无广播:容器无法接收网络中的广播流量,只能接收目标地址明确的数据包。
- 独立的子网:通常需要为容器指定一个独立的子网,该子网与宿主机的网络分开。
使用场景:
- 适用于需要隔离广播域并依赖路由来通信的场景。
- 适合更复杂的网络拓扑,其中容器之间的通信需要通过路由器或防火墙。
9.3 总结
- L2 模式:容器在同一个二层网络中,有各自的MAC地址,适合需要广播和多播支持的应用。
- L3 模式:容器在不同的子网中,通过路由进行通信,适合需要隔离广播域并依赖路由通信的应用。
选择使用哪种模式,取决于你的具体应用需求和网络拓扑。L2模式提供更高的灵活性和广播支持,而L3模式提供更好的网络隔离和路由能力。