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.
2
Answers
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:
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 configNow 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:
hostname -i
docker-compose exec nginx hostname -i
IF there is overlap, you will need to provide custom docker network:
It was a problem caused by fastify.
Solution can be found here: https://github.com/fastify/fastify/issues/935