Installation de Portainer
Objectifs du chapitre
- Installer Portainer sur Docker standalone
- Déployer Portainer sur Docker Swarm
- Configurer l'agent Portainer
- Sécuriser l'installation
1 - Installation sur Docker Standalone
Méthode rapide
# Créer le volume de données
docker volume create portainer_data
# Déployer Portainer CE
docker run -d \
-p 8000:8000 \
-p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Explication des paramètres
| Paramètre | Description |
|---|---|
-p 9443:9443 | Port HTTPS de l'interface web |
-p 8000:8000 | Port pour l'agent Edge |
--restart=always | Redémarrage automatique |
-v /var/run/docker.sock | Accès au daemon Docker |
-v portainer_data:/data | Persistance des données |
Avec Docker Compose
# docker-compose.yml
version: "3.9"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "8000:8000"
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
docker compose up -d
Premier accès
- Ouvrir https://localhost:9443
- Accepter le certificat auto-signé
- Créer le compte administrateur (mot de passe fort)
- Sélectionner "Get Started" pour l'environnement local
2 - Installation sur Docker Swarm
Déploiement en tant que service
# Sur un manager Swarm
docker service create \
--name portainer \
--publish 9443:9443 \
--publish 8000:8000 \
--replicas=1 \
--constraint 'node.role==manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=volume,src=portainer_data,dst=/data \
portainer/portainer-ce:latest
Avec Stack (recommandé)
# portainer-stack.yml
version: "3.9"
services:
agent:
image: portainer/agent:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints:
- node.platform.os == linux
portainer:
image: portainer/portainer-ce:latest
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
docker stack deploy -c portainer-stack.yml portainer
Vérification
# Services déployés
docker service ls | grep portainer
# Logs
docker service logs portainer_portainer
3 - Agent Portainer
Pourquoi l'agent ?
L'agent Portainer permet de :
- Gérer des environnements distants
- Accéder aux fonctionnalités avancées (browse volumes)
- Éviter d'exposer le socket Docker
┌─────────────────────────────────────────────────────────────┐
│ Portainer Server │
│ (Centralisé) │
└──────────────────────────┬──────────────────────────────────┘
│ Port 9001
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Agent │ │ Agent │ │ Agent │
│ Host 1 │ │ Host 2 │ │ Host 3 │
└─────────┘ └─────────┘ └─────────┘
Déployer l'agent (standalone)
docker run -d \
-p 9001:9001 \
--name portainer_agent \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
portainer/agent:latest
Déployer l'agent (Swarm)
docker service create \
--name portainer_agent \
--network portainer_agent_network \
--mode global \
--constraint 'node.platform.os==linux' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=/var/lib/docker/volumes,dst=/var/lib/docker/volumes \
portainer/agent:latest
Connecter l'agent à Portainer
- Dans Portainer, aller dans Environments
- Cliquer sur Add environment
- Sélectionner Agent
- Entrer :
<IP_AGENT>:9001 - Nommer l'environnement
- Cliquer sur Connect
4 - Edge Agent
Cas d'usage
L'Edge Agent est utile pour :
- Environnements derrière NAT/firewall
- Connexion sortante uniquement
- Sites distants sans IP publique
Déploiement
- Dans Portainer, créer un Edge environment
- Copier la commande générée
- Exécuter sur l'hôte distant :
docker run -d \
--name portainer_edge_agent \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
-v /:/host \
-v portainer_agent_data:/data \
-e EDGE=1 \
-e EDGE_ID=<EDGE_ID> \
-e EDGE_KEY=<EDGE_KEY> \
-e EDGE_INSECURE_POLL=1 \
portainer/agent:latest
5 - Configuration avancée
Variables d'environnement
docker run -d \
-p 9443:9443 \
--name portainer \
-e ADMIN_PASSWORD='$2y$...' \ # Hash bcrypt du mot de passe
-e LOGO_URL='https://example.com/logo.png' \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
| Variable | Description |
|---|---|
ADMIN_PASSWORD | Hash bcrypt du mot de passe admin |
LOGO_URL | URL du logo personnalisé |
TEMPLATES_URL | URL des templates personnalisés |
Générer le hash du mot de passe
# Avec htpasswd
htpasswd -nbB admin 'votre-mot-de-passe' | cut -d ":" -f 2
# Ou avec Docker
docker run --rm httpd:alpine htpasswd -nbB admin 'votre-mot-de-passe' | cut -d ":" -f 2
HTTPS avec certificat personnalisé
docker run -d \
-p 9443:9443 \
--name portainer \
-v /path/to/certs:/certs \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest \
--ssl \
--sslcert /certs/cert.pem \
--sslkey /certs/key.pem
6 - Installation avec Traefik
Docker Compose avec Traefik
version: "3.9"
services:
traefik:
image: traefik:v2.10
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "[email protected]"
- "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
portainer:
image: portainer/portainer-ce:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`portainer.example.com`)"
- "traefik.http.routers.portainer.entrypoints=websecure"
- "traefik.http.routers.portainer.tls.certresolver=le"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
volumes:
portainer_data:
letsencrypt:
7 - Mise à jour de Portainer
Standalone
# Arrêter et supprimer le conteneur
docker stop portainer
docker rm portainer
# Télécharger la nouvelle image
docker pull portainer/portainer-ce:latest
# Redéployer (les données sont dans le volume)
docker run -d \
-p 8000:8000 \
-p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Swarm
# Mettre à jour le service
docker service update \
--image portainer/portainer-ce:latest \
portainer_portainer
# Mettre à jour l'agent
docker service update \
--image portainer/agent:latest \
portainer_agent
8 - Dépannage
Portainer ne démarre pas
# Vérifier les logs
docker logs portainer
# Vérifier le socket Docker
ls -la /var/run/docker.sock
# Permissions du socket
sudo chmod 666 /var/run/docker.sock
Impossible de se connecter
# Vérifier que le conteneur tourne
docker ps | grep portainer
# Vérifier les ports
docker port portainer
# Tester la connectivité
curl -k https://localhost:9443
Réinitialiser le mot de passe admin
# Arrêter Portainer
docker stop portainer
# Réinitialiser
docker run --rm -v portainer_data:/data portainer/helper-reset-password
# Redémarrer
docker start portainer
Résumé
| Mode | Commande clé |
|---|---|
| Standalone | docker run ... portainer/portainer-ce |
| Swarm | docker stack deploy avec agent |
| Agent | docker run ... portainer/agent |
| Edge | Agent avec connexion sortante |
Points clés
- Toujours créer un volume pour la persistance
- Utiliser l'agent pour les environnements distants
- HTTPS activé par défaut sur le port 9443
- Les données survivent aux mises à jour
Exercices pratiques
- Installez Portainer sur votre machine locale
- Créez un compte administrateur sécurisé
- Ajoutez un environnement distant avec l'agent
- Configurez HTTPS avec un certificat personnalisé