user_78361084
user_78361084

Reputation: 3888

Nginx reverse proxy to an app in host

I have an app that is running outside Docker on port 5000. I am trying to run a reverse proxy in nginx via Docker compose but am unable to communicate with the host's port 5000. In my docker-compose.yml file I have:

ports:
  - 80:80
  - 443:443
  - 5000:5000

When I try to run this I get:

ERROR: for nginx  Cannot start service nginx: driver failed programming external connectivity on endpoint nginx (374026a0d34c8b6b789dcd82d6aee6c4684b3201258cfbd3fb18623c4101): Error starting userland proxy: listen tcp 0.0.0.0:5000: bind: address already in use

If I comment out - 5000:5000 I get:

[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream

How do I connect to an already running app in the Host from a Docker nginx container?

EDIT:

My nginx.conf file

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    upstream mysite {
        server 0.0.0.0:5000;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
        proxy_pass http://mysite;
        }
    }
}

The response when I try to curl localhost is 502 Bad Gateway. The app itself and curl 127.0.0.1:5000 responds fine from the host.

EDIT 2: I have also tried the solution found here but I get nginx: [emerg] host not found in upstream "docker". Docker is my host's hostname.

EDIT 3: My docker-compose.yml

version: '3'
services:
  simple:
    build: ./simple
    container_name: simple
    ports:
      - 80:80
      - 443:443

My Dockerfile:

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]

EDIT:

I am getting the computer host via the "hostname" command in linux.

Upvotes: 0

Views: 8511

Answers (3)

Joe Sadoski
Joe Sadoski

Reputation: 666

I need to use a different variable to access the host container: http://host.docker.internal.

Upvotes: 1

Mohammad Anas
Mohammad Anas

Reputation: 318

172.17.0.1 is the default host ip available to docker container running on host. Just use 172.17.0.1:5000 in your nginx conf file and you should be able to connect to your application running on host outside the container. My docker version is 19.03.12 where I tested the same.

Upvotes: 5

rdRahul
rdRahul

Reputation: 561

The problem lies with 0.0.0.0:5000. Since Nginx is running inside the docker, it tries to find this address inside docker machine but fails since there is nothing running on 0.0.0.0:5000 inside docker.

So in order to resolve this

  1. You need to give it an address that it can reach. Solving it requires that you first run your application at 0.0.0.0:5000 on your host machine i.e you should be able to open your application at 0.0.0.0:5000 from your browser.
  2. Find your IP address. once you get your IP address you should be able to open you application through ip_address:5000. since your docker and host share the same network this address can be reached from docker also
  3. Now, replace the 0.0.0.0:5000 in your Nginx conf file with this ip_address:5000. you would be able to serve your application

Upvotes: 8

Related Questions