Docker nginx reverse proxy sample config

Local development configuration for setting up docker-compose to run nginx as reverse proxy to a dynamic web application or static site, for example.

Update hosts

Assuming the site domain is devtest.local, update /etc/hosts (or C:/Windows/System32/drivers/etc/hosts) by adding this line to the end of the file:   devtest.local

Server Certificates

In the directory where the docker-compose.yml file lives, create etc and etc/certs sub-directories and copy the server's certificate and private key to the latter directory.

For example, using the script described in the previous post:

$ node mkcert.js devtest.local
Creating self-signed certificate (CN=devtest.local)...

$ chmod 400 devtest.local.key

$ ls
devtest.local.crt devtest.local.key


Then the docker compose configuration file should look similar to:

version: '3'

image: nginx:latest
- ./etc/certs:/etc/nginx/certs
- ./etc/nginx.conf:/etc/nginx/conf.d/default.conf
- "8443:443"
- backend
- server54
- server54

driver: bridge

Notice that in this example the container's 443 port is mapped to 8443 in the host. So the url to visit, after running docker compose up, is:


But you could also have 443 on both host and container so as not to require the explicit port in the url.

nginx.conf (sample)

Next, an nginx config file should be created and saved to etc/nginx.conf. For example, copy and update this template to suit your needs.

The server sections should be similar to the following. Note again that the redirect urls contain the explicity guest port 8443.

server {
server_name _; # This is just an invalid value which will never trigger on a real hostname.
server_tokens off;
listen 80;
access_log /var/log/nginx/access.log vhost;
return 503;
server {
server_name devtest.local;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
return 301 https://$host:8443$request_uri;
server {
server_name devtest.local;
listen 443 ssl http2;
access_log /var/log/nginx/access.log vhost;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_certificate /etc/nginx/certs/devtest.local.crt;
ssl_certificate_key /etc/nginx/certs/devtest.local.key;

add_header Strict-Transport-Security "max-age=31536000" always;

root /usr/share/nginx;

location = / {
return 301 https://$host:8443/;