网络简单介绍
在介绍 Docker 的网络模式之前,先简单说下我们在使用 Vmware
虚拟机中的网络模式,形成对比,更好理解。
1、Vmware
中的网络模式
1.1、VMnet0(桥接模式)
虚拟机通过宿主机的物理网卡直接连接到外部网络,类似于在物理网络中新增了一台独立设备。虚拟机会获得与宿主机同网段的 IP 地址,由外部 DHCP 服务器或手动分配。
桥接模式的原理如下图所示:
这种模式下,VMware虚拟出了一个交换机。
首先,该虚拟交换机通过主机的物理网卡连接到主机所在的网络中,然后所有的虚拟机都通过虚拟交换机接入到主机所在网络中。
所以在该模式下,虚拟机和主机位于同一网络中,因此在主机接入网络的前提下,虚拟机和物理机是可以互通的。
可以把虚拟交换机
当成平时生活中的物理交换机
,用于扩展我们的 LAN 口。
1.2、VMnet8(NAT模式)
虚拟机通过宿主机的 NAT
服务共享其 IP
访问外部网络。宿主机充当路由器,将虚拟机的内部IP转换为宿主机的公网IP进行通信。
NAT模式的原理如下图所示:
这种模式下,VMware虚拟出了一个交换机,一个DHCP服务以及一个NAT服务,相当于构成了一个虚拟路由器。
虚拟路由器通过主机的物理网卡连接到主机所在的网络,虚拟机则全部连接到虚拟路由器上,组成了一个子网。
此时所有的虚拟机位于同一网络,因此彼此之间可以互通,但是主机不能与虚拟机互通。
为使主机能够和虚拟机互通,VMware 又在主机中虚拟出了一个网卡,并连接到了这个虚拟路由器中,这时主机便可虚拟机互通了。
首先需要明确的一点,就是在这种模式下边, VMware它不仅虚拟出来了一个交换机,它还同时虚拟出来了一个 DHCP 服务以及一个 NAT 服务。
实际上这三者组合起来就相当于构成了一个虚拟的路由器,然后这个虚拟路由器的一端也就是它的WAN口,会通过这个宿主机(图中物理机-03),连接到这个真正的路由器上,相当于是它的一个WAN口上边。好了,然后所有的虚拟机都会接入到这个虚拟的路由器当中。
其实就相当于是我们这个虚拟路由器,那它又在真正的这个路由器的局域网下边又创建了一个子局域网。那这些虚拟机都位于这个子网内,所以这种情况下虚拟机之间是可以互相通信的,并且这个虚拟机也是可以访问互联网的。
原理
在访问互联网的时候,这个数据包会经过两次NAT的地址转换。
一次是由这个虚拟路由器,由这个子网 IP 转换成这个局域网的IP。
再一次就是由这个真正的路由器当中的NAT,由这个局域网的这个私网 IP 转换成互联网上面的一个公网IP。
目前这个主机在 NAT 模式下边,其实是处在两个网络当中的,一个是我们这个虚拟网络,还有一个是咱们这个真正的物理网络。
端口映射(Port Forwarding):
允许外部网络通过宿主机的特定端口访问虚拟机内的服务(需手动配置)。
例如:将宿主机的 8080
端口映射到虚拟机的 80
端口,用户访问 宿主机IP:8080
即可访问虚拟机的Web服务。
1.3、VMnet1(仅主机模式)
虚拟机与宿主机通过虚拟网络连接,但完全隔离于外部网络。宿主机提供虚拟交换机,仅允许虚拟机间及与宿主机通信。
仅主机模式的原理如下图所示:
这种模式,和NAT模式十分相似,唯一的区别是,虚拟路由器并未连接到主机所在的网络中,因此主机和虚拟机之间可以互通,但是虚拟机不能访问互联网。
这个模式就非常非常简单了。仅主机模式其实和 NAT 模式十分相似,这里虚拟出来了一个路由器,然后这些虚拟机也都会接入到这个路由器当中,那并且这个 VMware 在主机当中也虚拟出来了一块网卡。这个网卡也接入到了这个虚拟的路由器当中。
2、Dockers
中的网络模式
2.1、Bridge 模式
Docker
默认的网络模式。当你启动一个容器而没有指定网络模式时,它将使用bridge模式。在这种模式下,Docker 会在主机上创建一个名为 docker0
的虚拟网桥,作为容器之间的默认网桥。每个容器都会连接到这个网桥,并获得一个独立的 IP 地址,该地址通常在172.17.x.x
或 192.168.x.x
范围内。
容器可以通过 docker0
网桥与外部网络通信,但这种通信默认情况下需要通过NAT(网络地址转换)进行。这意味着从外部网络访问容器时,必须先映射端口到宿主机。
+---------------------------------------------------+
| Host Machine |
| |
| +------------+ +------------+ |
| | Container1 | | Container2 | |
| | 172.17.0.2 | | 172.17.0.3 | |
| +-----+------+ +-----+------+ |
| | vethXXXX | vethYYYY |
| | | |
| +-----+--------------------+-------+ |
| | docker0 | |
| | (172.17.0.1) | |
| +----------------+-----------------+ |
| | eth0 |
| | |
+-------------------+-------------------------------+
|
[Physical Network]
docker0
桥接设备:Docker 创建的虚拟以太网桥veth pair
:虚拟以太网设备对,一端在容器内(显示为 eth0),一端在主机上(连接到 docker0)iptables NAT 规则
:实现容器与外部网络的通信
端口映射:如果你想让外部网络访问容器内的服务,你需要在运行容器时通过-p
或--publish
选项指定端口映射。这样,Docker会设置 iptables
规则,将宿主机上的特定端口流量重定向到容器内的对应端口。
2.2、Host 模式
Host 网络模式是 Docker 中最简单直接的网络模式,容器直接使用宿主机的网络命名空间,与宿主机共享网络栈。在这种模式下,容器不会获得独立的网络环境,而是直接使用主机的 IP 地址和端口。
网络架构原理图:
+-----------------------------------------------------------+
| Host Machine |
| |
| +----------------+ +----------------+ |
| | Container A | | Container B | |
| | (host网络模式) | | (host网络模式) | |
| +-------+--------+ +-------+--------+ |
| | | |
| +-------+----------------------+--------+ |
| | Host Network Stack | |
| | (eth0, 所有网络接口, 路由表, iptables) | |
| +----------------------------------------+ |
| |
| +---------------------+ |
| | Physical Network | |
| | Interface | |
| +---------------------+ |
+-----------------------------------------------------------+
- 容器:在这个例子中,容器直接使用宿主机的网络栈,包括其 IP 地址和端口。这意味着任何在容器中运行的服务都必须确保使用的端口不与宿主机上的现有服务冲突。
- 宿主机:宿主机提供了一个共享的网络命名空间给容器使用,使得容器可以直接通过宿主机的网络接口进行通信。
生成原理
- 共享网络栈:当容器以host模式运行时,它将直接使用宿主机的网络栈,这意味着容器内的网络配置(如IP地址、路由表等)与宿主机完全相同。
- 端口冲突风险:由于容器和宿主机共享相同的网络视图,容器中的服务必须小心选择端口号,以免与宿主机上的其他服务发生冲突。例如,如果宿主机上已经有一个服务在80端口运行,那么容器内就不能再有服务尝试绑定到这个端口。
- 增强性能:因为没有额外的网络地址转换(NAT)层,host模式下的网络性能通常优于bridge模式。
- 减少隔离性:虽然host模式提高了网络性能并简化了网络配置,但它也减少了容器之间的网络隔离。所有容器和宿主机上的服务都在同一个网络环境中,这可能增加安全风险。
2.3、Container 模式
Container 网络模式(也称为"容器共享网络命名空间"模式)是一种特殊的Docker网络模式,它允许一个容器共享另一个容器的网络命名空间。在这种模式下,多个容器共享同一个网络环境,包括 IP 地址、端口范围、网络接口等。
特性
- 共享网络栈:当使用container模式时,新启动的容器不会创建自己的网络命名空间,而是复用已经存在的某个容器的网络命名空间。这意味着这两个容器将共享同一个IP地址和端口集合,以及其它网络资源。
- 减少隔离性:由于两个容器共享同一个网络环境,这种设置减少了容器之间的网络隔离。因此,这种模式通常用于那些需要在容器之间进行直接通信而无需经过外部网络的情况。
- 简化网络配置:因为两个容器共享网络配置,所以在其中一个容器中配置的服务可以直接被另一个容器访问,无需额外的网络配置或端口映射。
网络架构原理图
+-----------------------------------------------------------+
| Host Machine |
| |
| +----------------+ |
| | Primary | |
| | Container | |
| | (拥有独立网络栈) | |
| | 172.17.0.2 | |
| +-------+--------+ |
| | vethXXX |
| +-------+--------+ +----------------+ |
| | docker0 | | Secondary | |
| | 172.17.0.1/16 | | Container | |
| +-------+--------+ | (共享Primary容器网络)| |
| | | 172.17.0.2 | |
| +-------+--------+ +----------------+ |
| | 物理网络接口 | |
| | eth0 | |
| +----------------+ |
+-----------------------------------------------------------+
关键特点
- 网络栈共享:多个容器共享同一个网络命名空间
- IP地址共享:所有共享容器使用相同的IP地址
- 端口共享:容器间需要协调端口使用,避免冲突
- 隔离性降低:共享网络的容器可以互相访问 localhost 服务
完毕。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。