我對 docker 概念非常陌生,我幾乎沒有節點微服務,我使用 Dockerfile 為它們創建了 docker 鏡像,我已經使用 docker run 命令在 docker 容器上運行了這些鏡像,現在我正在使用 postman 測驗這些節點 api。其中一個名為 inventory 的微服務在其組態檔中有另一個名為 sopra 的微服務的 url 以正確運行它。當我嘗試在郵遞員中進行測驗時,它會給出狀態:500 內部服務器錯誤。但是當它使用 npm start 在本地運行時,郵遞員正在發送訊息成功。我創建了一個名為 test 的單獨 docker 網路,并在該測驗網路中創建了這兩個容器。
創建一個我用過的新網路,docker network create test
然后在我用過的網路中運行那些容器
docker run -dp 1050:5006 --name inventory-container --net=test inventory-image&
docker run -dp 925:5008 --name sopra-container --net=test sopra-image
我什至檢查了他們是否可以使用 ping 命令相互通信
獲取我使用過的容器的 ip 地址,
docker inspect -f '{{.NetworkSettings.Networks.[network].IPAddress}}' inventory-container我得到的 ip 為 172.21.0.2
接下來我使用docker inspect -f '{{.NetworkSettings.Networks.test.IPAddress}}' sopra-container了 ip 作為 172.21.0.3
現在檢查我使用的 ping 并且兩者都回傳 2docker exec inventory-container ping 172.21.0.3 -c2個docker exec sopra-container ping 172.21.0.2 -c2傳輸的資料包,0% 資料包丟失
sopra 容器作業正常,因為它發出成功訊息并生成了 oauth 令牌,并且庫存容器也作業正常,因為我已經測驗了它的 api,當它不需要 sopra 令牌時它也給出成功訊息,但僅在需要連接到 sopra 時它作為內部服務器錯誤給出錯誤。
這是我在inventory-image 中的config.env 檔案
SOPRA_SERVICE_BASE_URL=http://localhost:925/api/v1
ENVIRONMENT_NAME='Dev'
DATE_FORMAT_TIME_ZONE='America/Indiana/Indianapolis'
uj5u.com熱心網友回復:
容器有它自己的localhost,因此連接localhost會嘗試連接到在容器內運行的服務,并且由于您沒有在容器內運行的sopra服務,因此localhost您無法連接到它。
也不要使用硬編碼的 IP。Docker 支持在用戶定義的網橋(例如您的test網路)中發現服務。您可以只使用容器名稱而不是 IP 地址來連接到容器。
這是Docker 網路教程的摘錄:
在 alpine-net 等用戶定義的網路上,容器不僅可以通過 IP 地址進行通信,還可以將容器名稱決議為 IP 地址。這種能力稱為自動服務發現。
您還需要小心埠映射。
docker run -p <host-port>:<container-port> <some-image>
第一個埠是host容器上的埠,第二個埠是容器上的埠。因此,如果您想從外部連接到您的一個服務,例如使用 Postman,請使用第一個埠。如果要從test網路內連接到服務,請使用容器埠。
應用所有三個,改變SOPRA_SERVICE_BASE_URL它config.env應該作業:
SOPRA_SERVICE_BASE_URL=http://sopra-container:5008/api/v1
為了更輕松地設定您的微服務(特別是如果有兩個以上),我建議您使用docker-compose.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460316.html
