Docker & Containers
Principe d’organisation
Section intitulée « Principe d’organisation »Chaque application a son propre dossier dans /docker/ :
/docker/├── traefik-lr9j/ ← Reverse proxy├── n8n-rkaf/ ← Automatisation├── n8n-mcp/ ← Serveur MCP pour Claude Code├── beszel-p8z2/ ← Monitoring├── kam/ ← Site Keur Adja Maye├── kamctrl/ ← Admin réservations├── suivi/ ← Dashboard monitoring├── diary/ ← Journal└── docs/ ← Cette documentationChaque dossier contient :
docker-compose.yml— définit le service, les volumes, les labels TraefikDockerfile— si l’image est construite localement (pas pour les services images officielles).env— variables d’environnement (jamais dans Git pour les secrets)
Démarrer / Arrêter un service
Section intitulée « Démarrer / Arrêter un service »cd /docker/<projet>
# Démarrer (en arrière-plan)docker compose up -d
# Arrêterdocker compose down
# Redémarrerdocker compose restart
# Rebuilder l'image ET redémarrerdocker compose up -d --build
# Voir les logs en temps réeldocker compose logs -fInspecter un container
Section intitulée « Inspecter un container »# Voir tous les containers (actifs + arrêtés)docker ps -a
# Entrer dans un container (shell interactif)docker exec -it <nom_container> sh # Alpinedocker exec -it <nom_container> bash # Ubuntu/Debian
# Voir les variables d'environnement d'un containerdocker exec <nom_container> env
# Inspecter (réseau, volumes, config complète)docker inspect <nom_container>Réseau traefik-public
Section intitulée « Réseau traefik-public »C’est le réseau Docker partagé par tous les containers exposés à internet. Traefik y est connecté et distribue le trafic en lisant les labels de chaque container.
# Créer le réseau (fait une seule fois, déjà en place)docker network create traefik-public
# Lister les containers sur ce réseaudocker network inspect traefik-public --format '{{range .Containers}}{{.Name}} {{end}}'Chaque docker-compose.yml déclare ce réseau comme externe :
networks: traefik-public: external: trueLabels Traefik
Section intitulée « Labels Traefik »Les labels sont ce qui permet à Traefik de savoir quel domaine envoyer vers quel container. Exemple pour un service sur monapp.levell.cloud :
labels: - "traefik.enable=true" - "traefik.http.routers.monapp.rule=Host(`monapp.levell.cloud`)" - "traefik.http.routers.monapp.entrypoints=websecure" - "traefik.http.routers.monapp.tls.certresolver=letsencrypt" - "traefik.http.services.monapp.loadbalancer.server.port=3000" - "traefik.docker.network=traefik-public"Le nom monapp dans les labels doit être unique sur tout le serveur (pas de conflit entre projets).
# Lister tous les volumesdocker volume ls
# Inspecter un volume (voir où les données sont stockées)docker volume inspect <nom_volume>
# Les données physiques sont dans :docker volume inspect <nom_volume># Lister les imagesdocker images
# Supprimer les images inutilisées (sans toucher aux containers actifs)docker image prune -f
# Taille utilisée par Dockerdocker system dfWorkflow de déploiement type
Section intitulée « Workflow de déploiement type »# 1. Modifier le code dans /docker/<projet>/# 2. Commiter (le push GitHub est automatique via hook)cd /docker/<projet>git add -Agit commit -m "feat: description du changement"
# 3. Rebuilder et redémarrer le containerdocker compose up -d --build
# 4. Vérifier que ça tournedocker ps | grep <nom>docker logs <nom_container> --tail 20