Nicolas S.Xu
Nicolas S.Xu

Reputation: 14554

How to use Nginx to connect to my app in Docker image?

My Nginx is not in docker image. My app is in docker image. They both live on the same server.

I don't want Nginx in a docker image, since it looks awful complex for me to configure. But my app is running in a docker container.

How to configure Nginx to use the docker image which my app is running in?

Here is my Nginx config file:

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    www.nicolasxu.space nicolasxu.space;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000"; 


       ssl_certificate /root/.ssh/nicolasxu.space.cert;
       ssl_certificate_key /root/nicolasxu.space.key;
       [....]
} 

Upvotes: 1

Views: 454

Answers (1)

François Maturel
François Maturel

Reputation: 6162

To easily setup nginx (in docker host) as a reverse proxy in front of a dockerized webapp you could just --publish the port of your webapp and route the trafic to this port:

  1. Run your docker container with --publish argument to bind host port with container's webapp port, for instance with a jenkins container I would do:

    docker run --publish 127.0.0.1:8080:8080 --name jenkins jenkins
    

This binds port 8080 of the container to port 80 on localhost's 127.0.0.1 of the host machine (this avoids port 8080 to be opened to anyone if you don't use any firewall). The Docker User Guide explains in detail how to manipulate ports in Docker.

  1. Forward all incoming trafic as a reverse proxy to the local container your port (8080 in my example)

    server {
        ...
    
        listen         443 ssl;
        server_name    www.nicolasxu.space nicolasxu.space;
        ...
    
        ssl_certificate ...
    
        location / {
                # forward all the trafic to docker container's published port
                proxy_pass http://localhost:8080;
        }
    }
    

Setting SSL on nginx and routing the trafic as HTTP to dockerized webapp is a good practice and will work like a charm.


Edit

For maximum performances, you can also use :

docker run --network=host ...

When using --network=host, docker will instruct the container to use the hosts networking stack. You won't have to --publish ports on host as it is the same network stack, and web application will be available on it's native port.

Upvotes: 2

Related Questions