🧠在 Docker 中,要與宿主機(Host)或其他容器通訊
1. 容器與「宿主機本身」通訊
如果你想讓
nginx_server 訪問宿主機上運行的服務(例如 MySQL 或 Redis):- 使用特殊的 DNS 名稱 (推薦):
在 Docker 18.03+ 版本,你可以在容器內使用host.docker.internal來代表宿主機 IP。- 注意:在 Linux 上需要啟動參數
--add-host=host.docker.internal:host-gateway才能生效。
- 注意:在 Linux 上需要啟動參數
- 使用宿主機的橋接 IP:
通常宿主機在 Docker 網路中的 IP 是172.17.0.1。你可以透過此 IP 訪問宿主機服務。
2. 容器與「同一個宿主機上的其他容器」通訊
這是最常見的場景,建議不要用 IP,要用 Docker Network (DNS):
- 自定義網路 (推薦):
建立一個專屬網路,並將容器都加入其中,這樣可以直接透過「容器名稱」通訊。bash# 1. 建立網路 docker network create my_app_net # 2. 將現有的 nginx 加入網路 docker network connect my_app_net nginx_server # 3. 啟動另一個容器也加入此網路 docker run --name backend --network my_app_net -d my_image現在,
nginx_server只要訪問http://backend就能通訊。
3. 容器與「外部網路 / 物理機」通訊
- 如果你的 Nginx 需要訪問局域網內的其他物理伺服器,直接使用該伺服器的 真實實體 IP 即可,容器預設是可以連出去的。
4. 使用 Host 網路模式 (特殊需求)
如果你希望容器「完全共用」宿主機的網路棧(沒有網路隔離,容器 IP 就是宿主機 IP):
- 啟動時加上
--network host。 - 優點:效能最高。缺點:安全性較低,且端口會直接衝突。
將
localhost 改為 host.docker.internal 是最推薦的方案,因為在容器內 localhost 指的是「容器自己」,而 host.docker.internal 指的是「宿主機」。但要讓這個設定生效,你有兩件事需要確認:
1. 修改 Nginx 配置
在你的
nginx.conf 或 conf.d/*.conf 中修改:nginx
location / {
proxy_pass http://host.docker.internal:8080/;
proxy_set_header Host $host;
# ... 其他設定
}
2. 關鍵:啟動參數(Linux 環境必備)
由於你使用的是 Linux(從你的
[root@Dev253 ~] 看出),Docker 預設不會自動解析這個域名。你必須在 docker run 時加入 --add-host 參數。操作步驟:
- 刪除舊容器:
docker rm -f nginx_server - 重新啟動並注入 Host 對應:
bash
docker run -d --name nginx_server \ -p 80:80 -p 443:443 \ --add-host=host.docker.internal:host-gateway \ nginx:latest註:
host-gateway是一個特殊關鍵字,Docker 會自動將它替換為宿主機的橋接 IP(通常是 172.17.0.1)。
3. 如何測試是否生效?
啟動後,你可以進入容器測試連通性:
bash
docker exec -it nginx_server curl http://host.docker.internal:8080
如果能看到你宿主機上 8080 服務的內容,就代表成功了。
d.g:
1. 停止並刪除舊容器
docker rm -f nginx_server
2. 執行新的啟動命令
docker run -d \
--name nginx_server \
-p 80:80 \
-p 443:443 \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /opt/wisedom/wscms/dist:/usr/share/nginx/html:ro \
-v /data/nginx/ssl:/etc/nginx/ssl:ro \
--add-host=host.docker.internal:host-gateway \
--restart always \
nginx:latest
3. 修改 Nginx 配置
請確保你的
/data/nginx/nginx.conf 檔案中,將原本連向宿主機服務的 localhost 修改為:nginx
proxy_pass http://docker.internal;
共有 0 条评论