【问题标题】:How to fix dial tcp i/o timeout while calling public address in docker container?如何在 docker 容器中调用公共地址时修复拨号 tcp i/o 超时?
【发布时间】:2019-12-31 13:14:30
【问题描述】:

我正在设置一个新容器“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
    }

UPD:

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 上重现。

【问题讨论】:

  • 需要有关您的 docker 容器创建的更多详细信息。比如端口映射等。
  • @BillyYuan 更新
  • 那么,8082在哪里?
  • @BillyYuan 没关系,只是打错了。问题出在 mac 上,一切都可以使用 curl 172.17.0.1:8082/status,但在服务器上,不是 172.17.0.1,不是公共 ip 不起作用。
  • 好像是端口映射问题,检查你vps的防火墙设置

标签: docker go tcp centos


【解决方案1】:

该问题由 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-msfinance-ms 的 curl 和所有其他调用必须使用 finance-ms:9982 地址。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2018-09-12
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多