Vmware和Docker的网络模式讲解
vmware
VMware中常用三种网络连接模式,分别是桥接模式
,主机模式
,NAT模式
桥接模式
桥接模式就是把宿主机的网卡与虚拟机的虚拟网卡通过虚拟网桥连接起来,将宿主机比作一个交换机,那么虚拟机还有宿主机全部连接在这一个交换机上,且他们属于同一网段,互相可以通信并不影响。(此时虚拟机拥有跟宿主机局域网内相同网段的IP)
当局域网内不仅有宿主机,还有主机A,主机B。虚拟机不仅仅可以在虚拟机内互通,也可以虚拟机与宿主机,更可以直接访问到主机A,主机B互通。支持访问外网资源。(可以把虚拟机想象成与宿主机对等的真实机器)
真正设置的时候,最好是使用虚拟网络编辑器
里桥接模式指定要桥接的网卡
, 来指定宿主机用的是哪个网卡上网,从而达到相同模拟,获取dhcp的能力.
NAT模式
相当于在虚拟机网卡和宿主机虚拟网卡之间,加了一个交换机。
- 此时虚拟机和虚拟机互通,只需要通过交换机转发报文即可。
- 此时虚拟机与宿主机互通,虚拟机通过这个交换机发送报文到宿主机上的虚拟网卡上。
- 此时虚拟机想访问外部网络或局域网其他主机时,此时可以先将报文通过虚拟机发送到宿主机上的虚拟网卡上,然后宿主机内部再将报文通过真实的物理网卡转发出去。
主机模式
相当于无物理网卡的NAT模式,只有宿主机内部和虚拟机互相通讯,保证安全。
桥接模式和NAT模式的区别
- 桥接模式中的真实网络,比如路由器,需要同意机器可以自动获取DHCP,能够自动为网络内的主机分配IP地址。(因为桥接模式的虚拟机相当于一个真实的机器,只有拿到了IP,才能跟宿主机在同一个局域网内,才能通讯)。NAT则不需要,NAT中的虚拟机跟宿主机通过一个虚拟的交换机,进而做到2个虚拟网卡可以互相通讯。
- 桥接模式中的虚拟机可以被局域网内的其他主机访问到(因为都在同一个局域网内)。而NAT模式则无法直接被局域网内其他机器访问到(不知道真实的虚拟机IP,因为发出去的报文的source IP是nat转换后到了宿主机的真实物理网卡上,即为宿主机的IP地址)
docker
docker使用的是Linux Container,是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
就是使用namespance技术,来隔离网络,进程等资源。
如果namespace不同,就已经被隔离,没有讨论的意义。所以以下是在同一个namespace下
Bridge 桥接模式
docker默认的网络模式。原理跟vmware
的NAT模式相同。安装docker时,会给宿主机创建一个docker0
网卡,该网卡会与一个虚拟交换机相连,当容器以Bridge模式创建启动时,会给容器创建一个虚拟网卡,该网卡分配的IP与宿主机的docker0
所在同一个局域网内(一般是172.16.0.0)。然后过程就和vmware
的NAT模式完全相同。
host模式
直接使用宿主机的当前网络,容器暴露的端口可以直接在宿主机中查到,可以当成就是在宿主机真实执行的程序。
Container 网络模式
与指定的容器公用一个网络,所以这2个容器不能有一样的端口暴露。
None 网络模式
不会给容器创建网卡,此时容器无法与外部通讯。
注意
- MAC系统下,安装docker后不会创建
docker0
网卡,同时host模式也不会生效。原因是
Docker For Mac的实现和标准Docker规范有区别,Docker For Mac的Docker Daemon`是运行于虚拟机(xhyve)中的, 而不是像Linux上那样作为进程运行于宿主机.
因此`Docker For Mac`没有`docker0`网桥,不能实现host网络模式,host模式会使Container复用Daemon的网络栈(在xhyve虚拟机中),而不是与Host主机网络栈.
这样虽然其它容器仍然可通过xhyve网络栈进行交互,但却不是用的Host上的端口(在Host上无法访问)。
bridge网络模式 -p 参数不受此影响,它能正常打开Host上的端口并映射到Container的对应Port。文档在这一点上并没有充分说明,容易踩坑。
- Windows下安装docker,实际上是使用了
Hyper-V
虚拟机来安装了Linux系统,然后再在其中安装了docker。所以host模式也是无效,不会暴露当前windows系统中,而是暴露到了虚拟机Linux中。