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