🧠在 Docker 中,要與宿主機(Host)或其他容器通訊

1. 容器與「宿主機本身」通訊
如果你想讓 nginx_server 訪問宿主機上運行的服務(例如 MySQL 或 Redis):
  • 使用特殊的 DNS 名稱 (推薦)
    在 Docker 18.03+ 版本,你可以在容器內使用 host.docker.internal 來代表宿主機 IP。
    • 注意:在 Linux 上需要啟動參數 --add-host=host.docker.internal:host-gateway 才能生效。

  • 使用宿主機的橋接 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.confconf.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 參數。
操作步驟:
  1. 刪除舊容器docker rm -f nginx_server
  2. 重新啟動並注入 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;

版权声明:
作者:yxbinghe
链接:https://www.zhanhao.ch/?p=680
来源:ice.99
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>