Aller au contenu principal
Retour au blogue

Développement logiciel

Démarrage avec Directus 7 et Docker (Nginx, PHP & MySQL)

Adrien Thiery
22 oct. 2019 ∙ 7 mins
Logo Docker, PHP, MySQL, Directus 7, Docker

Modifier 28 mars 2020 : Avec la sortie de Directus 8, il y a eu beaucoup de progrès au niveau de l'expérience Dev. Vous pouvez maintenant utiliser l'image Docker officielle avec docker-compose pour démarrer en quelques secondes 💪.


J'ai récemment voulu essayer le très prometteur Directus 7, un CMS Headless (Content Management System, headless signifiant qu'il crée une API pour travailler avec des applications à page unique) sur PHP, sans doute mieux expliqué sur la dans la documentation.

Pour commencer, j'ai jeté un coup d'œil à la documentation, soit dit en pensant très bien écrite, qui indique que la meilleure façon est d'effectuer un git clone et de configurer un serveur Web Apache et une base de données MySQL en local pour l'essayer. 🤔

Ne pas vouloir l'installer localement (parce que... eh bien, qui fait encore cela? Les environnements locaux sont les choses les moins reproductibles, tout le monde n'a pas le même OS, la même version d'OS, les mêmes paquets installés, etc.), je me suis tourné vers mon meilleur ami en matière de développement : Docker ! 🐳 et j'ai finalement décidé d'écrire cet article pour venir en aide à mes amies développeuses et développeurs dans cette démarche.

Notre objectif :

  • Effectuer la configuration d'un conteneur docker PHP capable d'exécuter la dernière version de Directus
  • Configurer un conteneur docker hébergeant une base de données MySQL à utiliser avec Directus.
  • Les faire fonctionner ensemble et nous laisser l'essayer

Conditions requises pour atteindre cet objectif :

TL; PR : Pour trouver le résultat de cet article. Obtenez-le et exécutez les instructions de Start stuff pour essayer Directus 7 dans Docker 🙂 ...

Configurer un conteneur docker PHP capable de faire tourner la dernière version de Directus.

Je dois dire que mon stack préféré n'inclut pas Apache, je préfère de loin Nginx avec FPM, c'est donc ce que cet exemple va présenter.

Tout d'abord, créons un dossier pour notre expérience : mkdir directus-test/

A l'intérieur de ce dossier (cd directus-test/), créons un Dockerfile et commençons par une image qui nous sera bien utile :

FROM wyveo/nginx-php-fpm:latest

Ensuite, installons une configuration NGINX très simple nous permettant de servir le code Directus :

COPY default_nginx_conf /etc/nginx/conf.d/default.conf

La configuration de default_nginx_conf est la suivante :

server {
  listen 80;  root /app/public/;
  index index.php index.html index.htm;
  server_name _;
  location / {
    try_files $uri $uri/ /index.php;
  }

  # pass the PHP scripts to FastCGI server
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

Ainsi, une configuration NGINX très simple cherche unindex.php dans le dossier /app/public de notre conteneur, et transmet les requêtes vers un fichier *.php à PHP-FPM via un socket (/run/php/php7.3-fpm.sock) qui est déjà installé dans le conteneur.

Il nous manque juste le code Directus!

Comme il est conseillé dans la documentation, allons le chercher sur Github :

Git clone https://github.com/directus/directus.git

Construisons notre conteneur!

docker build -t directus_img .

Configurer un conteneur docker hébergeant une base de données MySQL à utiliser avec Directus

Vous savez quoi? Je me sens paresseux et je préférerais passer mon temps à essayer cette foutue chose, alors récupérons simplement une image depuis le hub de Docker!

Par exemple, l'image MySQL par défaut n'est pas mal du tout !

Les faire fonctionner ensemble pour qu’on puisse l'essayer!

Lançons les deux conteneurs et assurons-nous qu'ils peuvent interagir entre eux grâce à un réseau Docker:

docker network create directus_test_network

Ensuite, exécutons (run) notre conteneur PHP et donnons-lui accès au code directus :

docker run -dit --name directus_php --network directus_test_network -p 8000:80 -v "$(pwd)/directus/":/app/ --rm directus_img

Au cas où vous ne seriez pas familier avec docker, les options nous permettent de :

  • directus_img est l'image que nous avons construite juste avant, incluant tout ce dont nous avons besoin.
  • -d détache le processus de la ligne de commande, c'est-à-dire que votre bash n'est pas «coincé» dans le processus.
  • -i maintient le shell interactif même s'il est détaché, ce qui signifie que vous pouvez toujours interagir avec le conteneur.
  • -t alloue un pseudo-TTY
  • --name nomme le conteneur afin que nous puissions le trouver facilement avec docker ps plus tard, ou pour interagir avec lui
  • --network spécifie que le conteneur doit être disponible dans le réseau créé juste avant.
  • -pnous permet de lier les ports du conteneur (80 : le port web par défaut) à un port de l'hôte (votre machine), ici le 8000, ce qui vous permet d'aller sur localhost:8000 et de voir ce que le conteneur sert sur son port 80
  • -v montage d'un volume (ici :$(pwd)/directus/ , $(pwd) étant le dossier courant) comme un dossier dans le conteneur ( /app/ )
  • --rm supprime automatiquement le conteneur lorsqu'il sort.

Le fait que directus_img soit à la toute fin de la commande n'est PAS dû au fait qu'il est lié à --rm, mais simplement parce qu'il est nécessaire de passer toutes les options à docker run avant de spécifier l'image à exécuter.

Ensuite, exécutons notre conteneur MySQL :

docker run -d --name directus_mysql --network directus_test_network -p 3306:3306 -e MYSQL_DATABASE=directus -e MYSQL_ROOT_PASSWORD=root -v data:"$(pwd)/data" --rm mysql:5.7

La seule nouveauté ici est l'option -e, qui vous permet de passer une variable d'environnement au conteneur.

Vous pouvez voir ici que nous avons également lié le port 3306sur l'hôte... Pourquoi? Cela vous permet de vous connecter à votre outil SQL Manager préféré à la BD sur localhost:3306 et de parcourir vos données si nécessaire.

Nous pouvons voir que nos conteneurs fonctionnent grâce à docker ps, ce qui devrait vous donner quelque chose comme ceci :

Le résultat de docker ps

Vous pouvez maintenant configurer directus

Directus prêt à être installlé
Prêt à être installlé!

La première étape consiste à choisir votre nom d'utilisateur et votre mot de passe :

Remplir les paramètres pour la connexion admin:
Remplir les paramètres pour la connexion admin:

Ensuite, il faut spécifier les informations d'identification et les paramètres de la base de données

Remplir les paramètres de la base de données
Remplir les paramètres de la base de données

Les seuls paramètres à modifier ici sont

  • L’hôte, qui sera directus_mysql
  • L’utilisateur et le mot de passe :root et root

C'est là que nous voyons l'influence d'avoir les deux conteneurs dans le même réseau. En effet, les avoir dans le même réseau les rend « conscients » les uns des autres, donnant l’accès au conteneur MySQL au conteneur PHP sur le « nom d'hôte » directus_php et donnant au conteneur PHP accès à celui de MySQL sur directus_mysql.

Le réseau docker avec le pilote par défaut inclut en fait un résolveur DNS de sorte que le nslookup effectué pour résoudre l'IP à partir des noms d'hôtes (par exemple, directus_mysql) trouve l'autre conteneur dans le même sous-ensemble basé sur le même nom de conteneur.

Soumettez le formulaire de connexion avec les informations d'identification et BOOM! Vous êtes en ligne!

Directus account
Boom, vous y êtes!

Vous pouvez maintenant accéder aux paramètres d'administration en bas à gauche de l'écran et commencer à créer vos collections, etc. 🚀

Paramètres d'administration
Paramètres d'administration en bas à gauche de l'écran

Je dois dire qu'après cela, Directus procure un sentiment formidable, tout est relativement fluide avec seulement quelques accrocs, comme certains boutons qui ne fonctionnent pas, mais vous l'avez compris, c'est constamment en évolution :).

Pour accéder à tout ce code et plus jetez un coup d'oeil : directusdockergetting_started

Si vous avez des questions ou commentaires quelconques n'hésitez pas à nous joindre!