docker info
查看配置信息里面有不同的网络模式。

网络模式:默认的模式桥接网络bridge,这个是所有网络模式的基础。以后可以扩展其他的网络模式。

bridge与host的区别:bridge模式,与容器之间的寻址是借助虚拟网卡,不会影响当前宿主机所在的网络环境;而host模式,与容器之间的须知是借助物理网卡,所以可能会影响到当前宿主机所在的网络环境。

docker 区别 宿主机系统 docker与宿主机的关系_docker 区别 宿主机系统


docker 区别 宿主机系统 docker与宿主机的关系_IP_02

容器之间的网络隔离:通过网络名称空间来隔离。

绕过网络名称空间实现容器之间的通信:

方式1:Linux提供的机制——虚拟网卡设备对vt实现跨越网络名称空间的两个容器之间的通信,这种方式是两两通信,弊端:当容器数量过多,且都需要进行通信,会导致虚拟网卡数量剧增

方式2:网桥bridge,挂载很多的网卡,且网卡之间可以通信,每个容器可以在网桥上挂载一个网卡,当容器A想要发送报文给容器B,会先发到网桥上,再由其虚拟网卡设备对在网桥上发送广播报文,B响应IP验证通过,接收,其他容器丢弃。注意:当网桥上连接的容器越多,其广播风暴的压力越大,带宽的压力也就越大。广播风暴压力大的时候有个表现,top命令下的软中断值偏高,Linux输入命令会特别卡。

docker 区别 宿主机系统 docker与宿主机的关系_IP_03


docker 区别 宿主机系统 docker与宿主机的关系_寻址_04


说下后续:容器之间首次通信经过网桥IP寻址之后,会在报文中找到对方容器的mac地址,之后的通信会使用mac地址,涉及更下一层的协议。

host网络模式,不要所有的容器都走host网络。关于docker安装容器的时候的网络设置,默认是bridge网桥模式。

*外部与docker容器的通信原理:*通过宿主机的物理网卡eth0:Ipv4_forward=true以上参数设置为true,当外部请求过来,eth0相当于路由器的作用,将请求报错发送到网桥上,以广播形式找到对应的容器IP接收,其他的容器丢弃。反之如果Ipv4_forward=false,则宿主机接到请求,且不是自己的IP,会将报文丢弃,不会转发给容器

*端口映射:*容器本身的IP地址是在路由表上的,外部请求必须先发送至宿主机,再由宿主机转发至容器,如上述原理。宿主机转发至容器时需要将IP地址篡改成容器的IP地址,也就是容器创建时自定义的一条规则,这条规则是利用Linux已有的Iptables,创建规则【它不单单是防火墙】。可以篡改目的IP地址与目的端口号,以便可以被网桥上虚拟网卡对识别,并被容器接收报文信息。

docker 区别 宿主机系统 docker与宿主机的关系_名称空间_05


如何查看IP、端口篡改规则?

docker 区别 宿主机系统 docker与宿主机的关系_寻址_06

sudo iptables -nvL FORWARD
sudo iptables -nvL INPUT
sudo iptables -nvL OUTPUT
sudo iptables -nvL PREROUTING
sudo iptables -nvL POSTROUTING

docker 区别 宿主机系统 docker与宿主机的关系_docker 区别 宿主机系统_07


篡改规则的原理是什么?

一个网络请求都需要经过4表5链

INPUT:流入本机的网络规则

OUTPUT:流出本机的网络规则

FORWARD:转发的网络规则

PREROUTING:路由前的网络规则

POSTROUTING:路由后的网络规则

NET表:篡改IP地址

DNET表:篡改目标IP地址

SNET表:篡改源IP地址

注意:Iptables规则不可随意动,网络软件不要随意装!

查看Ubuntu网络情况:

ifconfig -a

docker 区别 宿主机系统 docker与宿主机的关系_寻址_08


docker 区别 宿主机系统 docker与宿主机的关系_寻址_09


什么时候使用host模式?

需要用到宿主机网络设置的时候,使用host模式。

场景一:如果有编译容器,在访问版本控制网络时比如github、SVN等,需要在容器上注入鉴权信息,一旦有多个容器java、python等需要将鉴权信息注入多次,这种情况下可以使用host模式,将鉴权信息置于宿主机上。

场景二:将nginx容器以host模式启动,可以访问宿主机网络,nginx本身有反向代理的能力,可以访问容器网络。这种模式的插件容器在k8s有现成的供使用。

Contains模式
–link:两个容器连接,将一个容器的网络信息以环境变量的形式注入到另外一个容器里
这种命令无法跨越宿主机去实现两个容器的连接。
还可以使用端口映射的方式实现容器之间的连接
服务发现:自动的发现IP地址。比如:多个微服务之间实现寻址,根据域名,利用DNS协议,自动监控到服务的IP地址的变化,并且切换DNS。

docker 区别 宿主机系统 docker与宿主机的关系_寻址_10