容器学习 之 容器访问外部网络(十四)
容器訪問外部世界
docker host 是可以訪問外網(wǎng)的。
容器也能訪問外網(wǎng)
為什么容器能夠訪問到外網(wǎng)呢?我們先來查看iptables的規(guī)則
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE其含義是:來自 172.17.0.0/16 網(wǎng)段的包,目標(biāo)地址是外網(wǎng)(! -o docker0),就把它交給 MASQUERADE 處理。而 MASQUERADE 的處理方式是將包的源地址替換成 host 的地址發(fā)送出去,即做了一次網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。
下面我們通過 tcpdump 查看地址是如何轉(zhuǎn)換的。先查看 docker host 的路由表:
默認(rèn)路由通過 enp0s3 發(fā)出去,所以我們要同時(shí)監(jiān)控 enp0s3 和 docker0 上的 icmp(ping)數(shù)據(jù)包。
當(dāng) busybox ping bing.com 時(shí),tcpdump 輸出如下:
docker0 收到 busybox 的 ping 包,源地址為容器 IP 172.17.0.2,這沒問題,交給 MASQUERADE 處理。這時(shí),在 enp0s3 上我們看到了變化:
ping 包的源地址變成了 enp0s3 的 IP 10.0.2.15
這就是 iptable NAT 規(guī)則處理的結(jié)果,從而保證數(shù)據(jù)包能夠到達(dá)外網(wǎng)。下面用一張圖來說明這個(gè)過程:
外部世界訪問容器
docker 可將容器對(duì)外提供服務(wù)的端口映射到 host 的某個(gè)端口,外網(wǎng)通過該端口訪問容器。容器啟動(dòng)時(shí)通過-p參數(shù)映射端口:
容器啟動(dòng)后,可通過 docker ps 或者 docker port 查看到 host 映射的端口。在上面的例子中,httpd 容器的 80 端口被映射到 host 32773 上,這樣就可以通過 :<32773> 訪問容器的 web 服務(wù)了。
我們也可以在 -p 中指定映射到 host 某個(gè)特定端口,例如可將 80 端口映射到 host 的 8080 端口:
每一個(gè)映射的端口,host 都會(huì)啟動(dòng)一個(gè) docker-proxy 進(jìn)程來處理訪問容器的流量:
以 0.0.0.0:32773->80/tcp 為例分析整個(gè)過程:
總結(jié)
以上是生活随笔為你收集整理的容器学习 之 容器访问外部网络(十四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 容器学习 之 自定义容器网络(十三)
- 下一篇: 容器学习 之 docker存储(十五)