为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复在 docker 容器中调用公共地址时拨号 tcp i/o 超时?

如何修复在 docker 容器中调用公共地址时拨号 tcp i/o 超时?

Go
RISEBY 2023-07-17 14:59:32
我正在设置一个新的容器“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 上重现。
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

该问题是由 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地址。


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信