Docker网络规则

Docker网络规则简介

Bridge网络模式下的容器通信原理

容器通信网络参考图如下:

1. 容器的SNAT规则

容器也可以与外部通信,我们看一下主机上的Iptable规则,每创建一个容器,都会有相应的NAT规则:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
MASQUERADE: 在这里表示的意思是伪装

规则说明:

这条规则会将源地址为172.17.0.0/16的包(即容器产生的数据包),并且不是从docker0网卡发出的,进行源地址转换,转换成主机网卡的地址。
Eg :
假设主机有一块网卡为eth0,IP地址为192.168.1.10/24,网关为192.168.1.1。从主机上一个IP为172.17.0.1/16的容器中ping京东(120.52.148.118),IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上,
然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关192.168.1.1/24,接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开),这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。
这样,在外界看来,这个包就是从192.168.1.10上发出来的,Docker容器对外是不可见的

SNAT规则参考解析图:

2. 容器的DNAT规则

外面网络也可以访问容器内的服务,需要一些规则控制

//创建一简单的web容器:
docker run -d  --name web  -p 80:80  nginx

//iptables会多一条DNAT规则:
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.4:80

规则说明:

新增加的规则意思是对主机eth0收到的目的端口为 80 的tcp流量进行DNAT转换,将流量发往172.17.0.4:80,即所创建的容器80端口,外界只需访问192.168.1.10:80就可以访问到容器中的服务

DNAT规则参考解析图:

 

 

  

 

posted @ 2020-11-10 17:09  淡淡定定  阅读(363)  评论(1编辑  收藏  举报