TECHNOLOGIES / Docker
Docker : pour des environnements de développement et CI maîtrisés
Docker conteneurise nos environnements de développement et de CI pour garantir que chaque développeur travaille dans des conditions identiques, quelle que soit sa machine. Un seul docker compose up suffit à démarrer un projet Symfony complet.
Cette page vous explique pourquoi nous sommes convaincus par Docker pour nos projets et vous fournit l'essentielle des commandes du quotidien.
PRÉSENTATION
Qu'est-ce que Docker ?
Docker est un système de gestion qui permet de découper les environnements d'exécution de vos applicatifs en briques indépendantes appelées conteneurs. Chaque conteneur embarque toutes les dépendances nécessaires pour votre programme, tout en étant beaucoup plus léger qu'un système d'exploitation complet.
L'arrivée de Docker sur le marché a été une révolution : il a résolu une multitude de problèmes liés à l'utilisation de machines virtuelles. La construction de conteneurs est accessible à tous grâce aux fichiers Dockerfile, qui permettent de partager et d'étendre facilement votre travail. D'un point de vue technique, Docker s'appuie sur LXC (Linux Containers) et s'utilise en ligne de commande, souvent associé à Docker Compose pour orchestrer un ensemble de conteneurs.
Chez SmartBooster, nous avons industrialisé l'intégralité de nos environnements de développement grâce à Docker et nous partageons nos images en open source sur GitHub.
POURQUOI DOCKER
Ce qui en fait notre standard d'environnement
Docker est présent sur tous nos projets Symfony dès le premier jour. Voici pourquoi nous ne développons plus sans lui.
Environnement identique sur tous les postes
Avec Docker, chaque développeur dispose exactement du même environnement : même version de PHP, même version de MySQL, même configuration Apache. Le classique "ça marche pas chez moi" disparaît.
Onboarding en une commande
Un nouveau développeur clone le projet et lance docker compose up. L'environnement complet est prêt en quelques minutes sans installer PHP, MySQL ou Apache localement.
Isolation des services
PHP, base de données, cache Redis, serveur mail de test → chaque service tourne dans son propre conteneur. Pas de conflit de version entre projets, chaque projet a sa propre configuration.
Environnement jetable et propre
Besoin de tester une migration de base de données ? On repart d'un conteneur vierge en quelques secondes. Pas de résidus, pas d'état persistant non maîtrisé qui fausse les tests.
Versionné avec le projet
Le docker-compose.yml et le Dockerfile vivent dans le dépôt Git. L'environnement évolue avec le code et chaque changement d'infrastructure est tracé et réversible.
NOTRE USAGE
Comment nous utilisons Docker chez SmartBooster
Notre configuration Docker suit une structure commune à tous les projets pour réduire la courbe d'apprentissage et faciliter la reprise.
Stack Symfony basée sur symfony-docker
Nos projets Symfony s'appuient sur notre template open source smartbooster/symfony-docker : PHP, Apache et MySQL préconfigurés, prêts à cloner et démarrer en une commande.
Volumes pour la persistance
Les données de la base de données sont stockées dans un volume Docker nommé pour survivre aux redémarrages de conteneurs. Le code source est monté en bind mount pour le rechargement à chaud.
Variables d'environnement via .env
Les configurations sensibles (DSN base de données, clés API) transitent par les variables d'environnement. Le fichier .env.local est ignoré par Git.
VERSIONS
Vérifier et mettre à jour vos versions Docker
Avant de travailler sur un projet, assurez-vous que Docker Engine et Docker Compose sont à jour. Une version obsolète peut provoquer des comportements inattendus ou des incompatibilités avec les images du projet.
Vérifier la version Docker Engine
Vérifie que le daemon Docker tourne et affiche la version du client et du serveur.
docker version
Vérifier la version Docker Compose
Docker Compose v2 est intégré comme plugin Docker, la commande s'écrit sans tiret (contrairement à l'ancienne commande docker-compose).
docker compose version
BONNES PRATIQUES & DOCUMENTATION
Nos conventions Docker
Documentation de référence pour l'équipe SmartBooster.
Liste des commandes Docker utiles au quotidien
Liste des commandes Docker utiles au quotidien
Commandes de visibilité
Étant amener à naviguer dans un context multi projet il est primordial de connaitre et suivre les ressources Docker utilisé sur son poste de travail.
Voici donc la liste des commandes Docker les plus utiles au quotidien :
| Commande | Explication | Cas d'usage |
|---|---|---|
docker version |
Affiche la version du client et du daemon Docker | Vérifier la version installée, s'assurer que le daemon est démarré |
docker ps |
Liste les conteneurs en cours d'exécution | Voir ce qui tourne, récupérer le nom ou l'ID d'un conteneur |
docker ps -a |
Liste tous les conteneurs, y compris les arrêtés | Repérer un conteneur en erreur ou un conteneur oublié |
docker images |
Liste toutes les images locales avec leur taille | Identifier les images inutilisées qui consomment de l'espace |
docker network ls |
Liste les réseaux Docker existants | Vérifier qu'un réseau partagé est actif, repérer des réseaux orphelins |
docker volume ls |
Liste tous les volumes, utilisés ou non | Repérer des volumes orphelins après suppression d'un projet |
docker system df |
Récapitulatif de l'espace disque consommé par Docker | Point de départ avant toute opération de nettoyage |
Commandes de nettoyage
Au fil du temps, et selon le nombre d'images Docker téléchargées (pull), Docker peut accumuler une quantité importante de données sur le disque. Ce phénomène touche aussi bien les postes de développement que les serveurs de runners pour la CI ou bien encore le staging ou la production. Conteneurs arrêtés, images intermédiaires (dangling), volumes orphelins, caches de build : tout cela s'accumule silencieusement et peut finir par saturer le disque. Il est donc essentiel de maîtriser les commandes de nettoyage pour garder le contrôle de l'espace utilisé.
docker system df (listée plus haut dans les commandes de visibilité) est le point de départ : elle donne une vue d'ensemble de l'espace occupé avant de décider quoi supprimer.
En complément, df -h est une commande Linux qui affiche l'espace disque total, utilisé et disponible sur chaque partition du système (le -h signifie "human-readable", les tailles sont en Go/Mo plutôt qu'en octets).
Croiser les deux commandes permet de déterminer concrètement le ratio de l'espace disque consommé par Docker par rapport à l'espace total disponible sur le serveur.
Les deux commandes de nettoyage à connaître absolument :
docker system prune -a
Supprime l'ensemble des ressources Docker inutilisées : conteneurs arrêtés, images non utilisées par un conteneur actif (y compris les images téléchargées mais jamais démarrées), réseaux orphelins et caches de build.
Le flag -a (all) est important : sans lui, seules les images dites "dangling" (sans tag, résidus de builds) sont supprimées. Avec -a, toutes les images non rattachées à un conteneur en cours d'exécution sont également supprimées.
Dans certains cas d'usage, il peut être pertinent de programmer cette commande en tâche cron pour automatiser le nettoyage.
Un exemple typique : un VPS utilisé comme runner de jobs GitLab CI/CD. Chaque pipeline télécharge ou reconstruit des images Docker qui s'accumulent rapidement sans jamais être supprimées automatiquement.
Ajouter une cron hebdomadaire (ou quotidienne selon le volume de jobs) permet d'éviter une saturation disque progressive sans intervention manuelle.
Exemple de cron à ajouter via crontab -e sur le serveur runner :
# Nettoyage Docker tous les dimanches à 3h du matin
0 3 * * 0 docker system prune -a -f >> /var/log/docker-prune.log 2>&1
Le flag -f (force) désactive la demande de confirmation interactive, indispensable pour une exécution automatisée.
Le log dans /var/log/docker-prune.log permet de vérifier que la tâche s'exécute correctement et de voir combien d'espace est récupéré à chaque passage.
docker volume prune -a
Supprime tous les volumes Docker non utilisés par un conteneur actif.
Le flag -a supprime aussi les volumes nommés (ceux créés explicitement dans un docker-compose.yml), pas seulement les volumes anonymes.
A utiliser avec précaution : contrairement aux images qui peuvent être re-téléchargées, les données contenues dans les volumes sont définitivement perdues (bases de données, uploads, fichiers persistants). Sur un serveur, toujours vérifier quels volumes sont en jeu avant de lancer cette commande.
Tips pour rédiger un Dockerfile efficace
Tips pour rédiger un Dockerfile efficace
Un Dockerfile mal conçu produit des images lourdes, des builds lents et des couches de cache inutilisables. Voici les points clés à maîtriser pour écrire des Dockerfiles maintenables et performants.
Se baser sur une image officielle existante
Partir d'une image officielle (Docker Hub) plutôt que de repartir de zéro depuis une image ubuntu nue.
Les images officielles sont maintenues, régulièrement mises à jour pour les CVE et optimisées pour leur usage.
Préférer les variantes -alpine ou -slim quand les outils de base suffisent : elles sont nettement plus légères.
# Image complète : ~180 Mo
FROM php:8.3-apache
# Variante slim : ~50 Mo
FROM php:8.3-apache-slim
Ordonner les instructions pour maximiser le cache des layers
Docker met en cache chaque instruction (RUN, COPY, ADD). Si une instruction change, toutes celles qui suivent sont reconstruites.
Placer en premier ce qui change le moins souvent (installation des dépendances système), et en dernier ce qui change le plus souvent (fichier de configuration).
FROM php:8.3-apache
# Rarement modifié : installé en premier, mis en cache longtemps
RUN apt-get update && apt-get install -y libpq-dev \
&& docker-php-ext-install pdo pdo_pgsql
# Config pouvant changer plus souvant
COPY --link docker/.bashrc /home/dev/.bashrc
COPY --link docker/php/conf.d/app.ini $PHP_INI_DIR/conf.d/
COPY --link docker/php/conf.d/xdebug.ini $PHP_INI_DIR/conf.d/
Nettoyer le cache dans le même RUN que l'installation
Chaque instruction RUN crée un layer. Si le cache apt est supprimé dans une instruction séparée, le layer de l'installation le contient encore.
Tout regrouper dans un seul RUN avec && pour que le layer final soit propre.
# Correct : cache nettoyé dans le même layer
RUN apt-get update && apt-get install -y curl libpq-dev \
&& docker-php-ext-install pdo pdo_pgsql \
&& rm -rf /var/lib/apt/lists/*
# Incorrect : le layer d'installation contient quand même le cache
RUN apt-get update && apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*
Pour aller plus loin
Documentation utile
Stack PHP + Apache + MySQL préconfigurée pour les projets Symfony SmartBooster.
Pour aller plus loin
Approfondir votre réflexion
Docker garantit que chaque développeur travaille dans un environnement identique à la production, réduisant les bugs liés aux différences de configuration.
Notre template Docker open source est optimisé pour les projets Symfony : PHP, Apache, MySQL et toutes les dépendances préconfigurées.
Docker simplifie le déploiement et garantit la portabilité de nos applications entre les environnements de développement, staging et production.
Vous avez un projet ?
Contactez-nous pour savoir comment nous pouvons vous aider.