之前分享过容器之间的相互访问,今天在这里分享一下容器是如何与外部世界通信的。这里涉及两个方向:
容器访问外部世界
外部世界访问容器
进入容器,可以看到容器可以正常访问到www.baidu.com网站
现在我们想一下容器是如何访问到外网的。这里的关键就是NAT,我们查看一下docker host的iptables规则
其含义是:来自 172.17.0.0/16 网段的包,目标地址是外网(! -o docker0),就把它交给 MASQUERADE 处理。而 MASQUERADE 的处理方式是将包的源地址替换成 host 的地址发送出去,即做了一次网络地址转换(NAT)。
接下来我们通过tcpdump抓包来分析容器访问外网的流量走向。在容器中ping www.baidu.com
通过tcpdump抓取docker0的流量,可以看到容器bbox1 172.17.0.4访问220.181.38.149(百度的IP地址)流量,下图为容器bbox1的路由流量走向
通过tcpdump抓取ens33网卡的流量,可以看到host 192.168.216.31访问220.181.38.149(百度的IP地址)流量,下图为host的路由流量走向
通过上述实验,我们可以总结出如下图的容器访问外网的流量走向。