1. 程式人生 > >centos7下安裝docker(12.4容器如何與外部進行通信)

centos7下安裝docker(12.4容器如何與外部進行通信)

tro net ont 安裝docker 數據包 pin pdu 網卡 asq

1.容器如何訪問外部

前面我們做了很多試驗:只要host能連外網,使用默認bridge(docker0)創建得容器就能訪問外網,那麽容器是怎樣訪問外網的呢?

註:這裏的外網不僅是internet,包括internet

技術分享

容器是怎樣訪問外網的呢?

這裏的關鍵就是NAT。我們查看一下docker host上的iptables的規則

技術分享

可以看到iptables對docker0這個bridge做了策略:當網橋docker0收到外出的包,把他交給MASQUERADE處理。而MASQUERADE的處理方式是將包的源地址替換成host地址發送出去,即做了一次網絡地址轉換(NAT)

我們可以通過tcpdump查看地址如何轉換。先查看docker host的路由表:

技術分享

默認路由通過ens160(host網卡) 發出去的,所以我們要同時監控ens160和docker0上的icmp(ping)數據包

技術分享

源地址容器發送請求

技術分享

docker0接收到源地址的請求,docker0將請求交給MASQURADE進行處理

技術分享

我們可以看到ens160的變化:MASQUERADE將源地址的包轉換成Host的地址,發送出去(這就是NAT的網絡地址轉換,深刻理解了)

這就是iptables NAT規則的處理結果,從而保證數據包能到達外網

繼續盜圖技術分享

處理過程:1.容器發送ping包:172.17.0.5>www.baidu.com

2.docker0收到包後,發現是發送到外網的。交給NAT處理

3.NAT將源地址轉換成ens160的IP:192.168.7.222>www.baidu.com

4.ping包從ens160發出去。到達www.baidu.com

通過NAT,docker容器實現了對外網的訪問。

centos7下安裝docker(12.4容器如何與外部進行通信)