前面我們已經解決了容器間通訊的問題,接下來討論容器如何與外部世界通訊。這裡涉及兩個方向:
容器訪問外部世界
外部世界訪問容器
容器訪問外部世界
在我們當前的實驗環境下,docker host 是可以訪問外網的。
我們看一下容器是否也能訪問外網呢?
可見,容器預設就能訪問外網。
請注意:這裡外網指的是容器網路以外的網路環境,並非特指 internet。
現象很簡單,但更重要的:我們應該理解現象下的本質。
在上面的例子中,busybox 位於docker0
這個私有 bridge 網路中(172.17.0.0/16),當 busybox 從容器向外 ping 時,資料報是怎樣到達 bing.com 的呢?
這裡的關鍵就是 nat。我們檢視一下 docker host 上的 iptables 規則:
在 nat 表中,有這麼一條規則:
-a postrouting -s 172.17.0.0/16 ! -o docker0 -j masquerade
其含義是:如果網橋docker0
收到來自 172.17.0.0/16 網段的外出包,把它交給 masquerade 處理。而 masquerade 的處理方式是將包的源位址替換成 host 的位址傳送出去,即做了一次網路位址轉換(nat)。
預設路由通過 ens160 發出去,所以我們要同時監控 ens160 和 docker0 上的 icmp(ping)資料報。
當 busybox ping bing.com 時,tcpdump 輸出如下:
docker0 收到 busybox 的 ping 包,源位址為容器 ip 172.17.0.2,這沒問題,交給 masquerade 處理。這時,在 ens160 上我們看到了變化
ping 包的源位址變成了 ens160 的 ip 192.168.0.43
這就是 iptable nat 規則處理的結果,從而保證資料報能夠到達外網。下面用一張圖來說明這個過程:
busybox 傳送 ping 包:172.17.0.2 > www.bing.com。
docker0 收到包,發現是傳送到外網的,交給 nat 處理。
ping 包從 enp0s3 傳送出去,到達 www.bing.com。
通過 nat,docker 實現了容器對外網的訪問。
Docker網路管理 外部訪問容器
注意 這裡使用的方法是埠對映,需要說明的是埠對映是在容器啟動的時候才能完成埠對映的。1,搭建1個web伺服器,讓外部機器訪問。usr sbin httpd 啟動httpd curl localhost 2,將容器轉換成映象。3,啟動新映象新增引數指定埠,完成埠對映。4,進入容器,啟動httpd服務....
容器無法訪問容器宿主機外部網路
現象是a機器上的容器無法訪問b機器 檢視docker網路 com.docker.network.bridge.enable ip masquerade值為false.enable ip masquerade 是否開啟ip偽裝 ip偽裝,是linux系統的一種網路功能,如果一台linux主機使用ip偽...
玩壞docker筆記 十四 將容器與外部世界連線
容器訪問外部世界 方法 nat 當前,docker host 是可以訪問外網的 容器呢?容器也可以訪問外網。注意 這裡的外網是指容器網路以外的網路環境,並非特指internet。busybox位於docker0這個私有的bridge網路中 172.17.0.0 16 當busybox從容器向外pin...