如何在调用 docker 容器中的 public 地址时修复拨号 tcp i/o 超时?
How to fix dial tcp i/o timeout while calling public address in docker container?
我正在设置一个新容器 'A',它从容器 'B' 调用一些端点。为什么这些调用总是 return dial tcp 116.2.153.48:8082: i/o timeout
?
来自容器 'A' 的调用正在使用 public IP。所有容器都部署在 CentOS 7 上。每个容器都有自己的网络,在这个网络中有自己的数据库。此外,returns 错误的调用在任何 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-组成第一个容器:
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 个问题触发的。
首先,容器必须在同一个网络中。第二个,当容器在同一个网络时,相互调用必须使用 属性 容器名称主机。例如:
$ 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
的 curl 和所有其他调用必须使用 finance-ms:9982
地址。
我正在设置一个新容器 'A',它从容器 'B' 调用一些端点。为什么这些调用总是 return dial tcp 116.2.153.48:8082: i/o timeout
?
来自容器 'A' 的调用正在使用 public IP。所有容器都部署在 CentOS 7 上。每个容器都有自己的网络,在这个网络中有自己的数据库。此外,returns 错误的调用在任何 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-组成第一个容器:
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 个问题触发的。 首先,容器必须在同一个网络中。第二个,当容器在同一个网络时,相互调用必须使用 属性 容器名称主机。例如:
$ 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
的 curl 和所有其他调用必须使用 finance-ms:9982
地址。