I’ve been playing with the jwilder/nginx-proxy docker container recently. It automatically generates reverse proxy entries for other containers.
It does this by monitoring when new containers are started and then inspecting the environment variables attached to the new container. If the container has the
VIRTUAL_HOST variable is uses it’s value as the virtual host for nginx to proxy access to the container.
Normally for this type of setup you would set up a wildcard DNS that points to the docker host so all DNS lookups for a machine in the root domain will return the same IP address.
If all the virtual hosts are in the
example.com domain e.g.
bar.example.com you would setup the
*.example.com DNS to point to the docker hosts IP address.
When working on my home LAN I normally use mDNS to access local machines so there is no where to set up the wildcard DNS entry. Instead I have build a container to add CNAME mDNS entries for the docker host for each of the virtual hosts.
In my case Docker is running on a machine called
docker-pi.local and I’m using that as the root domain. e.g.
The container is using the
docker-gen application that use templates to generate configuration files based on the running containers. In this case it generates a list of virtual hosts and writes them to a file.
The file is read by a small python application that connects to d-bus to talk to the avahi daemon on the docker host and configures the CNAMEs.
Both Docker and d-bus use unix domain sockets as their transport protocol so you have to mount the sockets from the host into the container.
docker run -d -v /run/dbus/system_bus_socket:/run/dbus/system_bus_socket -v /var/run/docker.sock:/tmp/docker.sock --name avahi-cname hardillb/nginx-proxy-avahi-helper