本篇文章為大家展示了Docker容器如何訪問外部世界,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十年品質(zhì),值得信賴!
在我們當前的實驗環(huán)境下,docker host 是可以訪問外網(wǎng)的。
容器默認就能訪問外網(wǎng)。
請注意:這里外網(wǎng)指的是容器網(wǎng)絡(luò)以外的網(wǎng)絡(luò)環(huán)境,并非特指 internet。
現(xiàn)象很簡單,但更重要的:我們應(yīng)該理解現(xiàn)象下的本質(zhì)。
在上面的例子中,busybox 位于 docker0
這個私有 bridge 網(wǎng)絡(luò)中(172.17.0.0/16),當 busybox 從容器向外 ping 時,數(shù)據(jù)包是怎樣到達 bing.com 的呢?
這里的關(guān)鍵就是 NAT。我們查看一下 docker host 上的 iptables 規(guī)則
在 NAT 表中,有這么一條規(guī)則:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
其含義是:如果網(wǎng)橋 docker0
收到來自 172.17.0.0/16 網(wǎng)段的外出包,把它交給 MASQUERADE 處理。而 MASQUERADE 的處理方式是將包的源地址替換成 host 的地址發(fā)送出去,即做了一次網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。
下面我們通過 tcpdump 查看地址是如何轉(zhuǎn)換的。先查看 docker host 的路由表:
默認路由通過 enp0s3 發(fā)出去,所以我們要同時監(jiān)控 enp0s3 和 docker0 上的 icmp(ping)數(shù)據(jù)包。
當 busybox ping bing.com 時,tcpdump 輸出如下:
docker0 收到 busybox 的 ping 包,源地址為容器 IP 172.17.0.2,這沒問題,交給 MASQUERADE 處理。這時,在 enp0s3 上我們看到了變化:
ping 包的源地址變成了 enp0s3 的 IP 10.0.2.15
這就是 iptable NAT 規(guī)則處理的結(jié)果,從而保證數(shù)據(jù)包能夠到達外網(wǎng)。
busybox 發(fā)送 ping 包:172.17.0.2 > www.bing.com。
docker0 收到包,發(fā)現(xiàn)是發(fā)送到外網(wǎng)的,交給 NAT 處理。
NAT 將源地址換成 enp0s3 的 IP:10.0.2.15 > www.bing.com。
ping 包從 enp0s3 發(fā)送出去,到達 www.bing.com。
通過 NAT,docker 實現(xiàn)了容器對外網(wǎng)的訪問。
上述內(nèi)容就是Docker容器如何訪問外部世界,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。