文章目錄
- 1. 問題根源:Docker 網絡模型
- 2. 解決方案:端口映射(Port Mapping)
- 方法 1:重新運行容器并添加端口映射(推薦)
- 方法 2:獲取宿主機的 IP 進行訪問(特定情況)
- 📊 原理示意圖
- 💎 總結
您遇到的問題非常典型,這是由 Docker 的網絡模型和容器隔離性導致的。172.17.0.2
是容器的內部私有 IP,無法從您宿主機的瀏覽器直接訪問。
1. 問題根源:Docker 網絡模型
hostname -I # 容器內執行查看容器內ip地址
root@99686ef00ecc:/app# hostname -I
172.17.0.2
Docker 容器運行在一個獨立的虛擬網絡中(默認是 bridge
網絡)。172.17.0.2
是這個容器內部網絡的地址,只有以下對象可以訪問它:
- 同一 Docker 網絡下的其他容器
- Docker 宿主機本身(即您安裝 Docker 的那臺電腦或服務器)
您的宿主機瀏覽器和容器不在同一個網絡層面,因此無法直接通過這個私有 IP 通信。
2. 解決方案:端口映射(Port Mapping)
解決方案是在啟動容器時,將容器內部的端口 8000
映射到宿主機的一個端口上。這樣,訪問宿主機的該端口,流量就會自動轉發到容器內。
方法 1:重新運行容器并添加端口映射(推薦)
這是最標準、最正確的做法。
-
首先,退出當前容器(如果還在運行的話):
exit
-
使用
-p
參數重新運行容器,進行端口映射:# 語法:-p <宿主機端口>:<容器內部端口> docker run --rm -it -p 8000:8000 yolov8-cpu:latest /bin/bash
-p 8000:8000
:將宿主機的8000
端口映射到容器的8000
端口。- 您可以將前面的
8000
改為宿主機任何未被占用的端口,例如-p 9000:8000
。
-
在容器內啟動您的 FastAPI 服務:
python fastapi_yolo_detector2.py
-
現在,在您宿主機(電腦)的瀏覽器中訪問:
http://localhost:8000
或者
http://127.0.0.1:8000
localhost
和127.0.0.1
都代表您的主機自身,現在通過端口映射,請求就會被轉發到容器里。
方法 2:獲取宿主機的 IP 進行訪問(特定情況)
有時您可能需要從局域網內其他設備訪問該服務。
-
首先,您需要查找到您宿主機在局域網中的真實 IP:
- Windows 宿主機:打開命令提示符,輸入
ipconfig
,找到“以太網適配器”或“WLAN 適配器”下的IPv4 地址
。 - Linux/macOS 宿主機:打開終端,輸入
ifconfig
或ip addr show
,找到eth0
或wlan0
下的inet
地址。
- Windows 宿主機:打開命令提示符,輸入
-
假設您查到的宿主機 IP 是
192.168.1.100
,并且您已經按方法 1 做好了端口映射 (-p 8000:8000
)。 -
那么您可以在同一局域網下的任何設備的瀏覽器中訪問:
http://192.168.1.100:8000
📊 原理示意圖
為了幫助您理解,可以看下面這個簡單的對比:
沒有端口映射 (docker run ... ) | 有端口映射 (docker run -p 8000:8000 ... ) | |
---|---|---|
容器網絡 | 隔離的私有網絡 (172.17.0.2:8000 ) | 隔離的私有網絡 (172.17.0.2:8000 ) |
宿主機訪問 | 無法訪問 ? | 通過 localhost:8000 可以訪問 ? |
外部訪問 | 無法訪問 ? | 通過 宿主機IP:8000 可以訪問 ? |
💎 總結
- 根本原因:
172.17.0.2
是容器內網地址,宿主機瀏覽器無法直接訪問。 - 標準解決方案:使用
-p
參數進行端口映射。 - 正確訪問方式:在宿主機瀏覽器訪問
http://localhost:8000
。 - 重啟命令:請退出當前容器,使用
docker run -p 8000:8000 ...
重新啟動并映射端口。
請按此方法操作,您就能成功從瀏覽器訪問到 FastAPI 服務了。參考gpt。