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
| Avantage | Description |
|---|---|
| Simplicité | Un déploiement = plusieurs conteneurs |
| Cohérence | Version contrôlée du fichier compose |
| Gestion | Dé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éthode | Description |
|---|---|
| Web editor | Écrire le compose directement |
| Upload | Télécharger un fichier .yml |
| Repository | Cloner depuis Git |
| Custom template | Utiliser 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
| Action | Description |
|---|---|
| Start | Démarrer tous les services |
| Stop | Arrêter tous les services |
| Delete | Supprimer la stack |
| Edit | Modifier le compose |
| Duplicate | Créer une copie |
| Migrate | Migrer 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
| Type | Description |
|---|---|
| Container | Template pour un seul conteneur |
| Stack | Template 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 |
|---|---|
| Stacks | Déploiement Docker Compose |
| Templates | Applications prédéfinies |
| Git integration | Stacks depuis repositories |
| GitOps | Redéploiement automatique |
| Webhooks | Inté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
- Déployez une stack WordPress via le web editor
- Créez un template personnalisé
- Configurez une stack depuis un repo Git
- Testez le webhook de redéploiement