如何在Docker容器中调用公共地址时解决拨号TCP I / O超时问题?

Myk*_*nko 5 tcp centos go docker

我正在设置一个新的容器“ 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
    }
Run Code Online (Sandbox Code Playgroud)

UPD:

Docker-组成第一个容器:


  payment-ms:
    container_name: payment-ms
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - DB_HOST=payment-ms-db
    ports:
      - 8082:8082

Run Code Online (Sandbox Code Playgroud)

第二个容器的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
Run Code Online (Sandbox Code Playgroud)

另外,在装有MacOS的本地计算机上,一切正常,仅在带有CentOS7的VPS上出现问题。

Myk*_*nko 5

该问题是由 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
Run Code Online (Sandbox Code Playgroud)

这意味着,curl 和来自容器的所有其他调用user-ms必须finance-ms带有finance-ms:9982地址。