Docker, Nginx et les certificats SSL
Introduction
Création du docker-compose
Pour pouvoir utiliser ce système sur n’importe quelle machine rapidement, il faut créer un fichier docker-compose que Docker pourra exécuter pour mettre en place et faire fonctionner les machines. Voici un exemple pour Nginx et Let’s Encrypt :
# Nginx
nginx-reverse-proxy:
image: jwilder/nginx-proxy
container_name: nginx-reverse-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /docker/ssl:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- /docker/nginx/conf.d:/etc/nginx/conf.d
- /etc/nginx/vhost.d
- /usr/share/nginx/html
labels:
- com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
# Let's Encrypt
letsencrypt-nginx-proxy-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
volumes_from:
- nginx-reverse-proxy
container_name: letsencrypt
volumes:
- /docker/ssl:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
Lancez ensuite la commande docker-compose up -d pour lancer l’installation des deux conteneurs. Dans cet exemple, nous pouvons voir que tous les volumes sont mappés sur la machine (chemin absolu situé à gauche dans les sections “volumes”) et notamment celui des certificats SSL partagé sur les deux conteneurs. Seul Nginx possède des ports à ouvrir, qui sont le 80 pour le protocole HTTP et 443 pour le protocole HTTPS.
A présent que les deux conteneurs sont en marche, nous allons tester le bon fonctionnement en ajoutant (ou en modifiant) une 3ème machine qui nécessite de se connecter à une interface web : Portainer. Cette machine est un peu particulière car elle utilise un port non standard pour y accéder.
portainer:
image: portainer/portainer
restart: always
container_name: portainer
command: -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /server/portainer/portainer_data:/data
environment:
- LETSENCRYPT_HOST=supervision.votre_domaine.com
- LETSENCRYPT_EMAIL=votre_email@votre_domaine.com
- VIRTUAL_HOST=supervision.votre_domaine.com
- VIRTUAL_PORT=9000
hostname: supervision.votre_domaine.com
Les champs LETSENCRYPT_HOST et LETSENCRYPT_EMAIL sont obligatoires pour la génération de certificats. Les champs VIRTUAL_HOST et hostname quant à eux, sont nécessaires au bon fonctionnement de notre proxy Nginx. Enfin, le virtual port est utilisé pour rediriger le port 9000 non-standard vers les ports 443 et 80.
Pour aller plus vite, exécutez les commandes suivante pour redémarrer les machines existantes et installer (ou réinstaller) Portainer :
portainer:
image: portainer/portainer
restart: always
container_name: portainer
command: -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /server/portainer/portainer_data:/data
environment:
- LETSENCRYPT_HOST=supervision.votre_domaine.com
- LETSENCRYPT_EMAIL=votre_email@votre_domaine.com
- VIRTUAL_HOST=supervision.votre_domaine.com
- VIRTUAL_PORT=9000
hostname: supervision.votre_domaine.com
Accédez ensuite à l’adresse que vous avez défini (https://supervision.votre_domaine.com) et vous allez tomber sur votre nouveau système de supervision déployé et sécurisé par un certificat SSL signé.