Nginx Reverse Proxy
Examples for using Jason Wilder’s Automated Nginx Reverse Proxy for Docker. This solution uses docker-compose files and Jason’s trusted reverse proxy image that contains a configuration using virtual hosts for routing Docker containers.
To set this up, create these directories in a project folder: nginx-proxy
, whoami
and an optional third one for a node.js app named nodeapp
. For the nodeapp, create a Docker image using the these instructions.
- project
- nginx-proxy
- docker-compose.yml
- nodeapp
- docker-compose.yml
- whoami
- docker-compose.yml
- nginx-proxy
Docker Network
Create a Docker network named nginx-proxy
to bridge all of the containers together.
docker network create nginx-proxy
In the nginx-proxy
folder, create a new docker-compose.yml
file as follows:
docker-compose.yml
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
restart: always
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
default:
external:
name: nginx-proxy
In the whoami
folder, create a new docker-compose.yml
file as follows:
docker-compose.yml
version: '3'
services:
app:
image: emilevauge/whoami
environment:
- VIRTUAL_HOST=local.docker.whoami.com
networks:
default:
external:
name: nginx-proxy
After building the myapp-node
image as instructed here, create a new docker-compose.yml
file nodeapp
folder as follows:
docker-compose.yml
version: '3'
services:
app:
image: myapp-node
user: "node"
working_dir: /home/node/app
environment:
- NODE_ENV=production
- VIRTUAL_HOST=local.docker.nodeapp.com
expose:
- "3000"
command: "node app.js"
networks:
default:
external:
name: nginx-proxy
- Take note of the
expose
andVIRTUAL_HOST
environment variables in thedocker-compose.yml
files for theapp
services. Thenginx-proxy
service uses these values to route traffic to the respective container.
Hosts
To test out the nginx-proxy
virtual host routing locally, update your hosts
file as follows:
127.0.0.1 local.docker.nodeapp.com
127.0.0.1 local.docker.whoami.com
Docker Compose
Use docker-compose up
to build, (re)create, start, and attach containers for a service. We’re adding the -d
option for detached mode to run the container in the background.
First, bring up the nginx-proxy
container.
# change to the nginx-proxy directory
cd nginx-proxy
docker-compose up -d
Bring up the whoami
container. Verify that it is running as expected in a web browser at http://local.docker.whoami.com
# change to the whoami directory
cd ../whaomi
docker-compose up -d
Bring up the nodeapp
container. Verify that it is running as expected in a web browser at http://local.docker.nodeapp.com
# change to the nodeapp directory
cd ../nodeapp
docker-compose up -d
Use docker-compose down
to stop and remove containers created by docker-compose up
. Additionally, docker-compose stop
can be used to stop a running container without removing it. Use docker-compose start
to restart an existing container.
Add more folders and docker-compose.yml
files as needed. The nginxy-proxy
container is mounted to the host docker socket using this /var/run/docker.sock:/tmp/docker.sock
volume. Every time a container is added, nginx-proxy
has access to the events from the socket and creates the configuration file needed to route traffic and restart nginx making the changes available immediately.