?
This document uses PHP Chinese website manual Release
本節(jié)中的信息解釋了 Docker 默認(rèn)網(wǎng)橋中的綁定容器端口。這是一個(gè)在安裝 Docker 時(shí)自動創(chuàng)建名為bridge
的bridge
網(wǎng)絡(luò)。
注意:通過 Docker 網(wǎng)絡(luò)功能,您可以創(chuàng)建除默認(rèn)網(wǎng)橋以外的用戶定義網(wǎng)絡(luò)。
默認(rèn)情況下,Docker 容器可以連接到外部世界,但外部世界無法連接到容器。由于 Docker 服務(wù)器在啟動時(shí)創(chuàng)建的主機(jī)上的iptables
偽裝規(guī)則,每個(gè)傳出連接似乎都源自主機(jī)自己的一個(gè) IP 地址:
$ sudo iptables -t nat -L -n...Chain POSTROUTING (policy ACCEPT)target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0...
Docker 服務(wù)器創(chuàng)建偽裝規(guī)則,允許容器連接到外部世界的 IP 地址。
如果你想容器接受傳入的連接,你需要在調(diào)用docker run
時(shí)提供特殊的選項(xiàng)。有兩種方法。
首先,您可以向docker run
提供-P
或--publish-all=true|false
執(zhí)行一攬子操作,該操作使用EXPOSE
圖像Dockerfile
或--expose <port>
命令行標(biāo)志中的一行標(biāo)識每個(gè)端口,并將其映射到臨時(shí)端口范圍內(nèi)的某個(gè)主機(jī)端口。docker port
然后該命令需要用于檢查創(chuàng)建的映射。的臨時(shí)端口范圍由配置/proc/sys/net/ipv4/ip_local_port_range
內(nèi)核參數(shù),典型地為32768?61000。
映射可以使用-p SPEC
或--publish=SPEC
選項(xiàng)明確指定。它允許您詳細(xì)分析
docker 服務(wù)器上的哪個(gè)端口 - 可以是任何端口,而不僅僅是臨時(shí)端口范圍內(nèi)的一個(gè)端口 - 要映射到容器中的哪個(gè)端口。
無論哪種方式,您都應(yīng)該能夠通過檢查 NAT 表來了解 Docker 在網(wǎng)絡(luò)堆棧中完成的工作。
# What your NAT rules might look like when Docker # is finished setting up a -P forward:$ iptables -t nat -L -n...Chain DOCKER (2 references)target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80# What your NAT rules might look like when Docker # is finished setting up a -p 80:80 forward:Chain DOCKER (2 references)target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
您可以看到 Docker 已經(jīng)公開了這些容器端口0.0.0.0
,通配符 IP 地址將與主機(jī)上任何可能的傳入端口相匹配。如果您希望更具限制性,只允許通過主機(jī)上的特定外部接口聯(lián)系容器服務(wù),則有兩種選擇。當(dāng)您調(diào)docker run
用時(shí),您可以使用-p IP:host_port:container_port
或-p IP::port
指定一個(gè)特定綁定的外部接口。
或者,如果您始終希望 Docker 端口轉(zhuǎn)發(fā)綁定到一個(gè)特定的 IP 地址,則可以編輯系統(tǒng)范圍的 Docker 服務(wù)器設(shè)置并添加該選項(xiàng)--ip=IP_ADDRESS
。請記住在編輯此設(shè)置后重新啟動 Docker 服務(wù)器。
注意:在啟用發(fā)夾(hairpin) NAT(
--userland-proxy=false
)的情況下,容器端口暴露是純粹通過 iptables 規(guī)則實(shí)現(xiàn)的,并且不會嘗試綁定暴露的端口。這意味著沒有任何東西可以通過為容器公開相同的端口來阻止在 Docker 之外的以前的偵聽服務(wù)。在這種相互沖突的情況下,Docker 創(chuàng)建的 iptables 規(guī)則將優(yōu)先并發(fā)送到容器。
--userland-proxy
參數(shù),默認(rèn)為true,為容器間和外部到容器的通信提供了一個(gè)用戶區(qū)實(shí)現(xiàn)。禁用時(shí),Docker 會同時(shí)使用額外的MASQUERADE
iptable 規(guī)則和net.ipv4.route_localnet
內(nèi)核參數(shù),它們允許主機(jī)通過常用的環(huán)回地址連接到本地容器公開端口:由于性能的原因,此替代方案是首選。
了解 Docker 容器網(wǎng)絡(luò)
使用網(wǎng)絡(luò)命令
舊版容器鏈接