Les meilleures commandes de Docker â Partie 3 : un WordPress en une seule commande
Vous lâattendiez encore plus que le prĂ©cĂ©dent, il est lĂ tout chaud. Voici le troisiĂšme article technique sur cette machine de guerre quâest Docker. Si vous nâavez pas lu le premier ni le second, je vous conseille de les lire avant. Autrement il vous manquera les bases pour suivre ce nouveau TP.
Voici la liste des articles précédents :
Les meilleures commandes de Docker â Partie 1
Les meilleures commandes de Docker â Partie 2
Lâobjectif est toujours le mĂȘme que prĂ©cĂ©demment : crĂ©er le plus rapidement possible un site stable de type WordPress. Lâautre idĂ©e plus gĂ©nĂ©rale de ce TP est de vous apprendre Ă structurer, et Ă dĂ©crire correctement Ă Docker lâarchitecture dont vous avez besoin. Ainsi, celui-ci pourra crĂ©er automatiquement votre environnement, en une seule ligne de commande.
Pourquoi structurer son environnement ?
Imaginons que vous travaillez sur une application Web qui utilise le Framework Symfony avec une base de donnĂ©es PostgreSQL. Vous serez dâaccord avec moi :  tout installer Ă la main, câest long et chronophage. Mais vous me direz : « il suffit de lâinstaller une seule fois, aprĂšs on nâest plus embĂȘtĂ©s ».
Je suis dâaccord, mais imaginez quâun nouveau dĂ©veloppeur arrive dans votre Ă©quipe. Il faudra tout rĂ©installer de nouveau, alors quâavec cette technique vous nâaurez quâĂ lui donner le fichier de configuration ainsi que la commande qui va bien. Ainsi, le nouveau sera opĂ©rationnel en trĂšs peu de temps.Â
Poursuivons cette rĂ©flexion : lorsque lâapplication est prĂȘte Ă ĂȘtre mise en production, vous nâavez quâĂ dĂ©ployer le fichier de configuration, et relancer la commande.
Autre Ă©lĂ©ment important : imaginez que Symfony passe Ă une nouvelle version trĂšs importante, qui corrige une multitude de failles critiques. Vous allez devoir changer de version. Or cela risque dâĂȘtre lâenfer si vous le faites Ă la main. De plus, il faudrait isoler votre configuration de dĂ©veloppement de celle des tests. Alors que vous pourriez modifier un fichier configuration et spĂ©cifier Ă Docker dâutiliser la nouvelle version de Symfony. Puis vous lancez la mĂȘme ligne de commande, et vous pouvez tester comment votre code rĂ©agit en isolant lâenvironnement de dĂ©veloppement et de tests. Ensuite, si vous devez continuer vos dĂ©veloppements, vous pourrez facilement le faire en switchant de conteneurs.
Vous y gagnerez en efficacitĂ© et en stabilitĂ© sur vos postes et serveurs. Car mĂȘme pour faire les migrations de version sur les serveurs de production, ce sera plus simple. Par exemple, si la nouvelle version de Symfony rĂ©agit mal, vous pouvez faire marche arriĂšre et revenir Ă Â lâancienne version sans problĂšme.
Maintenant que je vous ai fait un teaser de folie, laissez-moi vous montrer comment faire de la magie avec Docker.
Nous allons utiliser la commande docker-compose qui permet de gĂ©nĂ©rer une suite dâimages et de conteneurs pour faire tourner un environnent prĂ©cis.
Mais avant de lâutiliser, il faut dĂ©crire ce dont on a besoin. Je vous rappelle que lâobjectif est dobtenir un WordPress fonctionnel.
Ecriture du fichier de configuration (docker-compose)
Pour cela, nous avons besoin de créer un fichier qui se nomme :
Vous avez dĂ» vous rendre compte que lâextension est particuliĂšre. Câest du YAML : pour ceux qui ne connaissent pas ce format, il signifie YAML Ainât Markup Language soit en français YAML nâest pas un langage de balisage. Câest un peu un mix entre le format CSV, JSON et XML.
Voici la structure de base que propose Docker :
version: '2' services: redis: image: "redis:alpine"
Lisons ligne par ligne les informations. Tout dâabord, on a le champ « version » : il indique le numĂ©ro de version du docker compose que vous souhaitez utiliser. En effet, en fonction de la version, on dĂ©crit diffĂ©remment notre architecture.
Ensuite, on retrouve des services qui permettent de dĂ©tailler la liste de vos systĂšmes. Un service peut ĂȘtre une image. Par exemple, les deux derniĂšres lignes indiquent que lâon a besoin dâun service redis dont lâimage est redis:alpine.
Je pense que vous avez compris le principe de description des services.
Revenons Ă notre problĂ©matique de base. Pour avoir un WordPress qui fonctionne bien, on a besoin dâune base de donnĂ©es MySQL et dâun WordPress. Donc je vous propose de lâĂ©crire en mode YAML. Ensuite, on affinera notre fichier de configuration.
version: '2' services: base_de_donnees: image: mysql:latest wordpress: image: wordpress:latest
Ici, jâindique donc Ă Â Docker que jâai besoin de la derniĂšre version de MySql et de WordPress. Mais ce nâest pas suffisant, si vous lancez ce fichier cela ne fonctionnera pas. Car il faut indiquer à Docker que WordPress est liĂ© au moteur MySQL. Pour cela, on utilise le mot-clĂ© depends_on. Ce qui nous donne un nouveau fichier de configuration :
version: '2' services: base_de_donnees: image: mysql:latest wordpress: image: wordpress:latest depends_on: - base_de_donnees
Mais ce nâest pas tout. Si vous vous souvenez bien de lâarticle prĂ©cĂ©dent, vous savez que pour WordPress et pour MySQL il y a des variables (des informations) Ă fournir pour que tout fonctionne bien. Pour rappel, la commande Ă Â utiliser pour obtenir un conteneur MySQL digne de ce nom est la suivante :
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=wordpress -e MYSQL_USER=root -d mysql:8
On voit que lâon passe un mot de passe administrateur (root), un nom de base de donnĂ©e et le nom dâun user. On va faire sensiblement la mĂȘme chose, Ă un paramĂštre prĂšs. Nous allons gĂ©nĂ©rer un utilisateur spĂ©cial pour WordPress afin dâĂ©viter les risques dâintrusion ou dâinjection dans la base de donnĂ©es par des hackers.
Pour faire passer ces différentes variables, on utilise le mot-clé environment. Ce qui donne le résultat suivant :
version: '2' services: base_de_donnees: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: admin-mot-de-passe MYSQL_DATABASE: nom-base-de-donnee-wordpress MYSQL_USER: utilisateur-wordpress MYSQL_PASSWORD: mot-de-passe-wordpress wordpress: image: wordpress:latest depends_on: - base_de_donnees
Câest plutĂŽt simple, non ? Donc vous avez bien compris que les valeurs « admin-mot-de-passe », »nom-base-de-donnee-wordpress », « utilisateur-wordpress » et « mot-de-passe-wordpress » sont modifiables. Mieux vaut choisir des mots de passe plutĂŽt compliquĂ©s pour Ă©viter de vous faire pirater votre base de donnĂ©es.
Passons maintenant Ă la configuration de WordPress. Pour que tout fonctionne bien, il faut spĂ©cifier Ă WordPress : le nom de la base de donnĂ©es, le mot de passe & le nom de lâutilisateur pour accĂ©der Ă la base de donnĂ©es, ainsi que le nom de la base de donnĂ©es. Voici le rĂ©sultat final :
version: '2' services: base_de_donnees: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: admin-mot-de-passe MYSQL_DATABASE: nom-base-de-donnee-wordpress MYSQL_USER: utilisateur-wordpress MYSQL_PASSWORD: mot-de-passe-wordpress wordpress: image: wordpress:latest depends_on: - base_de_donnees environment: WORDPRESS_DB_HOST: base_de_donnees:3306 WORDPRESS_DB_PASSWORD: mot-de-passe-wordpress WORDPRESS_DB_USER: utilisateur-wordpress WORDPRESS_DB_NAME: nom-base-de-donnee-wordpress
Jâattire votre attention sur la variable WORDPRESS_DB_HOST qui contient le nom du service liĂ©. En gros, je dis a Docker de lier par son nom la base de donnĂ©es Ă WordPress. Il ne manque plus que la cerise sur le gĂąteau : mettre un nom sur nos deux conteneurs Ă lâaide de la propriĂ©tĂ© container_name. Puis rajouter un Ă©lĂ©ment important : restart, que lâon va appliquer à always. Ce qui permet de redĂ©marrer le conteneur sâil plante. A ce stade, je pourrais vous dire que le fichier ci-dessous est suffisant pour lancer un WordPress.
version: '2' services: base_de_donnees: container_name: mysql_server image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: admin-mot-de-passe MYSQL_DATABASE: nom-base-de-donnee-wordpress MYSQL_USER: utilisateur-wordpress MYSQL_PASSWORD: mot-de-passe-wordpress wordpress: container_name: my_wonderful_website image: wordpress:latest depends_on: - base_de_donnees restart: always environment: WORDPRESS_DB_HOST: base_de_donnees::3306 WORDPRESS_DB_PASSWORD: mot-de-passe-wordpress WORDPRESS_DB_USER: utilisateur-wordpress WORDPRESS_DB_NAME: nom-base-de-donnee-wordpress
Mais je préfÚre vous donner toutes les clés et vous laisser faire vos choix. Sur nos deux conteneurs, on peut rajouter un port cible. Par exemple si on veut que notre WordPress tourne sur le port 8010. On utilise la propriété ports, voici un exemple :
version: '2' services: base_de_donnees: container_name: mysql_server image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: admin-mot-de-passe MYSQL_DATABASE: nom-base-de-donnee-wordpress MYSQL_USER: utilisateur-wordpress MYSQL_PASSWORD: mot-de-passe-wordpress wordpress: container_name: my_wonderful_website image: wordpress:latest depends_on: - base_de_donnees ports: - "8010:80" restart: always environment: WORDPRESS_DB_HOST: base_de_donnees::3306 WORDPRESS_DB_PASSWORD: mot-de-passe-wordpress WORDPRESS_DB_USER: utilisateur-wordpress WORDPRESS_DB_NAME: nom-base-de-donnee-wordpress
Enfin, sachez que la propriĂ©tĂ© volumes vous permet dâĂ©changer des fichiers entre votre conteneur Docker et votre systĂšme Windows. Si vous vous demandez Ă quoi cela peut servir, imaginez que vous devez mettre en production un site WordPress rĂ©alisĂ© grĂące Ă Docker. Comment rĂ©cupĂ©rez-vous les fichiers PHP prĂ©sents dans votre Docker ? RĂ©ponse : en utilisant la propriĂ©tĂ© volumes qui vous permettra de crĂ©er un pseudo dossier partagĂ©. Voici comment faire :
version: '2' services: base_de_donnees: container_name: mysql_server volumes: - C:/docker/wordpress/mysql:/var/lib/mysql:rw image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: admin-mot-de-passe MYSQL_DATABASE: nom-base-de-donnee-wordpress MYSQL_USER: utilisateur-wordpress MYSQL_PASSWORD: mot-de-passe-wordpress wordpress: container_name: my_wonderful_website image: wordpress:latest depends_on: - base_de_donnees ports: - "8010:80" restart: always volumes: - C:/docker/wordpress/html:/var/www/html environment: WORDPRESS_DB_HOST: base_de_donnees::3306 WORDPRESS_DB_PASSWORD: mot-de-passe-wordpress WORDPRESS_DB_USER: utilisateur-wordpress WORDPRESS_DB_NAME: nom-base-de-donnee-wordpress
En gros, je dis Ă Docker de me donner un accĂšs en lecture/Ă©criture (rw) sur les fichiers prĂ©sents dans le rĂ©pertoire /var/lib/mysql du conteneur MySQL, dans mon rĂ©pertoire C:/docker/wordpress/mysql. Câest la mĂȘme technique pour WordPress. En mĂȘme temps, cela me protĂšge dâune suppression malencontreuse de mon conteneur, car en cas de suppression je conserve les fichiers stockĂ©s sur mon poste.
Voici donc votre fichier final ci-dessus. Il ne vous reste quâĂ Â modifier les variables, ainsi que les chemins dâaccĂšs. Si vous nâavez pas envie de copier-coller les lignes, vous pouvez tĂ©lĂ©charger mon docker-compose.yml :
DerniÚre étape : voici la commande simple à saisir pour créer les conteneurs :
Docker nous indique quâil a créé un conteneur mysql_wordpress et un wordpress_enov. Pour vĂ©rifier que les conteneurs sont bien prĂ©sents, vous pouvez ouvrir Kitematic.
Sur cette impression dâĂ©cran, on voit que les conteneurs my_wonderful_website et mysql_server sont actifs. Docker a repris le nom que jâavais indiqué dans mon fichier de configuration, grĂące Ă la propriĂ©tĂ© container_name. On voit que les conteneurs sont actifs car les icĂŽnes sont vertes avec une forme de vague.
Un autre moyen de voir si tout va bien est dâaller faire un tour dans les dossiers partagĂ©s. Par exemple, si vous vous rendez dans le dossier WordPress que vous avez spĂ©cifiĂ© dans volumes, vous obtenez le rĂ©sultat suivant :
A lâintĂ©rieur de ces dossiers, vous avez dâun cĂŽtĂ© les fichiers PHP de votre site WordPress, et de lâautre les fichiers de base de donnĂ©es :
La derniÚre étape de vérification consiste tout simplement à vous rendre sur votre site fraßchement créé.
Un conseil : faites trĂšs attention aux informations que vous renseignez dans la partie configuration. En effet, il faut que les informations de connexion Ă la base de donnĂ©es soient les mĂȘmes que celles choisies dans votre docker-compose.yml.
JâespĂšre que cet article vous a plu. Câest encore un cran plus haut, donc câest normal si vous avez des questions. Alors nâhĂ©sitez pas et essayez de faire le TP par vous-mĂȘme, voire mĂȘme de rajouter dâautres conteneurs pour pimenter le tout. Puis partagez-les dans les commentaires pour donner des idĂ©es Ă la communautĂ©. Je vous dis Ă trĂšs bientĂŽt pour de nouvelles documentations techniques.
from Les meilleures commandes de Docker â Partie 3 : un WordPress en une seule commande