Après les 2 articles vous permettant de vous familiariser avec Docker et ses containers (Bitwarden pour le premier, et l'automatisation du téléchargement de vos séries et films pour le second), voici venu le temps de découvrir Portainer, une interface aboutie et légère, open-source, permettant de gérer vos containers et bien plus encore, notamment les stacks (ou docker-compose). Pour information, une version de démonstration publique de Portainer est accessible avec les identifiants admin et tryportainer, mais  vous n'en aurez plus besoin après avoir suivi ce tutoriel.

Alors oui, Synology propose une interface relativement simple et intuitive pour gérer les containers Docker, mais la simplicité a ses limites.
Par exemple, il n'est pas possible de gérer des ensemble de containers avec docker-compose, ou encore d'accéder aux fichiers ou répertoires systèmes avec File Station. Vous pouvez toujours vous connecter en ssh au Synology et utiliser docker-compose directement en CLI, mais ce n'est pas forcément à la portée de tout le monde (quoi que, il faut déjà un certain niveau avant d'en arriver à gérer des fichiers docker-compose).

C'est là qu'intervient Portainer, en tant qu'interface alternative à celle proposée par Synology.

Présentation de l'interface

Je vais commencer par vous présenter un ensemble de captures d'écran disponibles sur le site de Portainer, que je vous expliquerais juste après :

La page d'accueil permet d’avoir une vision globale de votre système et notamment les informations système de base (nom, version de Docker, CPU, mémoire) ainsi que le nombre de containers, d’images, de volumes et de réseaux.

La page listant les containers affiche une liste détaillée des containers présents sur votre système avec leur état ainsi que des informations utiles (nom, image, IP, ports, …). Plusieurs actions sont possible sur ces containers : Démarrer / Arrêter / Redémarrer / Supprimer / Ajouter un nouveau container ...

En cliquant sur un container, vous obtiendrez une page encore plus détaillée sur celui-ci : le statut, l'image utilisée, la date de création du container ainsi que la date du dernier démarrage, l'IP, les ports mappés, les variables d'environnement et les volumes montés. Vous aurez également un accès aux statistiques détaillés, aux logs ou encore à la console.

La page des statistiques vous permettent de suivre en temps réel le CPU, la mémoire, le trafic réseau ainsi que les processus en cours d’exécution.

Grâce aux logs ou à la console, vous pourrez vérifier le bon fonctionnement des containers ou lancer des commandes sur le container en question.

Installation de Portainer

Portainer lui-même se lance en tant que container Docker, très léger avec ses 4 Mo seulement. Pour télécharger l'image, 2 solutions :

  • Lancez le paquet Docker et rendez-vous dans l'onglet Registre, puis cherchez portainer. Téléchargez l'image portainer/portainer en double-cliquant dessus, et choisissez la version latest.
  • Ou alors vous pouvez vous connecter en ssh avec l'utilisateur root (avec la commande "sudo -i" une fois connecté avec votre utilisateur) et lancer la commande suivante :
docker pull portainer/portainer

Pour lancer le container, il faudra par contre obligatoirement passer en ssh avec l'utilisateur root, vu qu'il faudra lier le socket Docker en tant que volume, ce qui n'est pas possible depuis l'interface Synology. Voici la commande à utiliser pour créer et lancer le container en 1 seule ligne (il faudra au préalable avoir créé le dossier /volume1/docker/data-portainer pour stocker les données de configuration de Portainer :

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /volume1/docker/data-portainer:/data portainer/portainer

Maintenant que le container est déployé,  vous pouvez vous connecter avec votre navigateur sur l'interface web via l'adresse suivante : http://ip.de.votre.machine:9000.

Il vous sera ensuite demandé de rentrer le mot de passe que vous souhaitez donner à l'utilisateur par défaut (admin).

La prochaine étape est de configurer l'environnement Docker sur lequel se connecter et que Portainer pourra gérer. Ici, nous allons sélectionner "Local" (et nous avons déjà monté le socket Docker en tant que volume, donc c'est bon). Vous aurez la possibilité plus tard de rajouter un autre environnement Docker à administrer si vous le souhaitez.

Vous vous retrouverez connectés sur l'interface d'accueil, le dashboard, où vous aurez un résumé des environnements Docker que Portainer peut administrer.
En cliquant dessus, vous accéderez aux différentes fonctions de gestion des images, des containers, des stacks, ...

Utilisation de Portainer pour déployer un container

Le premier cas que nous allons étudier est le déploiement d'un container depuis l'interface Portainer :

  • En premier lieu, nous allons avoir besoin d'une image. Pour cela, il vous faudra cliquer sur "Images" dans le menu de gauche. Tapez le nom de l'image Docker que vous voulez utiliser puis cliquez sur "Pull the image" (dans notre cas, nous allons faire un pull de l'image organizrtools/organizr-v2).
  • Une fois le téléchargement (ou pull) terminé, notre image sera présente dans la liste en-dessous.
  • Nous allons maintenant déployer un container docker. Pour cela, cliquez sur "Containers", puis sur le bouton "Add container".
  • Procédez au paramétrage du container en remplissant le nom que vous voulez lui donner et en choisissant l'image précédemment téléchargée en commençant à saisir son nom. Ajoutez ensuite un port en cliquant sur "publish a new network port" pour indiquer sur quel port sera disponible l'interface de notre container. Passons ensuite à la configuration avancée dans la partie basse en ajoutant un volume pour stocker la configuration du container (choisir l'option "bind" pour saisir un dossier en local) et en spécifiant les variables d'environnement PUID et PGID (correspondant aux identifiants de l'utilisateur propriétaire du volume précédent et du groupe de celui-ci). Enfin, cliquez sur le bouton "Deploy the container".
  • Votre container est à présent démarré !

Voilà, vous avez déployé votre premier container avec Portainer. Vous pouvez accéder à orgnizr-v2 en vous rendant avec votre navigateur sur l'adresse suivante : http://ip.de.votre.machine:8080. Je ne vous détaillerais pas la première configuration d'organizr, sachez juste qu'il s'agit d'un portail permettant de centraliser tous vos sites favoris et d'y accéder au travers d'iframe (intégration d'une page web dans une autre).

Utilisation des stacks (équivalent de docker-compose)

Passons maintenant à une partie très intéressante, les stacks, autrement appelées Docker-Compose. Docker-Compose est un outil complémentaire à Docker, qui permet de décrire (dans un fichier YAML) et gérer (en ligne de commande) plusieurs conteneurs comme un ensemble de services inter-connectés.

Nous allons utiliser le même exemple que précédemment avec l'image organizr-v2, mais allons cette fois la déployer à partir d'un "compose". Pour cela, il va falloir d'abord comprendre la structure du fichier docker-compose.yml.

Le langage YAML (pour Yet Another Markup Language) est un format de représentation de données, relativement simple (sous forme de listes), mais qui permet de décrire plus d'informations que pour un fichier au format csv. Quelques subtilités sont à prendre en considération, comme le fait qu'une liste commence par un - (tiret), ou qu'il est nécessaire d'utiliser des espaces et non des tabulations pour hiérarchiser les données. Au final, un fichier .yml ou .yaml peut être lu et compréhensible directement par un humain.

Pour en revenir à nos container et fichier docker-compose.yml, les informations que nous allons devoir faire figurer sont : le nom du container, le nom de l'image source, le volume utilisé pour stocker la configuration, le port à mapper ainsi que les variables d'environnement.

  • En premier, nous devons faire figurer la version du fichier docker-compose qui est utilisée, et même si la version 3.5 est sortie et utilisable en CLI, la version 2 est à ce jour la plus haute acceptée dans une stack Portainer.
  • Ensuite, nous allons spécifier un service, qui s'appellera organizr-v2, et pour lequel nous allons définir les éléments listés juste avant.

Ce qui donne le résultat suivant :

version: "2"

services:
  organizrv2:
    image: organizrtools/organizr-v2:latest
    container_name: organizrv2
    environment:
      - PUID=1024
      - PGID=100
    volumes:
      - /docker/nas/vm-docker/config-organizr:/config
    ports:
      - 8080:80

Regardons maintenant du côté de Portainer. Nous allons nous rendre dans "Stacks", puis cliquer sur "Add Stack". Nous donnons un nom à cette stack et copions simplement le contenu décrit précédemment à l'emplacement prévu à cet effet. (Il est également possible de charger directement un fichier docker-compose.yml depuis votre ordinateur ou depuis un repository github.) Nous cliquons ensuite sur "Deploy the stack" un peu plus bas.
En cliquant sur la stack, vous pourrez visualiser les containers de cette stack et agir dessus comme bon vous semble, ou encore mettre à jour les paramètres du compose et redéployer la stack rapidement.

En CLI, il faut bien faire attention à toujours être positionné dans le répertoire qui contient le fichier docker-compose.yml ou alors spécifier le chemin complet du fichier avec l'option -f. Quelques commandes docker-compose qui peuvent être utiles :

Pour charger et démarrer tous les services décrits dans le fichier docker-compose.yml :
# docker-compose up -d

Pour arrêter tous les services décrits dans le fichier docker-compose.yml :
# docker-compose down

Pour redémarrer tous les services décrits dans le fichier docker-compose.yml :
# docker-compose restart

Pour consulter les logs de tous les services décrits dans le fichier docker-compose.yml :
# docker-compose logs

L'avantage des stacks dans Portainer par rapport à l'utilisation de docker-compose en CLI, c'est que vous pourrez modifier en ligne votre compose et mettre à jour les containers avec les paramètres modifiés sans avoir besoin d'un accès ssh à la machine qui héberge Docker.

Pour information et/ou rappel, vous pourrez trouver de plus amples explications et exemples sur le site officiel de Docker.

Conclusion

Voilà, j'espère que cette présentation vous aura convaincu de l'utilité de cet outil de gestion des containers Docker, et vous invite à le tester à l'aide du tutoriel ci-dessus sans plus attendre afin de vous faire votre propre avis. Je me ferais un plaisir de vous répondre dans les commentaires si vous avez des questions.