Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix dial tcp i/o timeout while calling public address in docker container?

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.2.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.2.153.48:8082/[email protected]: dial tcp 116.203.153.48:8082: i/o timeout"

Call from the program:

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 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.

like image 282
Mykhailo Tkachenko Avatar asked Aug 27 '19 11:08

Mykhailo Tkachenko


1 Answers

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.

like image 61
Mykhailo Tkachenko Avatar answered Nov 15 '22 09:11

Mykhailo Tkachenko