Carven
Carven

Reputation: 15638

How to use name of container to resolve to its IP in nginx's upstream server?

I'm running 2 Docker containers on a host. In my first container, I started it this way:

docker run -d --name site-a -p 127.0.0.1:3000:80 nginx

This maps the port 80 to the host machine's port 3000. It also has a name called site-a, which I want to use it in another container.

Then in my other container, which is a main reverse proxy container, I configured the nginx's configuration to have an upstream pointing the the first container (site-a):

upstream my-site-a {
    server site-a:80;
}

I then run the reverse proxy container this way:

docker run -d --name reverse-proxy -p 80:80 nginx

So that my reverse-proxy container will serve from site-a container.

However, there are 2 problems here:

  1. The upstream in my nginx configuration doesn't work when I use server site-a:80;. How can I get nginx to resolve the alias "site-a" to the IP of site-a container?

  2. When starting site-a container, I followed an answer at here and bound it to the host machine's port 3000 with this: -p 127.0.0.1:3000:80 Is this neccessary?

Upvotes: 0

Views: 1140

Answers (2)

OkieOth
OkieOth

Reputation: 3704

If you combine multiple containers to more complex infrastructure it's time to move to more complex technologies. Basically you have the choice between docker-compose and docker stack. Kubernetes could also be an option but it's more complicated.

That techniques provide solutions for container discovery and internal name resolving.

I suggest to use docker stack. Instead of compose it has no additional requirements beside docker.

Upvotes: 0

whites11
whites11

Reputation: 13260

In order for your containers to be mutually reachable via their name, you need to add them to the same network.

First create a network with this command:

docker network create my-network

Then, when running your containers, add the --network flag like this:

docker run -d --name site-a -p 127.0.0.1:3000:80 --network my-network nginx

Of course you need to do the same thing to both containers.

As per your second question, there's no need to map the port on your host with the -p flag as long as you don't want to reach site-a's container directly from your host.

Of course you still need to use the -p flag on the reverse proxy container in order to make it reachable.

Upvotes: 2

Related Questions