centos7下安裝docker(12.4容器如何與外部進行通信)
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容器如何與外部進行通信)