Docker——网络配置
1、介绍
Docker的网络是容器化技术中最核心也最有趣的部分之一。简单来说,Docker网络负责解决两个问题:容器间如何互相通信,以及容器如何与外界(宿主机/互联网)交换数据。Docker通过多种网络模式,为不同的应用场景提供了灵活、安全和高效的解决方案。
Docker安装后,默认会创建三种网络模式:bridge、host和none。此外,还有用于特殊场景的container模式和用于跨主机通信的overlay模式。
2、网络模式
| 网络模式 | 工作原理 | 适用场景 | 核心特点 |
|---|---|---|---|
| bridge (默认) | Docker会在宿主机上创建一个虚拟网桥docker0。容器启动后会创建一对veth虚拟网卡,一端连接容器的eth0,另一端挂载到docker0上。容器通过这个网桥和NAT(网络地址转换)规则与外界通信。 |
单机环境下的通用选择,特别是多个容器需要相互通信的应用,例如Web前端+后端+数据库的组合。 | - 隔离性:容器有独立的网络栈。 - 外部访问:需要通过 -p 或 -P 进行端口映射才能从外部访问。- 默认DNS:默认的 bridge网络不支持通过容器名直接通信(只能通过IP)。 |
| host | 容器不会获得独立的网络命名空间,而是直接共享宿主机的网络栈。也就是说,容器里看到的网络配置和宿主机一模一样。 | 追求极致网络性能的场景,例如需要处理大量网络数据包的应用,或是对网络延迟极为敏感的服务。 | - 高性能:没有NAT转换等额外开销。 - 无隔离:直接使用宿主机端口,容易引发端口冲突,且安全性较低。 - 端口映射失效:在 host模式下,-p参数将不再生效。 |
| none | 容器拥有自己的网络命名空间,但里面只有回环接口lo,没有网卡、IP和路由。这是一个完全隔离的网络环境。 |
对网络安全有极致要求的任务,或是不需要网络连接的离线计算、批量处理作业。 | - 完全隔离:无法与外界进行任何网络通信,最高级别的网络隔离。 |
| container | 新创建的容器共享另一个已存在容器的网络命名空间。它们的网络配置(IP、端口、路由表等)完全相同,但其他方面(如文件系统、进程)仍然是隔离的。 | 特定协作场景,比如"边车模式":一个主应用容器和一个用于监控、日志收集的辅助容器共享网络,这样辅助容器就可以通过localhost直接访问主应用的服务。 |
- 网络共享:容器间通过localhost即可通信。- 命运共同体:如果被依赖的容器停止,共享其网络的容器网络也会失效。 |
| overlay | 在Docker Swarm或Kubernetes等集群环境中,用于连接不同宿主机上的容器,让它们感觉像是在同一个局域网内。 | 分布式应用、微服务架构等需要跨多台主机部署的场景。 | - 跨主机通信:是容器编排工具实现分布式网络的基石。 |
1、bridge
桥接模式,这是Docker默认的网络模式,也是单机环境下最常用的模式。它通过Linux的虚拟网桥技术,在宿主机内构建了一个小型的二层网络。
[root@Anolis ~]# ip add show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:55:e0:4b:d0 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:55ff:fee0:4bd0/64 scope link
valid_lft forever preferred_lft forever
工作原理:
核心组件:docker0网桥
当你安装docker时,它会在宿主机上创建一个名为docker0的网桥,在宿主机上执行ip add show docker0后,会看到有一个ip地址,通常是172.17.0.1/16,这个地址将作为后续容器的网关。
容器的网络命令空间
每个容器都有自己的网络命名空间,拥有独立的网络栈(网卡、路由表、防火墙规则等)。这使得容器的网络环境与宿主机和其他容器是隔离的。
连接机制:veth pait虚拟网卡对
创建:当你启动一个连接到默认bridge的容器时,Docker Daemon会创建一对虚拟网卡,称为 veth pair(virtual Ethernet pair)。它们像一根带两个端头的网线。
连接:Docker将一个端头放入容器的网络命名空间中,并重命名为 eth0;另一个端头则挂载到宿主机的 docker0 网桥上。
效果:这样一来,容器的 eth0 就连接到了虚拟交换机 docker0 上,实现了容器与宿主机、容器与容器之间的连接。
ip地址分配
Docker内置的IPAM会从 docker0 网桥的子网段(如 172.17.0.0/16)中为容器分配一个可用的IP地址(如 172.17.0.2)
与外界的通信:NAT
出站流量:当容器想要访问外网(如 8.8.8.8)时,数据包会从容器的 eth0 发出,到达 docker0 网桥,然后通过宿主机的路由表,将数据包转发到宿主机的物理网卡 eth0 上。此时,数据包的源IP是容器的内网IP(如 172.17.0.2),这在公网上是不可路由的。
MASQUERADE伪装:在数据包离开宿主机之前,iptables的MASQUERADE规则(由Docker自动添加)会将数据包的源IP地址改写为宿主机的公网IP地址。当外网服务器返回数据时,iptables会根据连接跟踪信息,将目标地址再改写回容器的IP 172.17.0.2,并把数据包原路返回给容器。这个过程对容器来说是透明的。
入站流量:端口映射,默认情况下,外部网络无法主动访问容器,因为容器的IP是私有的。要实现外部访问,就需要使用 -p 参数进行端口映射。这背后的原理同样是iptables的DNAT(目标地址转换)规则。
技术实现核心:
-
Linux Bridge:纯软件实现的虚拟交换机。
-
Network Namespace:实现网络隔离。
-
Veth Pair:连接不同Network Namespace的管道。
-
Iptables:负责NAT(网络地址转换)、端口映射和网络隔离(网络策略)。
2、Host网络模式(主机模式)
Host模式直接将容器“暴露”在宿主的网络环境中,相当于去掉了容器和宿主机之间的网络隔离层。
工作原理:
命名空间共享:
在 host 模式下,容器在创建时不会创建新的网络命名空间。它直接使用宿主机的网络命名空间。这意味着容器内的所有网络操作,都直接在宿主机层面生效。
零损耗与零隔离:
因为没有了虚拟网桥、veth pair和NAT(网络地址转换)这些中间层,容器内的网络性能理论上可以达到宿主机的原生水平。但同时,容器可以直接看到并使用宿主机的所有网络资源(如IP地址、端口、路由表、防火墙规则等)。
端口冲突与安全性:
如果你在host模式下启动了一个监听80端口的Nginx容器,它就直接占用了宿主机的80端口。如果再想启动另一个也监听80端口的容器,就会报错。从安全角度看,容器拥有了宿主机的网络权限,如果容器内的应用被攻破,攻击者可能更容易对宿主机网络进行探测或攻击。
技术实现核心:
命名空间服用:容器进程直接运行在宿主的网络命名空间中。
3、None网络模式(空模式)
None模式为容器提供了最高级别的网络隔离。你可以把它理解为一个网络上的“孤岛”。
工作原理:
最小化网络栈:
Docker会为none模式的容器创建独立的网络命名空间,但这个命名空间里只有回环接口 lo,没有其他的网卡。容器内部的路由表也是空的,只有通往127.0.0.1的路由。
完全隔离:
处于none模式的容器,既无法访问宿主机,也无法被宿主机访问,更无法访问外部网络。它不能 ping 通任何地址(除了自己),任何监听在非lo接口上的服务都无法被访问。
特殊用途:
这种模式非常适合于执行无需网络的高安全等级任务。或者,你可以通过docker run --network=none启动容器后,再手动为其配置复杂的自定义网络环境(例如,使用pipework等工具为容器挂载特定的网卡和IP),虽然这通常不是常规用法。
技术实现核心:
Network Namespace:创建独立的命令空间,但不进行任何网络设备配置
4、Container网络模式(容器模式)
这种模式创建了一种“亲密”的容器关系,让两个容器共享同一个网络环境。
工作原理
命令空间继承:
当你使用 --network container:<另一个容器名> 启动一个新容器时,Docker会让这个新容器共享指定容器的网络命名空间,而不是创建一个新的。这意味着,这两个容器对于网络来说,就像在一台主机上的两个进程。它们拥有完全相同的IP地址、端口范围、路由表和网络设备。
通过localhost通信:
这是Container模式最直接的应用。例如,容器A运行了一个Web服务,监听在8080端口。如果你以Container模式启动容器B,并共享容器A的网络,那么容器B内部通过访问 http://localhost:8080 就能直接访问到容器A的服务。这就像访问本机进程一样简单。两个容器之间的网络通信效率极高(等同于本机的进程间通信),因为它们直接走的是回环接口。
限制与风险:
端口冲突:如果两个容器都想监听同一个端口(比如80),那么第二个容器就会启动失败,因为该端口在共享的网络命名空间中已被占用。
依赖性:被共享网络的容器(称为“源容器”)必须先启动。如果源容器停止或重启,共享其网络的容器也会面临网络故障,甚至可能导致自身退出(取决于具体的配置)。
技术实现核心:
命名空间继承:容器创建时,指定使用另一个进程(容器)的已有网络命名空间。
5、Overlay网络模式(覆盖网络模式)
Overlay网络是容器化技术用于构建跨主机容器网络的基石,尤其在Docker Swarm和Kubernetes中扮演着核心角色。它让分布在不同物理机上的容器,就像连在同一个交换机上一样。
工作原理
概念架构:
Overlay网络构建在宿主机底层网络(Underlay Network)之上。它不关心底层物理网络的具体实现(是VLAN还是BGP),而是通过隧道技术,在宿主机网络之上“覆盖”出一层虚拟网络。
数据包的封装和解封:
发送过程:假设主机A上的容器想给主机B上的容器发送数据。数据包首先在容器内生成,目标IP是容器B的Overlay网络IP。当数据包到达主机A的虚拟网桥时,Docker的网络组件会识别出这是一个跨主机的流量。于是,它使用一种封装技术(通常是VXLAN)将原始的容器数据包整个封装到一个新的UDP数据包里。这个新UDP数据包的源IP是主机A的物理IP,目标IP是主机B的物理IP。
传输过程:封装后的数据包在宿主机网络上进行普通的路由和传输。
接收过程:主机B收到这个UDP包后,由Docker的网络组件负责解封装,还原出原始的容器数据包,并根据目标IP将其交给正确的容器。
关键技术:VXLAN
VXLAN(Virtual Extensible LAN,虚拟可扩展局域网)是目前实现Overlay网络的主流协议。它通过在UDP包中封装二层数据帧,克服了传统VLAN的4096个网络ID限制,并能在三层网络之上构建大规模的二层网络。
分布式存储:
为了实现跨主机的容器发现,Docker集成了一个分布式键值存储(如Consul、etcd,在Swarm模式下内置)。当一个新的容器加入Overlay网络时,它的IP和所属网络信息会被记录在这个分布式存储中,从而让所有主机都能知道哪个IP在哪个主机上。
技术实现核心:
VXLAN隧道技术:实现数据包的跨主机封装与传输。
分布式键值存储:维护整个集群的网络状态和成员关系。
Linux Bridge+Network Namespace:在单机内部完成容器网络的基础连接。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)