在 Linux 環境中,
host.docker.internal
?是?Docker 為容器提供的一個特殊 DNS 名稱,用于指向宿主機的 IP 地址(類似 macOS/Windows 中的行為)。但這個功能在 Linux 上默認不啟用,需要手動配置才能使用。以下是詳細解釋和解決方案:
1. 為什么 Linux 上默認沒有?
host.docker.internal
?
歷史原因: Docker 最初在 macOS/Windows 上通過虛擬機運行,
host.docker.internal
?被設計為指向宿主機。而 Linux 是原生運行 Docker 的,默認沒有此機制。網絡隔離: Linux 容器默認使用橋接網絡(
bridge
),與宿主機隔離,無法直接通過簡單域名訪問宿主機。
2. Linux 上如何讓容器訪問宿主機?
方法 1:直接使用宿主機 IP
通過?
ip route
?命令獲取宿主機的 IP(通常是?docker0
?網卡的網關):bash
復制
下載
ip route show default | awk '{print $3}'輸出示例:
復制
下載
172.17.0.1在 Dockerfile 或啟動命令中,將?
host.docker.internal
?替換為宿主機 IP:diff
復制
下載
-Dskywalking.collector.backend_service=host.docker.internal:11800 +-Dskywalking.collector.backend_service=172.17.0.1:11800方法 2:運行時添加?
--add-host
?參數
運行容器時,通過?
--add-host
?將?host.docker.internal
?綁定到宿主機的網關 IP:bash
復制
下載
docker run --add-host=host.docker.internal:host-gateway your-image
host-gateway
?是 Docker 的保留關鍵字,自動解析為宿主機的網關 IP。方法 3:使用?
network_mode: host
在 Docker Compose 或啟動命令中,將容器的網絡模式設為?
host
,使容器共享宿主機的網絡棧:yaml
復制
下載
# docker-compose.yml services:your-service:network_mode: host
優點:容器內直接使用?
127.0.0.1
?即可訪問宿主機服務。缺點:容器與宿主機共享網絡,可能導致端口沖突。
方法 4:自定義 Docker 網絡
創建自定義網絡并指定網關:
bash
復制
下載
docker network create --driver bridge --subnet 172.25.0.0/16 my-net運行容器時加入該網絡,并通過網關 IP 訪問宿主機。