À quoi ça sert

Quand on gère un seul conteneur, la CLI Docker (docker ps, docker logs) suffit largement. Mais dès qu'on en a une dizaine répartis sur plusieurs machines, retenir tous les noms et enchaîner les commandes devient fastidieux. Portainer apporte une couche visuelle au-dessus :

  • Vue d'ensemble — voir tous les conteneurs, leur état, l'usage CPU/RAM, en un coup d'œil.
  • Lecture rapide des logs — clic sur un conteneur, ses logs s'affichent en temps réel, sans docker logs -f.
  • Déploiement de stacks — uploader un docker-compose.yml via l'UI, Portainer le déploie et suit son état.
  • Gestion multi-environnements — un seul Portainer pour piloter plusieurs hôtes Docker, voire plusieurs clusters Kubernetes, depuis la même UI.
  • Console dans le navigateur — équivalent docker exec -it mais accessible à un coéquipier qui n'a pas SSH sur le serveur.
  • Templates et App Store — déployer un Postgres, un Grafana ou un MinIO en quelques clics depuis une bibliothèque intégrée.
Portainer CE vs Business ?

Portainer Community Edition est gratuit et open-source — c'est ce qui est couvert dans cette fiche, et c'est largement suffisant pour la majorité des usages. Portainer Business Edition ajoute la gestion fine des rôles, l'authentification SSO, la gestion centralisée à très grande échelle (centaines de clusters). Gratuit jusqu'à 3 nœuds, puis payant. Sauf besoin d'entreprise spécifique, reste sur la CE.

Un exemple d'usage

Tu as un serveur où tournent plusieurs services (FastAPI, PostgreSQL, Grafana…) en conteneurs Docker. Tu veux pouvoir les visualiser et donner accès en lecture à un coéquipier sans lui filer un compte SSH. Lancer Portainer prend une commande :

bash
docker volume create portainer_data

docker run -d \
  --name portainer \
  --restart=always \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Portainer est lancé sur https://localhost:9443. Au premier accès, tu crées le compte admin. Portainer voit automatiquement tous les conteneurs Docker de la machine via le socket monté, et tu navigues sans plus rien à configurer.

How-to : installer et utiliser Portainer

  1. Pré-requis : Docker installé

    Portainer tourne dans Docker (cf. Docker) et a besoin d'accéder au démon de l'hôte via le socket /var/run/docker.sock. Aucune autre installation n'est nécessaire.

  2. Lancer Portainer Community Edition

    bash
    # Créer un volume persistant pour les données de Portainer
    docker volume create portainer_data
    
    # Lancer le conteneur
    docker run -d \
      --name portainer \
      --restart=always \
      -p 9443:9443 \
      -p 9000:9000 \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v portainer_data:/data \
      portainer/portainer-ce:latest

    9443 = UI en HTTPS (auto-signé par défaut), 9000 = UI en HTTP (à éviter en prod). --restart=always assure que Portainer redémarre avec la machine.

    Le piège docker.sock

    Monter /var/run/docker.sock dans un conteneur lui donne les pleins pouvoirs sur le démon Docker hôte — équivalent root sur la machine. C'est voulu pour Portainer (il doit gérer Docker) mais ne fais jamais ça pour des conteneurs applicatifs ordinaires.

  3. Première connexion

    Ouvre https://<ton-host>:9443 dans un navigateur. Le certificat est auto-signé → ton navigateur va râler, c'est normal. Au premier accès :

    • Création du compte admin (à faire dans les 5 minutes après le démarrage, sinon Portainer se verrouille pour des raisons de sécurité — il faut alors redémarrer le conteneur).
    • Sélection de l'environnement à manager → choisir « local » pour gérer le Docker de la même machine (le plus courant).
  4. Naviguer dans l'UI

    Une fois connecté, les sections clés (menu de gauche) :

    • Containers — liste, démarrer/arrêter, logs, console, inspect (équivalent docker inspect).
    • Images — voir, télécharger (pull), supprimer les images locales.
    • Volumes — gérer les volumes nommés, voir lesquels sont orphelins (à nettoyer).
    • Networks — voir et créer des réseaux Docker.
    • Stacks — l'équivalent docker compose up mais dans l'UI (voir étape suivante).
    • App Templates — bibliothèque de stacks pré-définies (Postgres, WordPress, Nginx…) à déployer en un clic.
  5. Déployer une stack via l'UI

    Le pattern le plus utile : tu as un docker-compose.yml que tu veux déployer sans SSH ni CLI.

    1. Stacks → Add stack
    2. Coller le contenu de ton docker-compose.yml dans l'éditeur, OU pointer un repo Git (Portainer pull automatiquement le compose, et peut même redéployer à chaque push avec un webhook).
    3. Deploy the stack → Portainer fait l'équivalent de docker compose up -d.
    4. Suivre les logs en temps réel depuis l'onglet Containers de la stack.
    Stack depuis Git, mode automatique

    Pointer un repo Git permet le pattern « GitOps » du pauvre : un push sur main = redéploiement auto sur le serveur. Sans Argo CD ni Flux. Pratique pour un projet personnel ou une petite équipe.

  6. Donner accès à un coéquipier

    Plutôt que partager le compte admin :

    1. Users → Add user — créer un utilisateur standard avec mot de passe.
    2. Endpoints ou Environments → Access → assigner cet utilisateur à un ou plusieurs environnements.
    3. En CE, deux rôles : standard user (peut tout faire sur les environnements autorisés) ou read-only (voit mais ne touche pas). Les rôles fins sont en Business.
  7. Gérer plusieurs serveurs Docker

    Portainer peut piloter plusieurs hôtes depuis la même UI via son Agent à déployer sur les autres machines :

    bash (sur la machine distante)
    docker run -d \
      --name portainer_agent \
      --restart=always \
      -p 9001:9001 \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /var/lib/docker/volumes:/var/lib/docker/volumes \
      portainer/agent:latest

    Côté Portainer : Environments → Add environment → Docker → Agent et indiquer <ip-distante>:9001. La nouvelle machine apparaît dans le sélecteur d'environnement.

  8. Sécuriser pour la prod

    • Mettre Portainer derrière un reverse-proxy (cf. Traefik) avec un vrai certificat Let's Encrypt, plutôt que d'exposer le port 9443 avec son cert auto-signé.
    • Ne jamais exposer le port 9000 (HTTP) en prod — utiliser uniquement 9443.
    • Activer l'auth 2FA pour les comptes (depuis Settings → Authentication).
    • Ne pas binder Portainer sur 0.0.0.0 si tu peux le restreindre au réseau interne (VPN, IP allowlist via le reverse-proxy).
  9. Mise à jour

    Portainer se met à jour en remplaçant le conteneur — le volume portainer_data conserve toute la config.

    bash
    docker pull portainer/portainer-ce:latest
    docker stop portainer && docker rm portainer
    # Re-lancer avec la commande docker run de l'étape 2

Aide-mémoire

bash (install)
docker volume create portainer_data
docker run -d --name portainer --restart=always \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest
bash (agent distant)
docker run -d --name portainer_agent --restart=always \
  -p 9001:9001 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  portainer/agent:latest
bash (maintenance)
docker logs -f portainer            # debug du lancement
docker restart portainer             # déverrouiller setup
docker pull portainer/portainer-ce:latest  # MAJ image

Portainer et le reste de l'écosystème

  • Docker — Portainer est une UI au-dessus de Docker. Il ne remplace pas la CLI mais la complète : la CLI reste plus rapide pour des actions ponctuelles, Portainer est plus confortable pour la supervision et le travail en équipe.
  • Kubernetes — Portainer sait aussi gérer des clusters Kubernetes (déploiement, services, pods…). Plus simple que kubectl au début, mais moins puissant qu'un vrai outil comme Lens ou k9s pour les usages avancés.
  • Traefik — couple naturel : Portainer pour visualiser/déployer, Traefik pour router le trafic vers les conteneurs avec des certificats Let's Encrypt automatiques. Met Portainer lui-même derrière Traefik en prod.
  • Uptime Kuma — Portainer voit l'état technique des conteneurs (running, healthcheck) ; Uptime Kuma voit le service du point de vue utilisateur (réponse HTTP, latence). Les deux ensemble couvrent bien la supervision d'un petit parc.
  • Grafana / Prometheus — pour des métriques fines (CPU/RAM par conteneur sur le temps, alerting), passer à Prometheus + cAdvisor + Grafana. Portainer donne une vue instantanée, pas un historique long.
  • MinIO / PostgreSQL / MLflow — tous ces services tournent souvent en conteneurs Docker dans un projet MLOps. Portainer devient le tableau de bord unique pour les suivre, plutôt que jongler entre les UIs de chacun.
Portainer ou docker-compose en CLI ?

Sur ton poste de dev, docker compose up en CLI est plus rapide. Portainer prend tout son sens quand tu as un serveur distant avec plusieurs services à surveiller, ou quand tu veux donner accès à quelqu'un qui n'est pas à l'aise en CLI. Les deux ne s'excluent pas : les stacks Portainer sont juste des compose files déployés via l'UI.

Pour aller plus loin