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规则参考解析图:
欢迎来访! yangsir!!