我正在建立一个新的容器“ A”,该容器正在从容器“ B”调用某些终结点。为什么这些呼叫总是返回dial tcp 116.203.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.203.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.203.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
}
UPD:
由Docker组成的第一个容器:
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上再现问题。
答案 0 :(得分:2)
该问题由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
这意味着,卷曲和从容器user-ms
到finance-ms
的所有其他调用必须使用finance-ms:9982
地址。