探索 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 代理支援

  1. 導覽至「設定」中的「資源」分頁。
  2. 從下拉式選單中選擇「代理」。
  3. 開啟「手動代理配置」開關。
  4. 在「安全網頁伺服器 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 記錄類型 (A 代表 IPv4,AAAA 代表 IPv6)。
  • 篩選 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 代理轉發

適用於 Mac 和 Linux 的 Docker Desktop 可讓您在容器內使用主機的 SSH 代理。為此

  1. 透過將以下參數新增至您的 docker run 指令來繫結掛載 SSH 代理通訊端

    $--mount type=bind,src=/run/host-services/ssh-auth.sock,target=/run/host-services/ssh-auth.sock
    
  2. 在您的容器中新增 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,請使用以下說明作為範例,從容器連線到主機上的服務

  1. 執行以下指令以在連接埠 8000 上啟動一個簡單的 HTTP 伺服器。

    python -m http.server 8000

    如果您已安裝 Python 2.x,請執行 python -m SimpleHTTPServer 8000

  2. 現在,執行一個容器,安裝 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 網頁伺服器

$ 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

或者,您也可以使用 主機網路 來讓容器直接存取主機的網路堆疊。

請參閱 run 指令,以了解更多關於與 docker run 搭配使用的發布選項。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.