[英]How to fix dial tcp i/o timeout while calling public address in docker container?
我正在設置一個新容器“A”,它從容器“B”調用一些端點。 為什么這些調用總是返回dial tcp 116.2.153.48:8082: i/o timeout
?
來自容器“A”的調用正在使用公共 IP。 所有容器都部署在 CentOS 7 上。每個容器都有自己的網絡,在這個網絡中有自己的數據庫。 此外,返回錯誤的調用在任何 REST-API 客戶端(例如 Postman)上都可以正常工作。 resolv.conf 文件中的名稱服務器已更改為 google 的 8.8.8.8 和 8.8.4.4
錯誤: error="Post http://116.2.153.48:8082/new_user?email=eto@email.com: dial tcp 116.203.153.48:8082: i/o timeout"
從程序調用:
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("http://116.2.153.48:8082/new_user?email=%s", user.Email), nil)
if err != nil {
return err
}
httpClient := &http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return err
}
更新:
Docker-compose 的第一個容器:
payment-ms:
container_name: payment-ms
build:
context: .
dockerfile: Dockerfile
environment:
- DB_HOST=payment-ms-db
ports:
- 8082:8082
第二個容器的 Docker-compose 文件:
user-ms:
container_name: user-ms
build:
context: .
dockerfile: Dockerfile
environment:
- DB_HOST=user-ms-db
ports:
- 8080:8080
depends_on:
user-ms-db:
condition: service_healthy
此外,在我的 MacOS 本地機器上,一切正常,僅在使用 CentOS7 的 VPS 上重現問題。
該問題由 2 個問題引發。 首先,容器必須在同一個網絡中。 第二個,當容器在同一個網絡中時,相互調用必須使用屬性容器名稱host。 例如:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c6c31b8ec21 user-ms "./user-ms run" 3 minutes ago Up 3 minutes 8080/tcp, 0.0.0.0:9980->9980/tcp user-ms
13863218f942 finance-ms "./finance-ms run" 3 minutes ago Up 3 minutes 0.0.0.0:9982->9982/tcp finance-ms
這意味着, curl 和所有其他從容器user-ms
到finance-ms
調用必須使用finance-ms:9982
地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.