探索 Docker Desktop 的網路功能

Docker Desktop 提供多種網路功能,讓使用更輕鬆。

適用於所有平台的網路功能

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 的語法為 主機連接埠:客戶端連接埠

HTTP/HTTPS 代理支援

請參閱 代理

SOCKS5 代理支援

在 Docker Desktop 版本 4.28.0 中引入

注意

需要企業版訂閱。

SOCKS(Socket Secure,安全通訊端)是一種協定,可促進網路封包透過代理伺服器在用戶端和伺服器之間路由。它提供了一種方法來增強使用者和應用程式的隱私、安全性和網路效能。

你可以啟用 SOCKS 代理支援以允許輸出請求,例如提取映像檔,並從主機存取 Linux 容器後端 IP。

若要啟用和設定 SOCKS 代理支援

  1. 在「設定」中導覽至「資源」索引標籤。
  2. 從下拉式選單中選擇「代理」。
  3. 開啟「手動代理設定」切換。
  4. 在「安全網頁伺服器 HTTPS」方塊中,貼上你的 socks5://主機:連接埠 URL。

適用於 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 位址。建議你連線到特殊 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 公開的連接埠會被轉發到主機。

我們建議您發佈一個連接埠,或從另一個容器進行連線。即使在 Linux 上,如果容器位於覆蓋網路 (overlay network) 而非橋接網路 (bridge network),也需要這樣做,因為這些網路沒有路由。

例如,要執行一個 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

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

有關搭配 docker run 使用的發佈選項,請參閱run 指令的詳細說明。