Le blog

Présentation du support de Docker dans Symfony

Publié le 10 décembre 2021

Au fil des ans, Docker est de facto devenu un standard pour construire, déployer et exécuter des applications serveur. Docker permet de rassembler toutes les instructions nécessaires pour construire l’environnement qui accueillera votre logiciel, et ce juste à côté du code dans le dépôt du projet.

Nous sommes aujourd'hui heureux d’annoncer qu’après 6 ans de travail en commun, Symfony et API Platform incluent désormais un ensemble d’outils conçus pour créer, gérer et exécuter automatiquement les conteneurs Docker nécessaires à vos applications.

Docker Compose et les Dockerfile Flex Configurators

Comme vous le savez probablement, Symfony embarque un outil bien pratique appelé Flex. Flex est un plugin Composer qui facilite l’ajout de nouvelles fonctionnalités à vos projets. Lorsque vous installez une nouvelle bibliothèque PHP, Flex génère automatiquement le code et la configuration nécessaires pour que cette bibliothèque fonctionne.

Flex a aujourd’hui de nouveaux super pouvoirs ! Il est désormais capable de générer et de mettre à jour le fichier docker-compose.yml afin d’ajouter automatiquement les services requis par les bibliothèques que vous venez d’installer.

Par exemple, pour utiliser l’ORM Doctrine vous avez besoin d’un SGBD. Et bien, devinez quoi ? Lorsque vous installez Doctrine (e.g. composer require orm), Flex vous demandera désormais si vous voulez mettre à jour votre fichier docker-compose.yml. Si vous répondez “oui”, il ajoutera automatiquement un serveur PostgresSQL prêt à être utilisé !

Autre exemple : vous utilisez Symfony UX Turbo et vous souhaitez profiter de ses fonctionnalités “temps-réel”, alors vous avez besoin d’un hub Mercure.rocks. Symfony Flex est là pour vous aider : il peut automatiquement ajouter une ligne dans votre fichier docker-compose.yml !

Lancez la commande docker-compose up et c’est tout !

Il existe également un configurateur Dockerfile —en plus des “Docker Compose Configurators”— capable d’ajouter à un Dockerfile compatible les extensions PHP (e.g. pdo_pgsql) requises par les packages PHP que vous installez. On reparlera de ça bientôt !

À l’heure actuelle, les recettes Flex suivantes utilisent ces nouveaux configurateurs :

Le “Docker Compose Configurator” génère également deux fichiers “override” : docker-compose.override.yml contient la configuration spécifique à l’environnement de développement, et docker-compose.prod.yml la configuration de production. Nous reviendrons là-dessus plus tard.

Symfony CLI et Docker Compose 

La Symfony CLI —que Fabien Potencier a open-sourcée durant la keynote d’ouverture du SymfonyWorld— est capable de détecter automatiquement les services Docker Compose et de configurer automatiquement votre application pour les utiliser. Pour faire ça, Symfony CLI requête l’API Docker Engine pour trouver les ports utilisés par les conteneurs Docker et valoriser les variables d’environnement utilisées par l’application pour s’y connecter. Grâce au docker-compose.override.yml généré, les services ajoutés par Symfony Flex sont compatibles avec cette fonctionnalité.

Et ce n’est pas tout : vous pouvez démarrer plusieurs projets en même temps sans aucun conflit (avec par exemple un serveur PostgreSQL sur chaque projet). Pour accomplir cela, les services Docker Compose dans docker-compose.override.yml sont mappés à des ports du host aléatoires ! Lancez la commande docker-compose ps depuis le répertoire de votre projet pour voir les ports assignés.

Squelette Docker et installateur

La Symfony CLI est le moyen le plus simple pour démarrer avec Symfony. Mais elle requiert une installation local de PHP et de Composer, et elle est conçue pour être utilisée uniquement en développement.

Mais alors comment faire si vous souhaitez être certain que tous les développeurs de votre équipe utilisent bien la même version de PHP ? Comment faciliter l’intégration de nouvelles personnes sans qu’elles soient forcées d’installer PHP ou Composer en local ? Comment faire pour utiliser la même configuration dans votre CI voire même en production ?

La réponse est : Symfony Docker !

Symfony Docker est un squelette contenant tout le nécessaire pour installer et exécuter un projet Symfony. Dès lors que vous disposez d’un Docker Compose fonctionnel, il vous permet de créer de nouveaux projets Symfony sans rien installer en local. Symfony Docker contient deux simples images :

  1. PHP FPM (avec CLI)
  2. Le serveur web Caddy

Il contient des fichiers Dockerfile et docker-compose.yml compatibles avec les configurateurs Symfony Flex. Il est conçu pour être simple, lisible et minimaliste, tout en permettant d’exécuter vos projets localement, dans votre CI et en production !

Comme Symfony CLI, Symfony Docker valorise également les variables d’environnement utilisées par votre projet pour s’assurer qu’il se connecte bien aux services Docker Compose installés par le configurateur Flex.

Comme Symfony Docker utilise le serveur web Caddy, les certificats TLS sont générés et renouvelés automatiquement (pour localhost comme pour votre domaine en production), le support de HTTP/2 et HTTP/3 est natif, et vous pouvez installer les modules Caddy que vous voulez (les modules Mercure et Vulcain, un module OAuth/OpenID Connect, un module de cache HTTP, …) !

Utiliser Symfony Docker est très simple :

git clone https://github.com/dunglas/symfony-docker

docker-compose build --pull --no-cache

docker-compose up

C’est tout, Symfony a été installé, votre projet est démarré et est en cours d’exécution. Installez Doctrine, ou Blackfire, ou n’importe quel package supporté par les configurateurs et les services/extensions PHP seront installés automatiquement !

Symfony Docker contient d’autres fonctionnalités intéressantes, comme la possibilité de choisir la version de Symfony à installer. Il peut également être ajouté sur des projets déjà existants. Lisez sa documentation pour en savoir plus.

Symfony Docker est aussi un template GitHub dont vous pouvez vous servir afin de bootstraper votre projet. Il contient un workflow de GitHub Actions qui exécute automatiquement vos tests en utilisant les conteneurs Docker fournis !

Symfony Docker n’est pas le seul squelette compatible avec les nouveaux configurateurs Flex : la distribution API Platform les supporte également !

Kubernetes

Symfony Docker (tout comme la distribution API Platform) est utilisable en production via Docker Compose, mais seuls les déploiements “single-host” sont supportés. Ce qui peut être pleinement suffisant pour des projets de petite ou moyenne taille, mais au-delà vous aimeriez probablement utiliser le roi des orchestrateurs : Kubernetes.

Les images Docker fournies par Symfony Docker ont été conçues pour être compatibles avec Kubernetes. Mais il y a mieux encore ! Le projet API Platform fournit un chart Helm (le gestionnaire de paquets de Kubernetes) pour déployer votre projet sur n’importe quel cluster Kubernetes en une seule commande ! Ce chart est totalement compatible avec Symfony Docker (pas besoin d’utiliser API Platform). Copiez/collez ce chart en entier dans votre projet, et c'est tout !

Pour plus de détails à propos de cette toute nouvelle intégration Docker, vous pouvez regarder la conférence à ce sujet donnée lors du Symfony World 2021 :

Alors, que pensez-vous de cette nouvelle fonctionnalité ? Vous souhaitez être accompagné·e dans sa mise en place ? Contactez-nous !

Le blog

Pour aller plus loin