7 min read

Découverte de Portainer

Le gestionnaire de dockers en mode WebUI

Portainer permet de manager vos containers docker , et de connecter plusieurs environnements.

Lien vers le site officiel

On constate qu’il y a 3 environnements de connecté.

C’est très pratique , ça fonctionne très bien, cependant prenez l’habitude de créer un dossier par contenaire , afin d’y garder vos notes , vos scripts , le model de votre docker-compose , et éventuellement des sous dossiers si vous voulez les monter dans votre contenaire.

Exemple:

mkdir -p mon_docker/{data_mon_docker,config_mon_docker,logs_mon_docker}

Sans portainer , c’est de cette manière que vous allez le faire . Et c’est même comme ça que vous risquez de le faire par facilité . Par ce que ça fonctionne très bien sans portainer. Et c’est même formateur.

Comme ça :

cd mon_docker
docker compose up -d .

Et c’est tout , si le compose est bien fait: le docker démarre.

Portainer est lui même un docker , pour l’environnement local , portainer va utiliser le domain socket unix ( interprocess communication IPC ) , et qui va exploiter un agent pour les environnements distant , agent qui est également un docker.

De la même manière que portainer , l’agent utilise le domain socket unix pour ensuite exposer le service via un socket IP.

C’est un peu magique .

Dashboard principal

Au premier coup d’œil , vous connaissez:

  • le nombre de NODE
  • leurs CPU
  • leur RAM
  • le nombre d’images par nœud
  • le nombre de dockers
  • leurs états

Noeud principal

Ici portainer CE est installé sur une petite VM debian. Le dashboard nous donne un récapitulatif de la machine hôte (environnement local).

  • le nombre de stacks , ce qui correspond aux Docker-compose
  • le nombre d’images que vous avez récupéré
  • le nombre de réseaux
  • le nombre de containers et leur état
  • le nombre de volumes

Les stacks

Stacks correspond à docker compose qui permet de lancer plusieurs dockers en même temps, ou de lancer une stack web , soit l’application web et sa db.

Super pratique!! c’est ici que vous placez vos docker-compose , mais surtout ça permet de les modifier à chaud .

En ligne de commande , il faudrait se placer dans le répertoire du projet , modifier le docker-compose , puis le relancer avec docker compose up -d .

compose est un plugin de docker , up permet de lancer la stack , -d en mode détaché et le point signifie qu’il s’agit du répertoire dans le quel nous sommes situé.

Jetons un œil à Nextcloud :

Nous constatons qu’il y 2 dockers , 1 pour l’application, et 2 pour sa db .

Nous voyions que l’ont peut accéder à un éditeur , que nous pouvons stopper et supprimer la stack.

La partie du bas correspond à l’interface des containers , on verra cela plus loin.

L’éditeur de stack

Je vais modifier 2 ou 3 éléments puis relancer la stack . Ce n’est pas un docker que j’utilise vraiment beaucoup. Il peut bien servir d’exemple.

Quelques précisions sur les docker files:

Une chose importante à savoir , le format de fichier est du yaml ou yml.

L’indentation est très précise, et ne supporte pas la tabulation, il faut faire des espaces, sinon vous aurez des erreurs.

Par exemple , copiez collez le contenu dans un éditeur de texte , comme NotePad++, mettez l’indentation automatique , et détecter depuis le contenu , NP++ devrait détecter les espaces.

De plus, il fallait préciser la version de la syntaxe du compose , mais c’est terminé , à priori , c’est figé.

Maintenant , les déclarations tels que services, ou volumes démarre des le débuts de la ligne , et se terminent par : , lorsque vous faites entrée avec un éditeur correctement configuré , la ligne suivante sera bien positionnée .

Et , je vais détailler , un peu le fichier.

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=P@ssw0rdC0mpliqu3
      - MYSQL_PASSWORD=changeme
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=changeme
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

volumes

volumes:
  nextcloud:
  db:

On voit une première déclaration volumes . C’est ici que l’on déclare explicitement le ou les nom/s des volumes que l’on va utiliser . Ils sont situé dans /var/lib/docker/

tree -L 1 /var/lib/docker/
/var/lib/docker/
├── buildkit
├── containers
├── engine-id
├── image
├── network
├── overlay2
├── plugins
├── runtimes
├── swarm
├── tmp
└── volumes

11 directories, 1 file

On nomme les volumes, car au début des dockers , la légende racontait que les données étaient volatiles . Ce qui était évidemment faux , seulement à chaque lancement ; puis destruction; puis re lancement d’un docker , un nouveau volume se créait , avec une suite de nombre aléatoire .

Tout est transparent et ce fait automatiquement . A aucun moment vous n’avez demandé de créer un volume , ni même un réseau… donc docker le fait pour vous , à la volée.

Typiquement en faisant ce genre de commande:

docker run -it --rm busybox

Alors, forcément à lancer, puis détruire à la chaîne des dockers, fatalement , le user ne pouvait plus faire de docker inspect mon_docker_détruit pour savoir quel volume était rattaché à quel docker; puisque le docker était détruit, mais les volumes étaient bien sagement dans /var/lib/docker/volumes.

Si on nomme un volume:

── volumes
    ├── backingFsBlockDev
    ├── metadata.db
    ├── nextcloud_db
    ├── nextcloud_nextcloud
    ├── nginxproxymanager_letsencrypt_data
    ├── nginxproxymanager_npm_data
    ├── portainer_data
    ├── rustdesk_hbbr_data
    └── rustdesk_hbbs_data

On peut bien plus facilement les réutiliser , qu’une suite de nombre . On remarque également , que le nom est préfixé par le nom de la stack .

Le volume que l’on a déclaré plus haut , le docker va y stocker les données, ainsi vous ne perdrez rien , pour le peu que vous réutilisiez le même volume.

Rien ne vous empêche , de déclarer un nouveau volume en cas de réécriture , pour repartir sur un volume vide , et éviter des conflit entre version .

C’est très souple , vous n’avez pas idée. Ça vous évite la ré installation d’un serveur et de sa configuration. Vous pouvez bosser avec plusieurs version d’une db ou de php , sans même modifier quoi que ce soit sur votre serveur . A part installer docker.

C’est très malin.

services


services:
  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=P@ssw0rdC0mpliqu3
      - MYSQL_PASSWORD=changeme
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

Ici , en seconde déclaration nous avons les services (on peut parfaitement mettre les volumes après.)

services:
  db:

Nous voyions 2 services de déclaré , l’un pour la db , qui appelle l’image mariadb avec son N° de version, la récupération se fait automatiquement; et l’autre service app , qui appelle l’image nextcloud .

    restart: always

Vient ensuite la politique de redémarrage restart :

  • always
  • unless-stop
  • on-failur
  • no

Ensuite une commande envoyé directement au serveur mariadb .

Environment

C’est ici , que vous allez passer les crédentials d’un service .

    environment:
      - MYSQL_ROOT_PASSWORD=P@ssw0rdC0mpliqu3
      - MYSQL_PASSWORD=changeme
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

La bonne pratique voudrait créer un fichier .env contenant les variables .

Mais en vrai , ça change quoi ? C’est qu’un délire . Juste ça marche . Et c’est ce qui compte.

Pour la partie application : app

  app:
    image: nextcloud
    restart: always
    ports:
      - 8080:80
    links:
      - db

On voit que des ports sont définis . C’est là qu’il faut savoir (ou comprendre) que les ports de gauche correspondent aux ports de votre machine , les ports de droite correspondent au service du docker.

En somme , pour s’y connecter en mode web , il faudra y aller sur le port 8080.

Connexion app db

    links:
      - db

Avec ça , on ne s’embête même plus à configurer la méthode de connexion de la db. Elle est directement connecté à l’application.

C’est toujours du travail en moins.

Network

Pas besoin de s’en occuper. Docker travail dans un réseau en 172.17.0.0/16. Et va créer automatiquement un nouvelle plage : 172.18.0.0/16 , puis 172.19.0.0/16 et ainsi de suite .

Rien ne vous empêche de déconnecter vos dockers d’un réseau pour les connecter à un autre réseau. Vous pouvez même redéfinir , la plage de base , en modifiant le daemon docker.

Modification à chaud

Admettons , que je veuille ajouter , un hostname à la partie application .

Je vais l’appeler cloud.ordinatous.com , vu qu’elle est déjà accessible sous ce nom.

Succés !!

On vérifie dans le docker inspect

Et on se connecte en web. Bon … j’ai pas le bon crédential..

C’est parti pour la console pour réinitialiser le mot de passe..

Avec cette commande:


php /var/www/html/occ user:resetpassword ordinatous

It’s work !!

Et vous pensez bien , que j’ai changé l’heure de mon ordi …