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.

28.x Dernière version stable Compatible linux/amd64, linux/arm64 et Windows Server
v2.x Docker Compose v2 (actif) Plugin intégré dans Docker, commande : docker compose (sans tiret)
v1.x Docker Compose v1 (EOL) Ancienne commande docker-compose, plus maintenue depuis juillet 2023

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.

Logo Docker

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 de CI identique au dev

Le pipeline GitLab CI s'exécute dans le même conteneur Docker qu'en développement. Les tests PHPUnit et les analyses PHPStan tournent dans des conditions identiques à celles du poste du développeur → pas de surprises liées à l'environnement.

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

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

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

smartbooster/symfony-docker : notre template Docker open source

Stack PHP + Apache + MySQL préconfigurée pour les projets Symfony SmartBooster.

Pour aller plus loin

Approfondir votre réflexion

Développement de logiciel sur mesure

Docker garantit que chaque développeur travaille dans un environnement identique à la production, réduisant les bugs liés aux différences de configuration.

Symfony

Notre template Docker open source est optimisé pour les projets Symfony : PHP, Apache, MySQL et toutes les dépendances préconfigurées.

Hébergement et maintenance Symfony

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.