Aller au contenu principal

Stacks et templates


Objectifs du chapitre

  • Déployer des stacks Docker Compose
  • Utiliser les templates d'applications
  • Créer des templates personnalisés
  • Gérer les déploiements

1 - Qu'est-ce qu'une Stack ?

Définition

Une stack dans Portainer est un ensemble de services déployés ensemble, défini par un fichier Docker Compose.

┌─────────────────────────────────────────────────────────────────┐
│ Stack "wordpress" │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ wordpress │ ────▶ │ mysql │ │
│ │ :8080 │ │ :3306 │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ Volume │ │
│ │ mysql_data │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

Avantages

AvantageDescription
SimplicitéUn déploiement = plusieurs conteneurs
CohérenceVersion contrôlée du fichier compose
GestionDémarrer/arrêter tout ensemble
ReproductibilitéMême configuration à chaque fois

2 - Créer une stack

Interface de création

┌─────────────────────────────────────────────────────────────────┐
│ + Add Stack │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Name: [my-wordpress ] │
│ │
│ Build method: │
│ (•) Web editor │
│ ( ) Upload │
│ ( ) Repository │
│ ( ) Custom template │
│ │
└─────────────────────────────────────────────────────────────────┘

Méthodes de création

MéthodeDescription
Web editorÉcrire le compose directement
UploadTélécharger un fichier .yml
RepositoryCloner depuis Git
Custom templateUtiliser un template existant

Éditeur de stack

┌─────────────────────────────────────────────────────────────────┐
│ Web editor │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ version: "3.9" │ │
│ │ │ │
│ │ services: │ │
│ │ wordpress: │ │
│ │ image: wordpress:latest │ │
│ │ ports: │ │
│ │ - "8080:80" │ │
│ │ environment: │ │
│ │ WORDPRESS_DB_HOST: db │ │
│ │ WORDPRESS_DB_USER: wordpress │ │
│ │ WORDPRESS_DB_PASSWORD: ${DB_PASSWORD} │ │
│ │ WORDPRESS_DB_NAME: wordpress │ │
│ │ depends_on: │ │
│ │ - db │ │
│ │ │ │
│ │ db: │ │
│ │ image: mysql:8 │ │
│ │ environment: │ │
│ │ MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} │ │
│ │ MYSQL_DATABASE: wordpress │ │
│ │ MYSQL_USER: wordpress │ │
│ │ MYSQL_PASSWORD: ${DB_PASSWORD} │ │
│ │ volumes: │ │
│ │ - db_data:/var/lib/mysql │ │
│ │ │ │
│ │ volumes: │ │
│ │ db_data: │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Environment variables: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ [DB_PASSWORD ] = [secret123 ] [+ Add] │ │
│ │ [DB_ROOT_PASSWORD] = [rootsecret ] │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ [Deploy the stack] │
│ │
└─────────────────────────────────────────────────────────────────┘

3 - Gérer les stacks

Liste des stacks

┌─────────────────────────────────────────────────────────────────┐
│ 📚 Stacks [+ Add stack] │
├─────────────────────────────────────────────────────────────────┤
│ Name Type Status Services Controls │
│ ──────────────────────────────────────────────────────────────│
│ wordpress Compose ✅ Active 2/2 [⚙️] │
│ monitoring Compose ✅ Active 3/3 [⚙️] │
│ dev-tools Compose ⏸️ Stopped 0/2 [⚙️] │
│ │
└─────────────────────────────────────────────────────────────────┘

Actions sur une stack

ActionDescription
StartDémarrer tous les services
StopArrêter tous les services
DeleteSupprimer la stack
EditModifier le compose
DuplicateCréer une copie
MigrateMigrer vers un autre environnement

Détails d'une stack

┌─────────────────────────────────────────────────────────────────┐
│ 📚 wordpress │
├─────────────────────────────────────────────────────────────────┤
│ Tabs: [Services] [Editor] [Environment variables] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Services: │
│ ─────────────────────────────────────────────────────────────│
│ │
│ □ Service Image Status Replicas │
│ ──────────────────────────────────────────────────────────────│
│ □ wordpress wordpress:latest 🟢 1/1 │
│ □ db mysql:8 🟢 1/1 │
│ │
│ Resources: │
│ ─────────────────────────────────────────────────────────────│
│ Networks: wordpress_default │
│ Volumes: wordpress_db_data │
│ │
└─────────────────────────────────────────────────────────────────┘

4 - Stacks depuis Git

Configuration Git

┌─────────────────────────────────────────────────────────────────┐
│ Repository │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Repository URL: [https://github.com/user/myapp ] │
│ │
│ Reference: [main ] │
│ │
│ Compose path: [docker-compose.yml ] │
│ │
│ Authentication: │
│ ☑ Enable authentication │
│ Username: [myuser ] │
│ Personal access token: [ghp_xxxxx ] │
│ │
│ Automatic updates: │
│ ☑ Enable GitOps updates │
│ Mechanism: ( ) Polling (•) Webhook │
│ Interval: [5 minutes ▼] │
│ │
└─────────────────────────────────────────────────────────────────┘

GitOps avec Portainer

Portainer peut automatiquement redéployer la stack quand le repo Git change :

┌─────────────────────────────────────────────────────────────────┐
│ GitOps Workflow │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Developer GitHub Portainer │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ git push│ ────▶ │ Repo │ ────▶ │ Poll/ │ │
│ │ │ │ updated │ │ Webhook │ │
│ └─────────┘ └─────────┘ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │Redeploy │ │
│ │ Stack │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

5 - Templates d'applications

Accéder aux templates

┌─────────────────────────────────────────────────────────────────┐
│ 📋 App Templates │
├─────────────────────────────────────────────────────────────────┤
│ Filter: [All categories ▼] [🔍 Search... ] │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ Nginx │ │ WordPress │ │ PostgreSQL │ │
│ │ 🌐 │ │ 📝 │ │ 🐘 │ │
│ │ Web server │ │ Blog/CMS │ │ Database │ │
│ │ [Deploy] │ │ [Deploy] │ │ [Deploy] │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ MySQL │ │ Redis │ │ MongoDB │ │
│ │ 🐬 │ │ 📕 │ │ 🍃 │ │
│ │ Database │ │ Cache │ │ NoSQL DB │ │
│ │ [Deploy] │ │ [Deploy] │ │ [Deploy] │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘

Déployer un template

┌─────────────────────────────────────────────────────────────────┐
│ Deploy: WordPress │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Configuration: │
│ ─────────────────────────────────────────────────────────────│
│ Name: [my-wordpress ] │
│ │
│ Environment variables: │
│ ─────────────────────────────────────────────────────────────│
│ Database password: [mysecretpassword ] │
│ WordPress admin user: [admin ] │
│ WordPress admin pass: [adminpassword ] │
│ │
│ Network: [bridge ▼] │
│ │
│ Access control: │
│ (•) Administrators only │
│ ( ) Restricted │
│ │
│ [Deploy container] │
│ │
└─────────────────────────────────────────────────────────────────┘

6 - Créer des templates personnalisés

Types de templates

TypeDescription
ContainerTemplate pour un seul conteneur
StackTemplate pour une stack compose

Créer un template Stack

Settings > App Templates > + Add template

┌─────────────────────────────────────────────────────────────────┐
│ Create template │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Type: ( ) Container (•) Stack │
│ │
│ Title: [My Custom App ] │
│ Description: [Complete LAMP stack ] │
│ Logo: [https://example.com/logo.png] │
│ Platform: [linux ▼] │
│ │
│ Categories: [Webserver, Database ] │
│ │
│ Repository URL: [https://github.com/user/template ] │
│ Compose path: [docker-compose.yml ] │
│ │
│ OR Web editor: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ version: "3.9" │ │
│ │ services: │ │
│ │ ... │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Environment variables (user-configurable): │
│ ─────────────────────────────────────────────────────────────│
│ [DB_PASSWORD ] Label: [Database password ] Default: [] │
│ [ADMIN_EMAIL ] Label: [Admin email ] Default: [] │
│ [+ Add] │
│ │
│ [Create template] │
│ │
└─────────────────────────────────────────────────────────────────┘

Template depuis URL externe

Vous pouvez aussi charger des templates depuis une URL :

┌─────────────────────────────────────────────────────────────────┐
│ Settings > App Templates │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Template source: │
│ URL: [https://raw.githubusercontent.com/.../templates.json] │
│ │
│ [Save settings] │
│ │
└─────────────────────────────────────────────────────────────────┘

7 - Webhooks

Déclencher un redéploiement

Portainer fournit des webhooks pour automatiser les redéploiements :

┌─────────────────────────────────────────────────────────────────┐
│ Stack Webhook │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Webhook URL: │
│ https://portainer.example.com/api/stacks/webhook/abc123xyz │
│ │
│ Usage: │
│ curl -X POST https://portainer.example.com/api/.../abc123xyz │
│ │
│ ☑ Enable webhook │
│ │
└─────────────────────────────────────────────────────────────────┘

Intégration CI/CD

# GitHub Actions
- name: Redeploy stack
run: |
curl -X POST ${{ secrets.PORTAINER_WEBHOOK_URL }}

# GitLab CI
deploy:
script:
- curl -X POST $PORTAINER_WEBHOOK_URL

8 - Exemples de stacks

Stack de développement

version: "3.9"

services:
app:
build: .
ports:
- "3000:3000"
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
depends_on:
- db
- redis

db:
image: postgres:15
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- pg_data:/var/lib/postgresql/data

redis:
image: redis:7-alpine

adminer:
image: adminer
ports:
- "8080:8080"

volumes:
pg_data:

Stack de monitoring

version: "3.9"

services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus

grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}

volumes:
prometheus_data:
grafana_data:

Résumé

FonctionnalitéDescription
StacksDéploiement Docker Compose
TemplatesApplications prédéfinies
Git integrationStacks depuis repositories
GitOpsRedéploiement automatique
WebhooksIntégration CI/CD
Points clés
  • Les stacks simplifient le déploiement multi-conteneurs
  • Les templates accélèrent la mise en place d'applications
  • L'intégration Git permet le GitOps
  • Les webhooks automatisent les déploiements

Exercices pratiques

  1. Déployez une stack WordPress via le web editor
  2. Créez un template personnalisé
  3. Configurez une stack depuis un repo Git
  4. Testez le webhook de redéploiement

← Volumes et réseaux | Utilisateurs et RBAC →