Gérer vos containers Docker avec Portainer, c’est une interface web facile à utiliser pour gérer et administrer tous vos containers Docker. Voici comment faire fonctionner Portainer. Il est presque impossible, aujourd’hui, d’éviter d’utiliser des conteneurs en entreprise. Les raisons de l’essor des conteneurs sont nombreuses (flexibilité, portabilité, fiabilité, etc.) ; mais quelles que soient vos raisons, vous utilisez probablement Docker comme principale plate-forme de conteneurs. Si c’est le cas, vous avez peut-être cherché une interface web qui vous permettra de gérer vos conteneurs à partir de n’importe quel navigateur pouvant accéder à votre réseau. Avec Portainer, vous pouvez extraire des images, ajouter des conteneurs, ajouter des réseaux, et bien plus encore. Cet outil est vraiment tout à fait remarquable et devrait être considéré par quiconque gère un système Docker.
Sommaire de l'article
Installation de Portainer
Comme je l’ai mentionné, Portainer est un conteneur. Ouvrez donc votre fenêtre de terminal (ou connectez-vous à votre serveur Docker headless) et lancez la commande suivante :
docker run -d -p 9000:9000 portainer/portainer
Cette commande permet d’extraire toutes les images nécessaires et de créer le conteneur Portainer.
Lancez la commande sudo docker ps et vous devriez voir les conteneurs nécessaires fonctionner.
Si l’image docker Portainer n’est pas démarré comme ci-dessus. Vous pouvez utiliser cette commande pour démarrer votre container.
docker start dedfd6540bb6 (container ID)
Après l’exécution de la commande, ouvrez un navigateur et pointez-le sur http://SERVER_IP:9000 (où SERVER_IP est l’adresse IP du serveur hébergeant Portainer. Une fois que votre navigateur est arrivé sur la page, la première chose à faire est de définir (et de vérifier) un mot de passe pour l’utilisateur admin.
Après avoir créé le mot de passe, vous devrez ensuite diriger Portainer vers le serveur Docker. Il n’est pas nécessaire que Portainer fonctionne sur le même serveur que Docker.
Dans la liste choisissez un des deux modes de fonctionnement :
- Manage the local Docker environment (votre serveur Docker et Portainer se trouve sur le même serveur)
- Manage a remote Docker environment (donnez un nom à la connexion et entrez ensuite l’URL du point de terminaison (qui sera http://SERVER_IP:2375 – où SERVER_IP est l’adresse de votre serveur Docker).
Cliquez sur Connect et vous vous retrouverez sur le gestionnaire d’interface utilisateur de Portainer.
Si vous cliquer sur Connect et que vous avez ce message d’erreur, il va falloir arrêter le container Portainer et le démarrer avec une commande adpatée.
Autre point important. A chaque arrêt ou redémarrage du container Portainer, les données seront effacées et il faudra refaire toute la configuration.
Lors du lancement du container nous allons lui indiquer un lieu de stockage des informations (Volume). Comme ceci lors d’une mise à jour ou d’un reboot de Portainer vos données ne seront pas perdues.
Les données des volumes sont stockées dans /var/lib/docker/volumes/.
Pour voir les volumes existants vous pouvez utiliser la commande suivante :
docker volume ls
Voici les commandes a exécuter pour une configuration avancée de Portainer :
docker stop dedfd6540bb6 (container ID) docker volume create portainer_data docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
Gérer vos containers Docker avec Portainer
Après avoir exécuté les commandes ci-dessus, vous devez arriver sur l’interface de Portainer. Cette interface va vous permettre de gérer très facilement les containers présents sur votre machine.
Jusqu’ici, je ne sais pas si vous avez fait attention aux termes. Mais lorsque j’ai parcouru l’interface graphique Portainer, je n’ai pas compris la différence entre Images et Containers Docker. Voici donc un début d’explication.
Une image Docker est un fichier, qui constitue une capture instantanée d’un conteneur. Généralement, les images sont créées avec la commande « docker build ». Puis, ils vont produire un conteneur quand ils sont lancés avec la commande « run ».
En revanche, dans un registre Docker, les images sont stockées comme « registry.hub.docker.com ». Comme elles peuvent devenir assez volumineuses, les images sont conçues pour composer des couches d’autres images, ce qui permet d’envoyer une quantité minimale de données lors du transfert des images sur le réseau.
Un conteneur Docker est une instance exécutable d’une image. En utilisant l’API ou la CLI de Docker, nous pouvons créer, démarrer, arrêter, déplacer ou supprimer un conteneur. Nous pouvons aussi connecter un conteneur à un ou plusieurs réseaux, y attacher de la mémoire ou créer une nouvelle image sur la base de son état actuel.
Après avoir cliqué sur votre instance Portainer, vous avez un aperçu global de votre système docker notamment :
- 1 : Les informations système de base (nom, version de Docker, CPU, mémoire)
- 2 : Le nombre de containers,
- 3 : Le nombre d’images,
- 4 : Le nombre de volumes,
- 5 : Le nombre de réseaux
La liste des containers
La section des containers affiche une liste détaillée des containers avec leurs états ainsi que des informations utiles (nom, image, IP, redirection de ports, …). Il est aussi possible d’effectuer certaines actions sur ces containers :
- Démarrer
- Arrêter
- Kill
- Redémarrer
- Mettre en pause
- Reprendre
- Supprimer
- Ajouter un nouveau container
Les templates
Les templates permettent de lancer rapidement une instance d’un logiciel que l’on souhaite tester. Il faut éviter d’utiliser les templates pour les environnements de production mais cela reste utile et rapide pour effectuer des prototypes.
Les images
Au delà de la récupération d’une image depuis la registry Docker Hub, il est tout à fait possible de configurer sa propre registry projet pour gérer ses propres images. Au moment de l’ajout, il faudra alors spécifier cette registry pour récupérer l’image au bon endroit.
Déployer un container depuis Portainer
Une des fonctionnalités intéressantes de Portainer c’est la possibilité de déployer rapidement, depuis l’interface graphique un container.
Je vous rappelle, que le site Docker Hub, regorge de container prêt à l’emploi. Il vous suffit juste de saisir un mot clé comme MySQL, WordPress, Centreon ou bien encore Icinga pour trouver un container. Vous pouvez classer les résultats par date ou bien par pertinence.
Il suffit juste de noter le nom de l’image, pour pouvoir préparer votre container depuis Portainer.
Dans l’onglet Containers, cliquer sur + Add container.
Pour déployer votre container, il faudra :
- 1 : Saisir le nom de votre container
- 2 : Faire un copier-coller du nom de votre image que vous avez récupérer sur Docker Hub
- 3 : Cliquer sur Deploy the container puis patienter pendant le téléchargement de l’image et l’initialisation du container.
Au bout de quelques instants, le container est installé et démarre.
Créer une redirection de port
Vous devrez rediriger un port de la machine hôte vers le port du container. Si vous ne faites pas ceci il sera impossible d’accéder à votre container depuis votre IP publique.
Pour faire une redirection de port, il faut éditer l’image et cliquer sur Duplicate/Edit.
Dans Network ports configuration, il suffit dans :
- Host de saisir un numéro de port que vous n’utilisez pas sur votre machine hôte
- Container de saisir le port sur lequel écoute le container
- TCP-UDP sélectionner un protocole de transport, généralement TCP
Ensuite enregistrer le tout, votre container va redémarrer pour prendre en compte sa nouvelle configuration.
Ajouter un volume
Les volumes permettent d’enregistrer sur votre machine hôtes les données de vos containers.
Afin de dissocier les données de chaque container, je vous conseille de créer un volume pour chaque container.
Il faut aller dans Volumes -> Add Volume
Il suffit de donner un nom au volume (1) et de cliquer sur Create the volume (2)
Maintenant vous devez éditer votre container, puis aller dans Advanced container settings -> Volumes -> Map additionnal volume
- 1 : saisir le nom du répertoire ou du fichier qui doit être sauvegardé sur l’hôte. Généralement des indications se trouve sur le site Docker Hub pour chaque image.
- 2 : sélectionner le volume que vous avez créé précédemment dans la liste déroulante
- 3 : sélectionner le mode d’accès soit en écriture, soit en lecture
Pour enregistrer les modifications vous devrez régénérer le container en cliquant sur Deploy the container.
Mettre à jour Portainer
Le but de cette astuce c’est de suivre les versions de Portainer sans devoir tout recréer à chaque mise à jour.
J’utilise cette version de Portainer (portainer/portainer-ce), disponible sur le docker hub pour gérer mes images.
Voici l’enchainement des 8 commandes pour mettre Portainer à jour et vérifier le fichier de log du container Portainer :
docker ps -a docker stop portainer docker rm portainer docker image ls docker rmi (image-id) docker run -d -p 9000:9000 --name Portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce docker container ls docker logs -f -t --details Portainer
Accéder à Portainer en HTTPS
Par défaut l’accès à Portainer se fait en HTTP. Si vous l’utiliser sur un VPS public ou même en production, je vous conseille d’utiliser le HTTPS. Nous allons voir comment créer un certificat Let’s Encrypt puis ensuite l’intégrer à notre commande démarrage de container.
Tout d’abord sur votre VPS, vous devez utiliser l’utilitaire certbot afin de générer un certificat. Vu que ce n’est pas pour un site web avec Apache ou bien Nginx, la création va être un peu différente et nous aurons besoin de créer un champ TXT dans notre DNS pour créer notre certificat.
Voici la commande (remplacer votre domaine par le votre) :
certbot certonly --manual -d portainer.guillaumereynaud.fr --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory --register-unsafely-without-email --rsa-key-size 4096
Ensuite on vous demande de créer un champ TXT, avec des informations spécifiques, aller sur votre gestionnaire DNS, puis créer le champ TXT souhaité. Ensuite appuyer sur Entrée, le challenge débute et si vous avez bien créé l’entrée dans votre DNS votre certificat est créé.
Les certificats générés avec Let’s Encrypt sont stockés dans le répertoire /etc/letsencrypt/. Deux répertoire existe /live/ qui contient un lien symbolique vers les fichiers qui sont dans le répertoire /archive/.
Maintenant pour démarrer notre container en HTTPS, nous devons utiliser la commande suivante :
docker run -d -p 9000:9000 --name Portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /etc/letsencrypt/live/portainer.guillaumereynaud.fr/:/certs/live/portainer.guillaumereynaud.fr/ -v /etc/letsencrypt/archive/portainer.guillaumereynaud.fr/:/certs/archive/portainer.guillaumereynaud.fr/ -v portainer_data:/data portainer/portainer-ce --ssl --sslcert /certs/live/portainer.guillaumereynaud.fr/fullchain.pem --sslkey /certs/live/portainer.guillaumereynaud.fr/privkey.pem
Pa rapport à la commande initiale nous avons rajouté les options suivantes :
- 1 volume pour le répertoire live où sont stockés les liens symboliques de notre certificat (-v /etc/letsencrypt/live/portainer.guillaumereynaud.fr/:/certs/live/portainer.guillaumereynaud.fr/)
- 1 volume pour le répertoire archive où sont stockés les fichiers du certificat (-v /etc/letsencrypt/archive/portainer.guillaumereynaud.fr/:/certs/archive/portainer.guillaumereynaud.fr/ )
- Les commandes permettant de charger les différents certificats (–ssl –sslcert /certs/live/portainer.guillaumereynaud.fr/fullchain.pem –sslkey /certs/live/portainer.guillaumereynaud.fr/privkey.pem)
Votre instance de Portainer est maintenant accessible en HTTPS.