Utiliser Docker pour héberger plusieurs sites et services sur un serveur grâce à un reverse proxy nginx

Au travers des derniers articles postés sur le sujet j’ai essayé de montrer comment on pouvait utiliser Docker pour héberger un site (Wordpress dans mon exemple) et comment utiliser Docker pour reproduire cet environnement pour développer en local. Attention : si vous n’êtes pas familier de Docker je vous conseille de lire les précédents articles.

Dans ce nouvel article je vais détailler l’utilisation d’un fichier docker-compose qui combine une série d’images Docker pour mettre en place plusieurs sites derrière un reverse-proxy nginx … et en bonus appliquer un certificat Let’s Encrypt à tous les domaines associés.

De quoi est-ce qu’on parle exactement ?

C’est notamment grâce au travail de l’utilisateur evertramos que j’ai pu comprendre et me mettre à Docker. C’est lui qui a mis sur pied ce repo “docker-compose-letsencrypt-nginx-proxy-companion”.

Il décrit lui-même le système en question avec le shéma ci-dessous.

Ce système tire partie de 3 images Docker : nginx, docker-gen et letsencrypt-nginx-proxy-companion.

Une fois cette infrastructure mise en place vous pourrez y associer vos projets, services, sites.

La configuration passe par un fichier docker-compose.yml.

À quoi ça sert ?

Si vous avez déjà configuré un serveur web vous savez sans doutes la complexité qu’il peut y avoir à maintenir le tout, y installer de nouveaux services etc, et surtout quand il s’agit d’installer plusieurs éléments différents sur un même serveur.

Dans ma faible expérience du sujet j’ai auparavant opté pour la configuration à la main de virtual_hosts pour Apache afin d’héberger mes 5 ou 6 sites ainsi qu’un cloud CozyCloud sur mon serveur (ce que j’avais réussi après pas mal de prises de tête et l’aide de cet article de l’ami BaBeuloula).

Ce n’est sans doutes pas la méthode pour laquelle opterait un professionnel mais en tant qu’amateur curieux ou d’indépendant c’est sans doutes la première méthode que vous apprendriez pour héberger votre serveur web. C’est une des bases.

Mais les avantages à utiliser Docker pour cela sont nombreux :

  • vous n’avez pas à vous soucier des certificats SSL : https partout automatiquement !
  • vous tirez parti évidemment de tous les avantages de Docker que j’ai déjà décrit
  • et surtout : ajouter un nouveau site à votre serveur prend littéralement quelques secondes.

Petit récap sur le reverse proxy : un reverse proxy redirige le trafic qui arrive sur votre serveur vers le serveur web sur lequel tourne votre site (apache par exemple). Comme indiqué sur le shéma le reverse proxy sert alors d’intersection entre l’extérieur et tous vos sites permettant la gestion de plusieurs sites sur une même machine (des domaines différents sur une IP identique).

Comment le mettre en place ?

Si vous avez suivi les précédents tutoriels vous savez utiliser docker-compose pour lancer un site (Wordpress ou autre). Le principe est le même mais nous allons utiliser un fichier docker-compose.yml et .env existant.

Préréquis : vous devez avoir docker et docker-compose installés.

Puis il suffit de suivre les instructions données sur la page que je vous retranscrit ici :

  1. Téléchargez le code grâce à :
  git clone https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion.git
  1. Faites une copie du fichier .env.sample et renommez le .env

Il vous suffit d’éditer les paramètres de ce fichier. Voici les plus essentiels documentés en français pour vous :

  #
  # docker-compose-letsencrypt-nginx-proxy-companion
  #
  # Un proxy web qui utilise docker avec NGINX et Let's Encrypt
  #
  # Ceci est le fichier .env utilisé pour configurer votre Webproxy

  #
  # Noms de vos conteneurs locaux
  #
  NGINX_WEB=nginx-web
  DOCKER_GEN=nginx-gen
  LETS_ENCRYPT=nginx-letsencrypt

  #
  # Votre adresse IP externe
  #
  IP=0.0.0.0

  #
  # Réseau par défaut
  #
  NETWORK=webproxy

  #
  # Chemin des fichiers NGINX
  #
  NGINX_FILES_PATH=/path/to/your/nginx/data

  1. Lancer le script de démarrage
  ./start.sh

Ajouter un nouveau site

Si vous exécutez la commande docker ps vous devriez désormais avoir trois conteneurs actifs : nginx-web, nginx-gen et nginx-letsencrypt.

À partir de maintenant vous pouvez configurer et lancer les conteneurs de vos sites. Encore une fois je vais utiliser Wordpress comme exemple. Dans un prochain article je détaillerai la procédure pour héberger Rocket.Chat et NextCloud en parallèle d’un site web sur votre serveur.

Très peu de choses sont à ajouter par rapport au tutoriel de Wordpress avec Docker. Pour plus de détails reportez vous à cet autre repository de evertramos.

version: '3'

services:
   db:
     container_name: ${CONTAINER_DB_NAME}
     image: mysql:5.7
     restart: unless-stopped
     volumes:
        - ${DB_PATH}:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
       MYSQL_DATABASE: ${MYSQL_DATABASE}
       MYSQL_USER: ${MYSQL_USER}
       MYSQL_PASSWORD: ${MYSQL_PASSWORD}

   wordpress:
     depends_on:
       - db
     container_name: ${CONTAINER_WP_NAME}
#     image: wordpress:${WORDPRESS_IMAGE}
     image: winedata/wordpress:latest
     restart: unless-stopped
     volumes:
       - ${WP_CORE}:/var/www/html
       - ${WP_CONTENT}:/var/www/html/wp-content
     environment:
       WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME}:3306
       WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
       WORDPRESS_DB_USER: ${MYSQL_USER}
       WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
       WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
       VIRTUAL_HOST: ${DOMAINS}
       LETSENCRYPT_HOST: ${DOMAINS}
       LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}

networks:
    default:
       external:
         name: ${NETWORK}

Vous noterez deux nouveautés : la partie networks est formulée un peu différemment et trois lignes sont à ajouter dans la déclaration du conteneur wordpress dans le docker-compose.yml de votre site :

VIRTUAL_HOST: ${DOMAINS}
LETSENCRYPT_HOST: ${DOMAINS}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}

Vous pouvez donc ajoutez trois variables au fichier .env de votre site

# Votre domaine (ou domaines)
DOMAINS=example.com, www.example.com

# Your email for Let's Encrypt register
LETSENCRYPT_EMAIL=me.example.com

Pour résumer

Sur votre serveur vous devriez avoir un dossier /docker-compose-letsencrypt-nginx-proxy-companion qui contient notamment un fichier docker-compose.yml et un fichier .env modifié par vos soins.

Vous pouvez rassembler tout au sein du même fichier mais je ne vous le recommande pas, vous devriez donc avoir un autre dossier dédié à votre site contenant également docker-compose.yml et .env.

Lancez la commande docker-compose up -d dans chacun de ces deux dossiers.

Quand vous lancez le conteneur de votre site, il est détecté par nginx-gen et nginx-web qui génèrent les fichiers de configuration du reverse proxy, et enfin nginx-letsencrypt génère les certificats SSL.

Notez que cela peut prendre plusieurs minutes voire parfois heures quand c’est la première fois.


Dans le prochain article je complèterai ce tutoriel pour vous détailler exactement mon installation serveur pour héberger sites, cloud et messagerie instantanée sur votre serveur.