详解五种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 模式:容器在不同的子网中,通过路由进行通信,适合需要隔离广播域并依赖路由通信的应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」