4 minutes
Docker et Docker Compose : le guide pratique pour le homelab
Docker, c’est la brique de construction du homelab moderne. Chaque service tourne dans son conteneur, isolé, reproductible, et on peut le déployer en une commande. Voici comment je l’utilise au quotidien, les erreurs que j’ai évitées, et les bonnes pratiques qui marchent.
Pourquoi Docker ?
Avant Docker, j’installais chaque service directement sur la machine. Python 3.8 pour un outil, Node.js 16 pour un autre, des conflits de ports, des dépendances qui cassent tout quand on met à jour un paquette.
Docker résout tout ça : chaque service a sa propre bulle, ses propres dépendances, son propre filesystem. Mettre à jour un conteneur n’affecte pas les autres. C’est la fin des “ça marche plus sur ma machine”.
Installation
Sur Ubuntu :
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
Puis déconnectez-vous et reconnectez-vous pour que le groupe prenne effet.
Vérifiez :
docker run hello-world
Si vous voyez le message de bienvenue, c’est bon.
Les commandes de base
Voici les commandes que j’utilise tous les jours :
# Lister les conteneurs en cours
docker ps
# Lister tous les conteneurs (y compris arrêtés)
docker ps -a
# Arrêter un conteneur
docker stop <nom>
# Supprimer un conteneur
docker rm <nom>
# Voir les logs
docker logs <nom>
# Entrer dans un conteneur
docker exec -it <nom> bash
Docker Compose : le vrai pouvoir
Docker Compose, c’est là que la magie opère. Au lieu de lancer des dizaines de commandes docker run, vous décrivez tout dans un fichier docker-compose.yml.
Exemple avec Uptime Kuma :
version: '3'
services:
uptime-kuma:
image: louislam/uptime-kuma
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
- TZ=Europe/Paris
Puis :
docker-compose up -d
C’est tout. Le service tourne en arrière-plan, redémarre automatiquement au reboot, et ses données sont persistées dans ./data.
Mes bonnes pratiques
Un fichier par service
Ne mettez pas tout dans un seul docker-compose.yml. Un répertoire par service, un fichier par stack :
/opt/docker/
├── uptime-kuma/
│ ├── docker-compose.yml
│ └── data/
├── miniflux/
│ ├── docker-compose.yml
│ └── data/
└── nginx-proxy-manager/
├── docker-compose.yml
└── data/
Quand vous aurez 15 services, vous me remercierez.
Toujours restart: unless-stopped
Pas always (qui redémarre même après un docker stop), pas on-failure (qui ne redémarre pas si le service plante proprement). unless-stopped : redémarre sauf si vous l’avez arrêté volontairement.
Les volumes nommés, pas les bind mounts
Pour les données critiques, préférez les volumes Docker gérés plutôt que les bind mounts. Les volumes sont gérés par Docker, plus faciles à sauvegarder, et évitent les problèmes de permissions.
Les healthchecks
Ajoutez un healthcheck à vos conteneurs critiques :
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001"]
interval: 30s
timeout: 10s
retries: 3
Si le service plante silencieusement, Docker le détecte et le redémarre.
Les variables d’environnement pour les secrets
Ne jamais mettre de mots de passe dans le docker-compose.yml. Utilisez un fichier .env :
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
Et le fichier .env dans .gitignore.
Ce que je tourne en Docker
Voici ma stack Docker actuelle :
| Service | Image | Port | Pourquoi |
|---|---|---|---|
| Uptime Kuma | louislam/uptime-kuma | 3001 | Monitoring |
| Nginx Proxy Manager | jc21/nginx-proxy-manager | 81 | Reverse proxy |
| Miniflux | miniflux/miniflux | 8181 | Lecteur RSS |
| Portainer | portainer/portainer-ce | 9000 | Gestion Docker |
| OneDev | codeondev/onedev | 6610 | Git + CI/CD |
Chaque service a son propre répertoire, ses propres volumes, et sa propre configuration.
Les erreurs que j’ai évitées
Ne pas utiliser
docker-composev1 : passez àdocker compose(sans tiret). La version v1 est dépréciée.Ne pas oublier le
docker system prune: les images abandonnées occupent de l’espace. Faites un ménage régulier.Ne pas ignorer les logs :
docker logs --tail 100 <nom>vous évitera des heures de diagnostic.Ne pas tout mettre en root : créez des utilisateurs dédiés dans les conteneurs quand c’est possible.
Ne pas oublier les sauvegardes : les volumes Docker ne sont pas sauvegardés par défaut. Configurez un backup régulier.
Monitoring Docker
Pour surveiller l’état de vos conteneurs :
# État de tous les conteneurs
docker stats --no-stream
# Espace disque utilisé
docker system df
# Logs en temps réel
docker logs -f <nom>
Portainer offre une interface web complète pour gérer vos conteneurs, voir les logs, et监控 les ressources.
Mise à jour des conteneurs
La procédure que je suis :
# Pour une image spécifique
docker compose pull
docker compose up -d
# Ou pour tout
docker compose down
docker compose pull
docker compose up -d
Astuce : utilisez Watchtower pour automatiser les mises à jour. Il vérifie les nouvelles versions et redémarre les conteneurs automatiquement.
Conclusion
Docker est devenu incontournable pour le homelab. C’est simple, puissant, et la communauté est immense. Commencez avec un ou deux services, familiarisez-vous avec les concepts (images, conteneurs, volumes, networks), et ajoutez au fur et à mesure.
Le plus important, c’est la régularité. Un fichier docker-compose.yml par service, des healthchecks partout, des sauvegardes configurées. Le reste viendra naturellement.
Articles liés :
- Proxmox : le guide complet — la plateforme pour faire tourner Docker
- Kubernetes k3s — l’alternative quand Docker ne suffit plus
- Self-hosting : les 10 services essentiels — quoi déployer en Docker
- Uptime Kuma — monitoring Docker en pratique
- Sauvegarder son homelab — sauvegarder les volumes Docker