vhost nginx automatique via Docker

Le problème:

Il nous arrive souvent d'héberger plusieurs sites/applications web sur un même serveur et donc de faire pointer des noms de domaines ou sous domaines sur la même IP.
Nous utilisons donc les vhosts de Nginx pour configurer cela.
Comme tous nos services tournent dans un container Docker, notre proxy Nginx doit aussi être dans Docker.

La résolution:

Nous allons utiliser jwilder/nginx-proxy une image qui rempli bien notre besoin.
Par exemple vous pouvez démarrer le proxy avec:

$ docker run -d -p 80:80 --name proxy --network=public-network -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy:0.5.0

L'épine dans le pied:

Depuis les dernières versions, Docker a complété la notion de réseaux. Pour que tous nos containers puissent communiquer ensemble il faut les ajouter dans un réseaux commun. Lors du démarrage du proxy ci-dessus, nous avons utilisé le réseau public-network.

Démarrage d'un container simple:

Du coup, si on souhaite démarrer un simple container, il faut préciser la variable d'environnement pour déclarer le sous domaine et aussi le network utilisé (le meme que celui de notre proxy):

$ docker run -d --name service1 -e VIRTUAL_HOST=domaine1.example.com --network=public-network -p 9123:80 nginx

Démarrage d'un container avec compose:

Ici, il ne faut pas oublier la variable d'environnement pour déclarer le service au proxy nginx mais aussi le network:

version: '2'
services:
  monContainer:
    image: alpine
    environment:
      - VIRTUAL_HOST=domaine.example.com

...etc

networks:
  default:
    external:
      name: public-network