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 :

ServiceImagePortPourquoi
Uptime Kumalouislam/uptime-kuma3001Monitoring
Nginx Proxy Managerjc21/nginx-proxy-manager81Reverse proxy
Minifluxminiflux/miniflux8181Lecteur RSS
Portainerportainer/portainer-ce9000Gestion Docker
OneDevcodeondev/onedev6610Git + CI/CD

Chaque service a son propre répertoire, ses propres volumes, et sa propre configuration.

Les erreurs que j’ai évitées

  1. Ne pas utiliser docker-compose v1 : passez à docker compose (sans tiret). La version v1 est dépréciée.

  2. Ne pas oublier le docker system prune : les images abandonnées occupent de l’espace. Faites un ménage régulier.

  3. Ne pas ignorer les logs : docker logs --tail 100 <nom> vous évitera des heures de diagnostic.

  4. Ne pas tout mettre en root : créez des utilisateurs dédiés dans les conteneurs quand c’est possible.

  5. 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 :