Développement WordPress local avec Docker
Publié: 2019-01-02Bonne année! J'espère que vous avez apprécié les vacances (en supposant que vous n'ayez pas eu à travailler) et que vous êtes maintenant de retour, désireux d'apprendre. Je suis sûr et je suis de retour avec un tutoriel fantastique pour vous : comment utiliser Docker pour le développement WordPress. Je l'ai d'ailleurs annoncé il y a quelques jours via Twitter (en catalan) :
Permettez-moi de commencer par une brève histoire : j'ai commencé mon parcours en tant que développeur WordPress en utilisant LAMP (Linux + Apache + MySQL + PHP). Malheureusement, je me suis vite rendu compte que, lorsque l'on travaillait sur plusieurs projets en même temps, la configuration était un bazar, car ils utilisaient tous le même serveur, la même base de données… Je suis alors passé à Vagrant (VVV notamment), un environnement conçu pour le développement WordPress, mais c'était chiant : mon ordinateur de 6 ans avait beaucoup de mal à faire fonctionner plusieurs instances de Virtual Box et tout était extrêmement lent. J'ai ensuite essayé de passer à Local by Flywheel , car Antonio semblait beaucoup apprécier l'environnement… mais il n'est jamais arrivé à Linux ! N'y avait-il pas une option rapide, fiable et facile à utiliser pour moi ?
En fin de compte, j'ai décidé que je devais en savoir plus sur Docker et voir si cet outil dont j'avais entendu parler répondrait à mes besoins. Si vous souhaitez également en savoir plus sur Docker et que vous souhaitez l'utiliser dans vos développements WordPress, ne manquez pas ce guide - apprenez à créer des environnements de développement rapidement et efficacement.
Docker
Docker est un programme informatique qui effectue une virtualisation au niveau du système d'exploitation, également appelée « conteneurisation ». Cela présente deux avantages principaux par rapport à la configuration LAMP classique :
- les conteneurs sont isolés les uns des autres et la communication entre eux est limitée, ce qui augmente la sécurité
- outils, bibliothèques, fichiers de configuration et tout ce dont le conteneur a besoin pour s'exécuter se trouve dans le conteneur lui-même, ce qui signifie que nous aurons une configuration propre et ordonnée - une fois que nous en aurons terminé avec le conteneur, nous pourrons le supprimer et tout sera parti .
À mon avis, le principal avantage de Docker par rapport aux autres logiciels de virtualisation est l'environnement de virtualisation qu'il utilise par défaut : runC. Cet environnement exécute tous les conteneurs sur le système d'exploitation hôte (au lieu d'exécuter une machine virtuelle complète), ce qui rend les choses beaucoup plus rapides et plus légères. Cela signifie que l'hôte (notre PC) et l'invité (le conteneur) partageront beaucoup de ressources et que tout fonctionnera comme un charme dans un "ancien" ordinateur.
Installation Docker
Pour installer Docker sous Linux (Debian/Ubuntu), exécutez simplement la commande suivante :
Suivez les instructions à l'écran et attendez que apt soit terminé.
Une fois Docker installé, nous pouvons l'utiliser avec la commande docker . Le seul problème avec Docker est le fait que vous devrez l'exécuter avec des privilèges d'administrateur en utilisant sudo . Mais nous pouvons résoudre ce problème. Si vous préférez exécuter docker sans sudo (et donc éviter de taper souvent votre mot de passe), ajoutez votre utilisateur au groupe docker :
où your-user est évidemment votre nom d'utilisateur sous Linux. BTW, vous devrez peut-être vous déconnecter et vous reconnecter pour appliquer réellement cette modification.
Comment installer Docker sur Mac ou Windows
Si vous utilisez Mac ou Windows, vous pouvez également installer Docker. Suivez simplement les instructions sur le site Web de Docker :
- Installation de Windows
- Installation Mac
Comment utiliser Docker
Donc, maintenant que Docker est configuré et prêt à être utilisé, il est temps de tenter le coup. Comme je l'ai dit, Docker est un outil de gestion des applications contenues. Si nous voulons lancer un conteneur, nous devons exécuter la commande suivante :
Par exemple, essayez cette commande :
pour lancer le Hello World classique dans un conteneur Docker. Si tout a fonctionné comme prévu, vous verrez d'abord quelque chose comme ceci dans votre terminal :
Cela nous donne des informations intéressantes. Tout d'abord, Docker a recherché une image nommée hello-world , mais il ne l'a pas trouvée. Deuxièmement, il a recherché cette image dans un référentiel d'images en ligne, et cette fois, il a réussi et a pu la télécharger. Et c'est l'une des grandes choses à propos de Docker : il dispose d'un référentiel d'images avec plusieurs applications emballées que nous pouvons utiliser comme conteneurs Docker (similaire à ce que nous avons dans WordPress, avec les répertoires de plugins et de thèmes).
Maintenant, revenons à notre terminal, nous pouvons voir la sortie réelle du conteneur Hello World :
Et c'est tout! Vous avez déjà exécuté votre premier conteneur Docker ?
Si vous tapez maintenant la commande suivante :
vous verrez le conteneur Docker créé à l'aide de l'image hello-world :
Pour le supprimer, tapez simplement :
en vous assurant de saisir le CONTAINER ID approprié.
Et c'est fondamentalement tout ce qu'il y a à Docker… Alors passons à un autre outil (Docker Compose) et apprenons à l'utiliser en tant que développeurs WordPress ?
Docker Composer
Comme vous pouvez l'imaginer, dans le référentiel d'images de Docker, une image WordPress est disponible. Vous pourriez penser que nous devons simplement extraire cette image et nous serions en mesure de démarrer un nouveau site WordPress, mais ce n'est en fait pas vrai :
- D'une part, cette image n'inclut pas le système de base de données. Donc, si nous voulons démarrer notre site WordPress, nous devrons installer MySQL quelque part (ou utiliser un conteneur MySQL).
- D'autre part, l'image WordPress nécessite certains paramètres de configuration (comme, par exemple, où se trouve la base de données et les informations d'identification pour y accéder). Ainsi, chaque fois que nous exécutons l'instance, nous devons spécifier ces arguments.
L'utilisation de la commande docker seule peut être compliquée, en particulier lorsque nous devons démarrer plusieurs conteneurs à la fois et que certains dépendent d'autres (comme le fait WordPress). Heureusement, il existe un outil appelé docker-compose qui utilise un fichier de configuration pour décrire tous les conteneurs dont nous avons besoin, les dépendances qu'ils ont entre eux et leur configuration spécifique.
Commençons par créer un nouveau répertoire où résidera le fichier de configuration de Docker Compose. Par exemple, créez ~/docker/test et ajoutez un fichier nommé docker-compose.yml avec le contenu suivant :
Je sais que ce fichier peut sembler compliqué, mais ce n'est pas le cas. Regardez attentivement : le fichier définit simplement les deux services (ou conteneurs, si vous voulez) dont nous avons besoin pour faire fonctionner WordPress : mysql et wordpress . Le premier ( mysql ) contient des informations sur l'image dont nous avons besoin (qui est évidemment une image MySQL, version 5.7) et certains paramètres de configuration. Les plus pertinents sont probablement le mappage de port (nous pourrons accéder à la base de données en utilisant le port 8081 dans notre hôte, qui correspond à 3306 dans l'invité) et la configuration de la base de données elle-même (utilisateur, mot de passe, etc.).

Ce dernier est WordPress lui-même ( wordpress ) et suit une approche similaire. Ici, nous disons à Docker Compose que nous voulons que WordPress soit accessible via le port 8080 de notre hébergeur. Nous précisons également que WordPress s'appuie sur l'autre service : mysql . Et on ajoute enfin quelques paramètres de configuration supplémentaires (essentiellement, ceux pour accéder à la base de données).
Une fois que nous avons terminé, enregistrez et quittez le fichier, puis tapez la commande suivante :
et Docker téléchargera les images WordPress et MySQL et démarrera notre WordPress.
Attendez quelques minutes et, une fois que c'est fait, allez sur http://localhost:8080 avec votre navigateur Web (notez que le port que nous utilisons ici correspond à celui que nous avons spécifié dans le fichier de configuration) et vous voir votre nouveau site WordPress :

À partir de ce moment, si nous voulons créer de nouvelles instances WordPress, vous devrez simplement répéter les étapes dont nous avons parlé. Autrement dit, vous allez créer un nouveau répertoire dans ~/docker/ , vous ajouterez le fichier docker-compose.yml et vous le configurerez. Assurez-vous simplement que vous utilisez des ports différents pour cette nouvelle instance, sinon vous ne pourrez pas les exécuter tous les deux en même temps (par exemple, utilisez 8082 pour WordPress et 8083 pour MySQL).
Une fois que vous avez terminé, vous pouvez arrêter le conteneur en exécutant la commande suivante :
Assurez-vous simplement d'utiliser stop au lieu de down :
car down arrêtera non seulement le conteneur, mais le retirera également complètement. Autrement dit, si vous redémarrez un conteneur à l'aide docker-compose up après l'avoir arrêté à l'aide de la commande down , votre WordPress redémarrera à zéro (une base de données vide, un WordPress désinstallé, etc.).
Développement Docker et WordPress
Génial! Vous avez presque tout ce dont vous avez besoin pour développer efficacement des plugins et des thèmes WordPress en utilisant Docker. J'espère que mes explications jusqu'à présent vous ont été utiles et que vous comprenez mieux ce qu'est Docker et comment il fonctionne.
A mon avis, il ne manque que deux choses pour être efficace à 100% avec cette configuration :
- Comment ajouter votre plugin ou thème dans le conteneur Docker.
- Comment utiliser des noms de domaine comme
http://content.localau lieu dehttp://localhost:portavec Docker.
Ajouter votre projet dans un conteneur Docker
Chaque fois que je dois travailler sur un nouveau plugin ou thème, je crée un nouveau conteneur Docker. Si vous suivez le guide jusqu'à présent, vous vous êtes probablement rendu compte que l'installation WordPress créée par Docker est complètement vide et ne contient aucun de nos plugins ou thèmes. Donc, en supposant que je travaille sur un nouveau plugin, comment puis-je ajouter ce plugin dans le dossier wp-content/plugins/ qui se trouve dans le conteneur ?
Il existe plusieurs options pour exposer les répertoires du conteneur et les rendre disponibles sur notre machine hôte. Celui que j'aime le plus mappe le répertoire de notre projet (et uniquement ce répertoire) vers un répertoire dans WordPress. Voyons cela avec un exemple concret.
Supposons que je travaille sur mon plugin avec mon ordinateur portable. Ce plugin est actuellement dans ~/dev/nelio-content/ . Je souhaite évidemment que ce plugin soit inclus dans mon environnement de développement, afin que je puisse le tester et voir que toutes les modifications que j'applique fonctionnent comme prévu. La première chose que je vais faire est d'ajouter un fichier docker-compose.yml dans mon plugin. Le contenu dudit fichier sera une copie exacte de ce que nous avons déjà vu, mais avec une option supplémentaire :
Essentiellement, nous avons simplement ajouté une nouvelle directive nommée volumes et nous spécifions le mappage que nous voulons. Autrement dit, nous voulons que le répertoire actuel (à savoir, le répertoire de notre plugin, identifié par un point . ) soit mappé sur /var/www/html/wp-content/plugins/nelio-content (qui est un répertoire dans le conteneur WordPress). Facile, non ? Après tout, la syntaxe que nous utilisons est la même que celle que nous avons utilisée pour le mappage des ports, mais nous l'appliquons maintenant aux répertoires.
Et c'est tout! Si nous démarrons maintenant notre conteneur, nous verrons que notre plugin est disponible dans l'écran Dashboard » Plugins .
Utilisation des noms de domaine
Personnellement, je n'aime pas accéder aux installations de développement en utilisant localhost et un port. Je pense qu'utiliser des noms de domaine comme http://content.local est beaucoup plus facile. Alors, comment pouvons-nous y parvenir ? Eh bien, nous avons besoin de quelques choses…
Tout d'abord, nous devons dire à notre ordinateur qu'un certain nom de domaine (par exemple, content.local ) est l'ordinateur lui-même. C'est aussi simple que de modifier le fichier /etc/hosts et de mapper ce nouveau nom de domaine à l'IP localhost :
Génial! À l'heure actuelle, http://content.local est exactement équivalent à http://localhost . Mais ce n'est pas exactement ce que nous voulons… Ce que nous voulons, c'est mapper http://content.local à http://localhost:8080 . Pour ce faire, nous avons besoin d'un serveur proxy qui mappe les requêtes de la première adresse à la seconde. Ceci est également très facile à réaliser. Créez simplement un nouveau dossier nommé ~/docker/proxy avec le fichier docker-compose.yml :
Ensuite, exécutez docker network create proxy et démarrez votre nouveau conteneur en utilisant docker-compose up -d . Cela créera un réseau que tous nos projets WordPress utiliseront (plus à ce sujet dans une minute) et installera le proxy qui fera toute la magie.
Enfin, il suffit de modifier notre conteneur WordPress pour qu'il notifie automatiquement le proxy de son existence :
Bon, nous avons fait quelques choses ici. Examinons de plus près tous les changements que nous avons appliqués :
- Dans la section
environmentWordPress, nous avons ajouté deux nouveaux attributs :VIRTUAL_HOSTetVIRTUAL_PORT. Ce sont les attributs que notre proxy utilisera pour mapper leVIRTUAL_HOSTàlocalhost:VIRTUAL_PORT. - Puisque nous voulons que notre service WordPress communique avec notre proxy, nous devons nous assurer que les deux conteneurs sont sur le même réseau. C'est assez simple : nous ajoutons simplement une option de
networksdans WordPress et incluons le réseaufrontend(vous pouvez utiliser le mot-clé que vous voulez). Puis, à la fin du fichier, j'ai ajouté quelques règles supplémentaires. En particulier, j'ai ajouté une sectionnetworkset précisé qu'il existe un réseau externe identifié par le mot-cléfrontendavec le nom proxy . Notez que ce réseau externe est le même que celui que nous avons utilisé dans ledocker-compose.yml. - Enfin, je veux m'assurer que WordPress et MySQL peuvent également se parler, donc je dois m'assurer qu'ils sont également dans un réseau commun. Pour ce faire, je les ai ajoutés tous les deux dans un autre réseau nommé
backend, qui est interne et, par conséquent, personne d'autre ne peut y accéder.
Et c'est tout! Vous savez maintenant tout ce que je sais sur cet outil. J'espère que vous avez apprécié ce guide et, si tel est le cas, partagez-le avec vos collègues et faites-le moi savoir dans la section des commentaires ci-dessous !
Image en vedette par Abigail Lynn .
