0 Votes

Containers et Portainer

Modifié par john le 2026/09/20 20:10

Cette section regroupe mes notes autour de l’utilisation de conteneurs Docker, la gestion via Portainer, le déploiement d’applications auto-hébergées, et la configuration d’un accès sécurisé même en local.

Docker est aujourd’hui un outil incontournable pour isoler, déployer et gérer des services légers. Combiné à Portainer, on dispose d’une interface web pour piloter facilement ses conteneurs.

Information

Pour l'installation réellement en place sur mes deux machines, voir Portainer.

Déployer Portainer

Portainer permet d’administrer Docker via une interface web.

Exemple de stack

services:
 portainer:
   image: portainer/portainer-ce:lts
   container_name: portainer
   restart: always
   ports:
      - "9443:9443"
   volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
 portainer_data:

Interface accessible sur https://<IP_SERVEUR>:9443. Le compte administrateur doit être créé dans les minutes qui suivent le premier démarrage.

Le tag lts est préférable à latest : les versions de longue durée reçoivent les correctifs sans changement de comportement.

Sécuriser l’accès à Portainer

  • Accès en HTTPS (port 9443) uniquement
  • Mot de passe fort, et double authentification si possible
  • Restreindre l’accès par pare-feu (nftables, ufw) aux adresses de confiance
  • Ne publier le port 8000 que si des agents Edge sont utilisés
Warning

Monter /var/run/docker.sock dans un conteneur revient à lui donner un accès root à l'hôte : quiconque atteint cette interface contrôle la machine. Pour un service qui n'a besoin que de lire l'état des conteneurs, utiliser un proxy filtrant plutôt que le socket directement.

Déployer une application avec Docker Compose

Exemple pour XWiki :

services:
 xwiki:
   image: xwiki:lts-mariadb-tomcat
   ports:
      - "8080:8080"
   environment:
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_DATABASE=${DB_DATABASE}
      - DB_HOST=db
   volumes:
      - xwiki_data:/usr/local/xwiki

 db:
   image: mariadb:11.4
   environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASSWORD}
   volumes:
      - db_data:/var/lib/mysql

volumes:
 xwiki_data:
 db_data:

Les mots de passe ne sont jamais écrits dans le compose : ils viennent des variables d'environnement de la stack, ou d'un fichier .env non versionné.

Choisir une version de base de données encore supportée par son éditeur, et l'épingler sur une version majeure plutôt que latest, pour éviter une montée de version majeure automatique.

HTTPS sans domaine en local

Avec mkcert

mkcert -install
mkcert <IP_SERVEUR> <NOM_HOTE>

Le certificat est valide pour l'IP locale, à condition que l'autorité de mkcert soit installée sur les postes clients. Il peut ensuite être monté dans nginx, Traefik ou un service qui gère lui-même son TLS.

Superviser ses conteneurs

  • Utiliser des volumes nommés ou des dossiers montés pour la persistance
  • Épingler les images des bases de données, laisser latest aux applications
  • Limiter les droits : no-new-privileges, réseaux séparés, ports non publiés quand c'est possible
  • Sauvegarder les bases par un export SQL, jamais en copiant leurs fichiers pendant qu'elles tournent

Astuce : voir les ports utilisés

docker ps --format "table {{.Names}}\t{{.Ports}}"

Astuce : nettoyer

docker image prune          # images intermédiaires sans nom
docker system prune         # conteneurs arrêtés, réseaux inutilisés, cache de build
Warning

docker system prune -a supprime toutes les images qu'aucun conteneur en cours n'utilise, y compris les images construites localement, qui devront être reconstruites. Vérifier d'abord ce qui serait supprimé avec docker image ls.

Liens utiles

Liens internes