Home > Mobile >  docker-compose with nginx can't connect to localhost app
docker-compose with nginx can't connect to localhost app

Time:12-08

I run nodejs on localhost while nginx runs as a docker container with docker-compose

I can't make any connections to the node js app:

nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    server {
        listen 80;
        server_name licensing.cluster-ops.co;
        location / {
                proxy_pass http://md_license_server:3005;
                proxy_set_header Host $host;
        }
    }
}

docker-compose.yml

version: "3.3"
services:
  md_license_server:
   image: root/md-license-server
   expose:
    - 3005
   ports:
    - 3005:3005
  nginx:
   image: nginx:latest
   container_name: nginx
   ports:
    - 80:80
    - 443:443
   volumes:
    - /etc/ssl/certs:/etc/ssl/certs
    - /etc/ssl/private:/etc/ssl/private
    - /root/docker/nginx.conf:/etc/nginx/nginx.conf


I tried everything out there.

extra_hosts: - "host.docker.internal:127.0.0.1"

^this won't work.

The node app works perfectly fine on localhost.. I tried to make somem curl calls and the response was ok.

This is the error message i get from docker:

2021/12/06 14:29:06 [error] 24#24: *3 connect() failed (111: Connection refused) 
while connecting to upstream, client: 139.59.147.204, server: 
localhost, request: "GET /ping HTTP/1.1", upstream: "http://172.19.0.2:3005
/ping", host:...

It looks like "172.19.0.2:3005" is either the IP of the md_license service.

running

docker-compose exec md_license_server curl http://localhost:3005/ping returns true

which means the node server works within the container.


I feel this is something about nginx.

CodePudding user response:

Most probably you have IP range overlap between docker network & host network. But let's not assume that now :


  • If you are using Docker for desktop (Windows, Mac) , No need to add extra hosts. Directly:

    upstream backend {
      server host.docker.internal:3005;
    }
    
  • If you are NOT using Docker for Desktop (Linux), you need to check the private IP of your host hostname -i, then put that private IP in the nginx config

    # assuming that `hostname -i` prints 192.168.x.y
    upstream backend {
      server 192.168.x.y:3005;
    }
    

Now if you want to put that dynamically, this is another topic, but you could check nginx templates.


Returning back to the 1st assumption: whatever the case , if there is overlap between Docker network and your Host network, the router will not forward the packet to the host and it keep being inside docker network. So let's check:

  • Check your Host IP : hostname -i
  • Check your Docker container IP : docker-compose exec nginx hostname -i

IF there is overlap, you will need to provide custom docker network:

services:
   nginx:
     image: ....
     networks:
       custom-net: # attach nginx container to that network
         ipv4_address: 172.24.0.22 # assign static IP for your container from the network defined below.

networks:
  custom-net: # create new docker network
    ipam:
      config:
       - subnet: 172.24.0.0/24 # with explicit CIDR range

CodePudding user response:

It was a problem caused by fastify.

Solution can be found here: https://github.com/fastify/fastify/issues/935

  • Related