Ayant eu la chance d'avoir un collègue très au point sur les technologies de containerisation, j'ai decidé, il y a quelques temps maintenant, de sauter le pas pour l'hébergement de ce site et des autres services dont j'ai besoin au quotidien.
Historiquement, j'avais un NUC Intel doté d'un Celeron et de 8Go de RAM, sur lequel j'avais installé ProxMox et une VM sur laquelle j'avais installé Yunohost.
Ca fonctionnait pas mal, voire même très bien, mais à l'époque, je rencontrais des soucis lorsque je voulais ajouter des services sur la machine.
J'ai donc créé une VM Debian de base, ai installé le moteur Docker, et ai suivi la doc de mon collègue pour installer un reverse proxy Nginx, le companion qui permet de gérer automatiquement les certificats Let's Encrypt, et un serveur Grav, que vous êtes en train de consulter.

Tout d'abord, on créé un dossier data à la racine de la machine Debian, dans lequel on créé quelques sous-dossiers :

  • un dossier containers qui va regrouper l'ensemble des données à usage des containers,
  • un dossier setup dans lequel vont être sauvegardés les certificats,
  • un dossier par service au sein de /data/containers contenant le fichier docker-compose.yml lié au service, et aussi les quelques fichiers de config ou de données propres à chaque service (cela peut être un fichier de configuration ou des données applicatives).

J'ai commencé par installer le reverse proxy. Pas de fichier docker-compose.yml mais un fichier sh permettant la création à la volée :

#!/bin/bash
docker run --restart=always --name reverseproxy -d -p 80:80 -p 443:443 -v /data/setup/certs/:/etc/nginx/certs:ro -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /data/containers/reverseproxy/conf/proxywide.conf:/etc/nginx/conf.d/proxywide.conf:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

Lorsque ce script est lancé, il démarre un container nginx-proxy récupéré chez jwilder, mappe les ports 80 et 443 de la VM sur les mêmes ports du container, et mappe certains dossiers (notamment le dossier contenant les certificats) et un fichier de config proxywide.conf présent dans /data/containers/reverseproxy/conf/.
Contenu du fichier proxywide.conf :

client_max_body_size 12000m;

Ensuite, nouveau dossier pour le companion.
Et nouveau fichier de déploiement de container...

#!/bin/bash
docker run --restart=always -d -v /data/setup/certs:/etc/nginx/certs:rw --volumes-from reverseproxy --name letsencrypt -v /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion

On mappe le dossier de certificats de nginx vers notre dossier /data/setup/certs et c'est tout...... En lançant l'exécutable, la création du container est lancée.

Ensuite, on va créer un dossier pour chaque nouveau service et y inclure un fichier docker-compose.yml.
Pour Grav, par exemple :

grav:
     image: vincowl/grav-php-nginx
     container_name: cont_grav
     restart: always
     ports:
        - "8097:80"
      volumes:
        - /data/containers/grav/ssh:/root/.ssh/
        - /data/containers/grav/html:/usr/share/nginx/html/
     environment:
        - VIRTUAL_HOST=www.monsite.com
        - ALLOW_OVERRIDE=true
        - LETSENCRYPT_HOST=www.monsite.com
        - LETSENCRYPT_EMAIL=monsite@monsite.com

On mappe le port 8097 de la VM sur le port 80 du container. On mappe 2 dossiers (voir doc), et on renseigne ensuite les paramètres qui vont permettre au companion de faire les demandes de certificats et de les installer automatiquement.
Le lancement du container se fera ensuite en tapant la commande docker-compose up -d dans chaque dossier de service.
Et on suivra le même mode opératoire pour les autres services.
Shaarli par exemple :

shaarli:
    image: shaarli/shaarli
    container_name: shaarli
    restart: always
    ports:
       - 8094:80
    volumes:
       - /data/containers/bookmarks/data:/var/www/shaarli/data
    environment:
       - VIRTUAL_HOST=shaarli.monsite.com
       - LETSENCRYPT_HOST=shaarli.monsite.com
       - LETSENCRYPT_EMAIL=monsite@monsite.com

Cela démarrera automatiquement un container shaarli et récupèrera le certificat Let's encrypt pour https://shaarli.monsite.com

En rêgle générale, les docs de déploiement des containers présents sur github sont très simples à suivre.