IE-Concept

Docker, Nginx et les certificats SSL

Introduction

Pour votre déploiement d’infrastructure, vous aurez sûrement besoin de définir un nom de domaine et des certificats SSL pour l’accès et la sécurité sur votre système. Pour cela, nous allons utiliser un système de proxy Nginx couplé à Let’s Encrypt, pour la génération automatique de certificats SSL.
Pré-requis : Avoir installé et configuré correctement Docker – Posséder un nom de domaine valable

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é.