Containers et Portainer
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.
Déployer Portainer
Portainer permet d’administrer Docker via une interface web.
Exemple de stack
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
Déployer une application avec Docker Compose
Exemple pour XWiki :
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 <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
Astuce : nettoyer
docker system prune # conteneurs arrêtés, réseaux inutilisés, cache de build