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

I'm setting up a new container 'A' which is calling some endpoints from container 'B'. Why are these calls always return dial tcp 116.203.153.48:8082: i/o timeout?

The call from container 'A' is using public IP. All containers are deployed on the CentOS 7. Every container has own network with own database in this network. Also, the call which returns error works fine from any REST-API client, such Postman. Nameservers in resolv.conf file has been changed to google's 8.8.8.8 and 8.8.4.4

Error: error="Post http://116.203.153.48:8082/new_user?email=eto@email.com: dial tcp 116.203.153.48:8082: i/o timeout"

Call from the program:

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-compose of the first container:


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

Docker-compose file of the second container:

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

Also, on my local machine with MacOS everything works fine, problem reproducing only on VPS with CentOS7.

douyanning3724
douyanning3724 似乎端口映射问题-检查您的vps的防火墙设置
12 个月之前 回复
dongliehuan3925
dongliehuan3925 没关系,只是打错了字。问题是在Mac上,一切都可以使用curl172.17.0.1:8082/status,但在服务器上不是172.17.0.1,不是publicip不起作用。
12 个月之前 回复
dougan6982
dougan6982 哪里是8082?
12 个月之前 回复
dongwo5449
dongwo5449 更新
12 个月之前 回复
dtxb75622
dtxb75622 需要有关您的Docker容器创建的更多详细信息。如端口映射等
12 个月之前 回复

1个回答

The problem was triggered by 2 issues. First, containers must be in the same network. And the second one, when containers are in the same network, calls to each other must be with the property container name host. For example:

$ 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

That's mean, what curl and all other calls from container user-ms to finance-ms must be with finance-ms:9982 address.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问