前面探討了容器與容器肆糕,容器與主機(jī)間的連通,這節(jié)我們探討下容器與外部網(wǎng)絡(luò)之間的連通在孝。
1诚啃、容器訪問(wèn)外部網(wǎng)絡(luò)
進(jìn)入容器內(nèi)部,嘗試ping www.baidu.com
我們查詢宿主機(jī)上的路由:
默認(rèn)的路由是通過(guò)enp0s3向外發(fā)送數(shù)據(jù)包的私沮,而我們前面又知道容器與宿主機(jī)相通是通過(guò)docker0連通的始赎。因此,我們有理由猜測(cè)docker0與enp0s3之間一定存在某種關(guān)系仔燕。我們針對(duì)這兩個(gè)網(wǎng)橋抓取數(shù)據(jù)包看一下:
我們模擬發(fā)了三個(gè)數(shù)據(jù)包造垛,當(dāng)數(shù)據(jù)包從172.17.0.2 > 119.75.213.61的時(shí)候,轉(zhuǎn)換成了192.168.1.111 > 119.75.213.61晰搀。這就是我們上圖中畫(huà)的iptables NAT轉(zhuǎn)換的結(jié)果五辽,這也就使得數(shù)據(jù)包能夠到達(dá)外網(wǎng)。而實(shí)際上宿主機(jī)上的iptables上的該條規(guī)則:對(duì)于docker0收到來(lái)自172.17.0.2/16網(wǎng)段發(fā)送的數(shù)據(jù)包厕隧,就將其交到MASQUERADE處理奔脐;而MASQUERADE就是將數(shù)據(jù)包的源地址替換為宿主機(jī)地址進(jìn)而發(fā)送出去,也就是我們上面說(shuō)的做了一次NAT轉(zhuǎn)換吁讨。
2髓迎、外部網(wǎng)絡(luò)訪問(wèn)容器
在啟動(dòng)容器的時(shí)候,如果不指定對(duì)應(yīng)參數(shù)建丧,在容器外部是無(wú)法通過(guò)網(wǎng)絡(luò)來(lái)訪問(wèn)容器內(nèi)的網(wǎng)絡(luò)應(yīng)用和服務(wù)的排龄。當(dāng)容器中運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部訪問(wèn)這些應(yīng)用時(shí),可以通過(guò)-P或-p參數(shù)指定端口映射橄维。
(1)-P它會(huì)隨機(jī)映射一個(gè)端口至容器內(nèi)部開(kāi)放的網(wǎng)絡(luò)端口尺铣。
(2)-p可以指定要映射的端口,并且在一個(gè)指定端口上只可以綁定一個(gè)容器争舞。端口映射支持的格式有:
ip:hostport:containerport?? #指定ip凛忿、指定主機(jī)port、指定容器port
ip::containerport????????? #指定ip竞川、未指定主機(jī)port店溢、指定容器port
hostport:container??????? #未指定ip port、指定主機(jī)port委乌、指定容器port
容器以-P的形式啟動(dòng)的床牧,docker ps查詢到端口映射情況如下:
瀏覽器輸入:http://192.168.1.111:32769,可見(jiàn)可以訪問(wèn)容器應(yīng)用
docker-proxy監(jiān)聽(tīng)來(lái)自端口32769的數(shù)據(jù)包將其轉(zhuǎn)到容器172.17.0.2:80進(jìn)行響應(yīng)遭贸。