探索 Docker Desktop 上的網路功能
Docker Desktop 包含內建網路功能,可幫助您將容器與主機上的服務、跨容器連線,或透過代理和 VPN 連線。
所有平臺的網路功能
VPN 直通
連線到 VPN 時,Docker Desktop 網路可以工作。為此,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 代理支援
請參閱 Proxies
SOCKS5 代理支援
SOCKS (Socket Secure) 是一種透過代理伺服器在客戶端和伺服器之間路由網路資料包的協議。它提供了一種增強使用者和應用程式隱私、安全性和網路效能的方法。
您可以啟用 SOCKS 代理支援以允許傳出請求(例如拉取映象),並從主機訪問 Linux 容器後端 IP。
要啟用和設定 SOCKS 代理支援
- 導航到 Settings 中的 Resources 選項卡。
- 從下拉選單中選擇 Proxies。
- 開啟 Manual proxy configuration 開關。
- 在 Secure Web Server HTTPS 框中,貼上您的
socks5://host:port
URL。
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 地址可以在 Settings 中更改。更改 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 上,如果容器位於 overlay 網路而非 bridge 網路(因為 overlay 網路不可路由),您也需要這樣做。
例如,要執行一個 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
使用的釋出選項的更多詳細資訊,請參閱run 命令。