Recette: Exécuter une copie locale d’un site WordPress avec Docker

J’ai récemment décidé de publier mes articles en français et en anglais. Au préalable, je devais trouver et tester des plugins afin d’en choisir un. J’ai donc passé du temps, plus que je ne l’aurais cru, à le faire fonctionner localement à travers Docker. Comme j’ai rencontré quelques pièges, j’ai décidé de partager la recette.

1. Créer les artefacts

On se connecte sur le serveur avec ssh, puis on génère le fichier « dump » de la base de données. Ici, sous mysql:

mysqldump -u USER -p PASSWORD > /BLOG_BASE_DIR/blog.sql

Remplacez « USER », « PASSWORD » et « BLOG_BASE_DIR » par les valeurs appropriées.

2. Télécharger les artefacts

Localement, créez un répertoire blog. C’est à partir de celui-ci que les étapes suivantes seront exécutées.

rsync [USER@]HOST::/BLOG_BASE_DIR PATH_TO_BLOG_DIR/site

Puis déplacez blog.sql.

> mkdir db
> mv site/blog.sql db/.

3. Ajouter des directives à blog.sql

Le fichier blog.sql contient les valeurs de production de WordPress. Il faut en modifier deux afin qu’il fonctionne dans un autre environnement.

Donc, à la fin de blog.sql, ajoutez

UPDATE options SET option_value='http://127.0.0.1' WHERE option_name IN ('siteurl', 'home');
UPDATE options SET option_value='LOCAL TRIAL' WHERE option_name='blogname';

⚠️ Il est important de ne PAS ajouter de slash à la fin de l’adresse, sinon vous aurez des redirections à l’infini quand vous tenterez d’accéder à votre site.

4. Mettre à jour wp-config.php

Ouvrez site/wp-config.php, et changez les valeurs DB_USER et DB_PASSWORD pour root. Puis DB_HOST pour localhost.

define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');

5. Créer le fichier setup.sh

docker exec blog_db_1 bash -c 'mysql -u root --password=root < /db/blog.sql'

docker exec blog_server_1 bash -c 'a2enmod rewrite'
docker exec blog_server_1 bash -c 'docker-php-ext-install pdo_mysql'
docker exec blog_server_1 bash -c 'docker-php-ext-install mysqli'
docker exec blog_server_1 bash -c 'service apache2 restart'

Pour le détail: La première ligne charge les données dans la base de données.

La ligne suivante installe modrewrite dans apache, suivi de deux modules php: pdo_mysql et mysqli.

Finalement, le service apache2 est redémarré.

6. Créer le fichier docker-compose.yml

Ici on utilise docker-compose pour orchestrer deux conteneurs docker. Ça s’installe simplement avec

pip install docker-compose

Voici le fichier docker-compose.yml

services:
  db:
    image: mariadb:10.4.24
    hostname: blog-db
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - ./db:/db:ro
    environment:
      - MARIADB_ROOT_PASSWORD=root
  server:
    image: php:7.4-apache
    hostname: blog-server
    ports:
      - "127.0.0.1:80:80"
    volumes:
      - ./site:/var/www/html/
    depends_on:
      - db

Évidemment, utilisez les versions de base de données, php et apache qui vous conviennent. Naturellement, la présente recette peut ne plus être exacte en fonction de ces versions.

7. Démarrer les conteneurs

docker-compose up

8. Exécuter setup.sh

Dans un nouveau terminal, exécutez

bash setup.sh

9. Redémarrer le conteneur apache

Dans le terminal où vous avez exécuté docker-compose up, interrompez le (CTRL+C) et redémarrez le (docker-compose up).

Explication: La dernière commande de setup.sh a pour effet d’éteindre le conteneur apache. (La cause étant que les conteneurs s’éteignent lorsque le processus qui tourne sous le PID 1 s’éteint. Comme apache tourne sous le PID 1 et que la commande service apache2 restart l’éteint, le conteneur s’éteint.)

10. Accéder à votre copie locale

Démarrez votre navigateur de choix et pointez le sur http://127.0.0.1

🎉

Nettoyage

  1. Éteignez les conteneurs: CTRL+C dans le terminal où docker-compose up a été exécuté, puis exécutez docker-compose down.
  2. Supprimez le répertoire site

Billets reliés

Leave a Reply

Ce site utilise Akismet pour réduire le pourriel. En savoir plus sur comment les données de vos commentaires sont utilisées.