- Article to read: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/
- Repository to explore: https://github.com/jwilder/nginx-proxy
- Author or article and repository: Jason Wilder
- Another article: https://www.thepolyglotdeveloper.com/2017/03/nginx-reverse-proxy-containerized-docker-applications/
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
or using docker-compose up -d
# projects/nginx-proxy/docker-compose.yml
version: '3.3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
Then start any containers with an env var VIRTUAL_HOST=subdomain.youdomain.com, so -e VIRTUAL_HOST=foo.bar.com
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
The containers being proxied must expose the port to be proxied, either by using the EXPOSE directive in their Dockerfile or by using the --expose flag to docker run or docker create.
# projects/dictionary/docker-compose.yml
version: '3.3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
mysql:
image: mysql:5.7
restart: always
volumes:
- ./docker/data:/var/lib/mysql
ports:
- 3306:3306 # Expose of port, so I can access database from Phpstorm
environment:
MYSQL_ROOT_PASSWORD: root
VIRTUAL_HOST: mysql.dictionary.lh
apache:
build:
context: .
dockerfile: docker/apache/Dockerfile
restart: always
volumes:
- .:/var/www
depends_on:
- mysql
environment:
VIRTUAL_HOST: dictionary.lh,*.dictionary.lh
VIRTUAL_PORT: 80
adminer:
image: adminer
restart: always
depends_on:
- mysql
environment:
VIRTUAL_HOST: adminer.dictionary.lh
VIRTUAL_PORT: 80
Then run docker-compose up -d
arkona:dictionary petrofcikmatus$ docker-compose up -d
Creating dictionary_nginx-proxy_1 ... done
Creating dictionary_mysql_1 ... done
Creating dictionary_adminer_1 ... done
Creating dictionary_apache_1 ... done
Then run docker ps
arkona:dictionary petrofcikmatus$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a737bad80fe adminer "entrypoint.sh docke…" About a minute ago Up About a minute 8080/tcp dictionary_adminer_1
c9f19c39a9bd dictionary_apache "docker-php-entrypoi…" About a minute ago Up About a minute 80/tcp dictionary_apache_1
bd4a50acdf14 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp dictionary_mysql_1
5bc06baf90a2 jwilder/nginx-proxy "/app/docker-entrypo…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp dictionary_nginx-proxy_1
And of course I added my custom hosts into /etc/hosts
file (or use dnsmasq
).
# /etc/hosts
127.0.0.1 dictionary.lh www.dictionary.lh adminer.dictionary.lh mysql.dictionary.lh mysql
Add -e DEFAULT_HOST=foo.bar.com
$ docker run -d -p 80:80 -e DEFAULT_HOST=foo.bar.com -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Add -e ENABLE_IPV6=true
$ docker run -d -p 80:80 -e ENABLE_IPV6=true -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Yes, but I didn't try this...