探索 Docker Desktop 上的網路功能
Docker Desktop 包含內建網路功能,可幫助您將容器與主機上的服務、跨容器或透過代理和 VPN 連線。
所有平臺的網路功能
VPN 直通
Docker Desktop 網路可以在連線到 VPN 時工作。為此,Docker Desktop 會攔截來自容器的流量,並將其注入主機,就好像它源自 Docker 應用程式一樣。
埠對映
當您使用 -p
引數執行容器時,例如:
$ docker run -p 80:80 -d nginx
Docker Desktop 將容器上執行在埠 80
的任何內容(在本例中為 nginx
)透過 localhost
的埠 80
提供。在此示例中,主機和容器埠相同。
為避免與主機上已使用埠 80
的服務衝突:
$ docker run -p 8000:80 -d nginx
現在,對 localhost:8000
的連線將傳送到容器中的埠 80
。
提示
-p
的語法是HOST_PORT:CLIENT_PORT
。
HTTP/HTTPS 代理支援
請參閱 代理
SOCKS5 代理支援
SOCKS(Socket Secure)是一種協議,它透過代理伺服器促進客戶端和伺服器之間的網路資料包路由。它提供了一種增強使用者和應用程式的隱私、安全和網路效能的方法。
您可以啟用 SOCKS 代理支援,以允許傳出請求(例如拉取映象),並從主機訪問 Linux 容器後端 IP。
要啟用和設定 SOCKS 代理支援:
- 導航到設定中的資源選項卡。
- 從下拉選單中選擇代理。
- 開啟手動代理配置開關。
- 在安全 Web 伺服器 HTTPS 框中,貼上您的
socks5://host:port
URL。
Mac 和 Windows 的網路模式和 DNS 行為
在 Docker Desktop 4.42 版及更高版本中,您可以自定義 Docker 處理容器網路和 DNS 解析的方式,以更好地支援各種環境——從僅 IPv4 到雙棧和僅 IPv6 系統。這些設定有助於防止因不相容或配置錯誤的主機網路而導致的超時和連線問題。
注意這些設定可以使用 CLI 標誌或 Compose 檔案選項在每個網路上覆蓋。
預設網路模式
選擇 Docker 建立新網路時使用的預設 IP 協議。這允許您將 Docker 與主機的網路功能或組織要求對齊,例如強制執行僅 IPv6 訪問。
可用選項有:
- 雙棧 IPv4/IPv6(預設):支援 IPv4 和 IPv6。最靈活,適用於具有雙棧網路的環境。
- 僅 IPv4:僅使用 IPv4 地址。如果您的主機或網路不支援 IPv6,請使用此選項。
- 僅 IPv6:僅使用 IPv6 地址。最適合過渡到或強制執行僅 IPv6 連線的環境。
注意此設定可以使用 CLI 標誌或 Compose 檔案選項在每個網路上覆蓋。
DNS 解析行為
控制 Docker 如何過濾返回給容器的 DNS 記錄,從而提高僅支援 IPv4 或 IPv6 環境的可靠性。此設定對於防止應用程式嘗試使用實際不可用的 IP 系列進行連線特別有用,這可能會導致可避免的延遲或故障。
根據您選擇的網路模式,可用選項有:
- 自動(推薦):Docker 會檢測您主機的網路堆疊,並自動過濾掉不受支援的 DNS 記錄型別(IPv4 的 A 記錄,IPv6 的 AAAA 記錄)。
- 過濾 IPv4(A 記錄):阻止容器解析 IPv4 地址。僅在雙棧模式下可用。
- 過濾 IPv6(AAAA 記錄):阻止容器解析 IPv6 地址。僅在雙棧模式下可用。
- 不過濾:Docker 返回所有 DNS 記錄(A 和 AAAA),無論主機是否支援。
重要切換預設網路模式會將 DNS 過濾器重置為自動。
使用設定管理
如果您是管理員,可以使用設定管理來在開發人員的機器上強制執行此 Docker Desktop 設定。從以下程式碼片段中選擇並將其新增到您的 admin-settings.json
檔案中,或者使用管理員控制檯配置此設定
雙棧 IPv4/IPv6
{
"defaultNetworkingMode": {
"locked": true
"value": "dual-stack"
}
}
僅 IPv4
{
"defaultNetworkingMode": {
"locked": true
"value": "ipv4only"
}
}
僅 IPv6
{
"defaultNetworkingMode": {
"locked": true
"value": "ipv6only"
}
}
自動過濾
{
"dnsInhibition": {
"locked": true
"value": "auto"
}
}
過濾 IPv4
{
"dnsInhibition": {
"locked": true
"value": "ipv4"
}
}
過濾 IPv6
{
"dnsInhibition": {
"locked": true
"value": "ipv6"
}
}
不過濾
{
"dnsInhibition": {
"locked": true
"value": "none"
}
}
Mac 和 Linux 的網路功能
SSH 代理轉發
Docker Desktop for Mac 和 Linux 允許您在容器內使用主機的 SSH 代理。為此:
透過將以下引數新增到您的
docker run
命令中來繫結掛載 SSH 代理套接字:$--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
在容器中新增
SSH_AUTH_SOCK
環境變數:$ -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock"
要在 Docker Compose 中啟用 SSH 代理,請將以下標誌新增到您的服務中:
services:
web:
image: nginx:alpine
volumes:
- type: bind
source: /run/host-services/ssh-auth.sock
target: /run/host-services/ssh-auth.sock
environment:
- SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock
已知限制
更改內部 IP 地址
Docker 使用的內部 IP 地址可以透過設定更改。更改 IP 後,您需要重置 Kubernetes 叢集並離開任何活動的 Swarm。
主機上沒有 docker0
網橋
由於 Docker Desktop 中網路實現的特殊方式,您無法在主機上看到 docker0
介面。此介面實際上位於虛擬機器內部。
我無法 ping 通我的容器
Docker Desktop 無法將流量路由到 Linux 容器。但是,如果您是 Windows 使用者,則可以 ping Windows 容器。
無法實現每個容器的 IP 地址分配
這是因為 Docker 的 bridge
網路無法從主機訪問。但是,如果您是 Windows 使用者,Windows 容器可以實現每個容器的 IP 地址分配。
用例和解決方法
我想從容器連線到主機上的服務
主機的 IP 地址會發生變化,如果您的網路無法訪問,則可能沒有 IP 地址。Docker 建議您連線到特殊的 DNS 名稱 host.docker.internal
,它解析為主機使用的內部 IP 地址。
您也可以使用 gateway.docker.internal
訪問閘道器。
如果您在機器上安裝了 Python,請使用以下說明作為示例,從容器連線到主機上的服務:
執行以下命令以在埠 8000 上啟動一個簡單的 HTTP 伺服器。
python -m http.server 8000
如果您安裝了 Python 2.x,請執行
python -m SimpleHTTPServer 8000
。現在,執行一個容器,安裝
curl
,然後嘗試使用以下命令連線到主機:$ docker run --rm -it alpine sh # apk add curl # curl http://host.docker.internal:8000 # exit
我想從主機連線到容器
埠轉發適用於 localhost
。--publish
、-p
或 -P
都有效。從 Linux 公開的埠將轉發到主機。
Docker 建議您釋出埠,或者從另一個容器連線。即使容器位於覆蓋網路而非橋接網路(因為這些網路不進行路由),在 Linux 上也需要這樣做。
例如,要執行 nginx
Web 伺服器:
$ docker run -d -p 80:80 --name webserver nginx
為了澄清語法,以下兩個命令都將容器的埠 80
釋出到主機的埠 8000
:
$ docker run --publish 8000:80 --name webserver nginx
$ docker run -p 8000:80 --name webserver nginx
要釋出所有埠,請使用 -P
標誌。例如,以下命令啟動一個容器(在分離模式下),並且 -P
標誌將容器所有暴露的埠釋出到主機上的隨機埠。
$ docker run -d -P --name webserver nginx
或者,您還可以使用主機網路來讓容器直接訪問主機的網路堆疊。
有關與 docker run
一起使用的釋出選項的更多詳細資訊,請參閱執行命令。