Guide pratique pour dockeriser WordPress avec un Dockerfile personnalisé

Docker Desktop

L’adoption de Docker ne se limite pas aux développeurs expérimentés. Sa prise en main aisée et son interface intuitive en font un outil accessible aux débutants comme aux confirmés.

Dans ce tutoriel guide je vous montre comment utiliser Docker pour vos projets WordPress dans un environnement local. Ce processus d’installation et de configuration est valable aussi bien sur Windows, Mac que Linux.

Sommaire

Pourquoi utiliser Docker pour le développeur WordPress?

Utiliser Docker pour développer avec WordPress alors que des applications telles que Herd, WordPress Playground ou LocalWP disposent de tous les outils pratiques, présente différents avantages :

  • Proposer des environnements de développement propres et reproductibles.
  • Isolation : chaque instance WordPress est isolée dans son propre conteneur, ce qui garantit un environnement propre et sans interférences avec d’autres applications. Les applications s’exécutent sans s’interférer.
  • Facilité de configuration et de déploiement: : Docker automatise la configuration et le déploiement de WordPress, ce qui permet de gagner du temps et d’éviter les erreurs.
  • Portabilité : Les conteneurs Docker peuvent être facilement partagés et transférés entre différents environnements, ce qui facilite la collaboration et le test.
  • Cette approche offre aussi une solution plus légère et plus efficace, optimisant ainsi l’utilisation des ressources système.

Dans un travail en équipe, chaque développeur peut utiliser la même configuration exacte, ce qui élimine les « ça marche sur ma machine » et les différences de configuration entre les environnements. Les applications sont créées et exécutées dans des environnements isolés et portables, le tout à partir d’un seul noyau Linux. Des environnements de travail uniformes et reproductibles, facilitent ainsi la collaboration et le partage de code.

Ce qu’il vous faut pour commencer

  • Un éditeur de texte : Utilisez un éditeur de texte comme Visual Studio Code, Sublime Text ou tout autre éditeur de votre choix pour écrire les fichiers de configuration.
  • L’accès à la ligne de commande par votre terminal et se familiariser avec les commandes Docker. Si vous utilisez Windows, vous aurez besoin d’installer une couche de compatibilité Linux comme Bash on Windows (installer Git et Git Bash et/ou Cmder) ou WSL 2 pour exécuter les commandes Bash. Une commande Bash est une instruction que vous donnez à votre ordinateur pour effectuer une action spécifique.
  • Docker et Docker Compose (que vous pouvez installer directement avec Docker Desktop)
  • Un fichier docker-compose.yml : Créez un fichier docker-compose.yml pour définir les services Docker nécessaires (WordPress et MySQL par exemple).

Des approches différentes pour installer WordPress avec Docker

Pour installer WordPress avec Docker, vous avez plusieurs options, notamment en utilisant des images préconstruites disponibles depuis Docker Hub ou en créant vos propres configurations avec des Dockerfiles.

Première approche : création d’un Dockerfile personnalisé

  • Avantage: Plus de contrôle et de flexibilité pour personnaliser votre installation.
  • Inconvénient: Nécessite des connaissances en Docker et en création de fichiers Docker.

Deuxième approche : utiliser une image Docker pré-construite

  • Avantage: Rapide, facile et idéale pour les débutants.
  • Inconvénients: Moins de flexibilité pour la personnalisation et la configuration.

Installer Docker et Docker Compose avec Docker Desktop

Docker est disponible en 3 distributions différentes :

  • Docker CE Community Edition (Linux)
  • Docker Desktop (Mac ou Windows)
  • Docker Enterprise (Linux)

Composition de docker Desktop

Docker Desktop regroupe différents outils :

  • Docker est la technologie de base, le moteur qui permet de créer et d’exécuter des conteneurs. Si vous souhaitez simplement exécuter un seul conteneur, Docker est suffisant.
  • Docker Compose est un outil qui facilite la gestion des applications multi-conteneurs.  Il utilise des fichiers YAML pour décrire la composition de l’application, c’est-à-dire les différents conteneurs qui la composent et leurs dépendances. Si vous souhaitez exécuter une application multi-conteneurs, Docker Compose est un bon choix.
  • Docker Desktop est une application qui facilite l’utilisation de Docker sur les ordinateurs personnels Mac ou Windows. Elle fournit une interface graphique intuitive pour gérer les images, les conteneurs et les réseaux Docker. Si vous souhaitez utiliser Docker sur un ordinateur personnel et que vous recherchez une interface graphique intuitive, Docker Desktop est une bonne option.
FonctionnalitéDockerDocker ComposeDocker Desktop
Création d’imageOuiNonOui
Lancement démarrage de conteneursOuiOuiOui
Gestion des applications multi-conteneursNonOuiOui
Interface utilisateurCLICLI ou GUIGUI
Facilité d’utilisationDébutantIntermédiaireAvancé
Les différents outils Docker

Étape 1 – Installer Docker avec Docker Desktop

Installer Docker sur Windows

La première étape consiste à installer Docker et Docker Compose sur votre système. Vous pouvez suivre les instructions spécifiques à votre système d’exploitation sur le site officiel de Docker (https://docs.docker.com/get-docker/)

Docker Desktop inclut Docker Engine (le moteur Docker) ainsi que d’autres outils tels que Docker CLI et Docker Compose !

docker debut

Lancer l’installeur

docker desktop installation
docker dektop

Complétez l’installation.

docker installation etape 2

Continuez avec ou sans connexion à votre compte Docker Inc.

docker signup

Vous arrivez sur l’interface de Docker Desktop.

dockerdesktop interface

Le Docker Desktop doit resté lancé lors des prochaines manipulations!

Installer Docker avec Docker Desktop sur Mac

Étape 2 – Vérifier son installation

Vérifiez la présence de Docker sur votre machine avec la commande suivante

docker -v

Pour tester si Docker fonctionne correctement lancez cette commande

docker run hello-word

Cette command extrait une image « Hello word » depuis le Docker Hub et crée une nouvelle pile dans votre logiciel.

Dans votre terminal ce message doit être affiché

Hello from Docker
This message shows that your installation appears to be working correctly.

Étape 3 – Installer WordPress manuellement

Où placer ses sites dockérisés sur sa machine en local ?

Créez un répertoire dédié sur votre système de fichiers pour stocker tous vos projets Dockerisés. Vous pouvez nommer ce répertoire comme bon vous semble, par exemple docker_projects ou docker_sites.

À l’intérieur du répertoire principal que vous avez créé, vous pouvez créer des sous-répertoires individuels pour chaque site que vous développez. Ces sous-répertoires peuvent être nommés d’après les noms de vos projets ou de vos clients, par exemple site1site2, etc.

Structurer les dossier de ses projets

/docker_projects

  • site1/
  • docker-compose.yml
  • wp-content/
  • site2/
  • docker-compose.yml
  • wp-content/

Créer un fichier de configuration docker-compose.yml

Créez un fichier docker-compose.yml dans votre répertoire de projet et ajoutez-y le contenu suivant :

Version avec Mysql 8.0

version: '3.8'

services:

  db:
    image: mariadb:latest
    restart: always
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - "8181:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

volumes:
  db_data: {}

Explication du fichier de configuration

Ce fichier est composé de plusieurs sections.

  • version : la première ligne spécifie la version de la syntaxe Docker Compose utilisée dans ce fichier. Dans cet exemple, nous utilisons la version 3.8.
  • services : cette section définit les différents services utilisés dans l’application.
  • volume : permet de persister les données entre les arrêts et les redémarrages des conteneurs

Explication ses services

Chaque service est défini par un bloc de configuration.

Un service nommé db, qui contiendra la base de données MySQL.

  • L’attribut image spécifie l’image Docker à utiliser pour ce service, dans ce cas-ci mysql:8.0, ce qui indique l’utilisation de MySQL version 8.0.
  • L’attribut commande est utilisé pour définir le plugin d’authentification par défaut de MySQL. Dans ce cas, nous utilisons mysql_native_password comme plugin d’authentification par défaut.
  • L’attribut restart dans le service wordpress indique à Docker de redémarrer automatiquement le conteneur MySQL en cas d’échec ou de redémarrage du système hôte.
  • L’attribut environnement définit les variables d’environnement utilisées par le conteneur MySQL
  • L’attribut volumes

Un service nommé wordpress,

  • L’attribut depends_on
  • L’attribut image : cet attribut spécifie l’image Docker utilisée pour créer le conteneur WordPress. L’image wordpress:latest est utilisée, ce qui signifie la dernière version de l’image WordPress disponible sur Docker Hub.
  • L’attribut ports : expose le port 3306 du conteneur sur le port 3306 de la machine hôte. Cela permet d’accéder à la base de données MySQL depuis l’extérieur du conteneur. Le port 8080 de l’hôte est mappé sur le port 80 du conteneur WordPress. Cela signifie que le site WordPress sera accessible depuis le navigateur à l’adresse http://localhost:8080.
  • L’attribut restart : est utilisé pour spécifier le comportement de redémarrage automatique du conteneur en cas d’arrêt inattendu.
  • L’attribut environnement : cet attribut définit les variables d’environnement à passer au conteneur WordPress : plusieurs variables d’environnement sont définies, telles que WORDPRESS_DB_HOSTWORDPRESS_DB_USERWORDPRESS_DB_PASSWORD, et WORDPRESS_DB_NAME. Ces variables sont utilisées par WordPress pour se connecter à la base de données MySQL.
  • L’attribut volumes spécifie les volumes à monter dans le conteneur WordPress.

Renseigner les propriétés avec un fichier .env

Plutôt que d’avoir des mots de passe en dur, pour des raisons de sécurité il est préférable d’utiliser des variables qui seront stockées dans un fichier .env à la racine.

Le fichier docker-compose.yml utilise une approche différente de celle que vous avez l’habitude d’utiliser pour les mots de passe pour l’accès habituel à un système de gestion de base de données root et votre mot de passe ainsi que pour des accès en local à WordPress utilisateur_wp et mot_de_passe_wordpress.

Les mots de passe sont stockés dans des variables d’environnement, ce qui évite de les stocker directement dans le fichier docker-compose.yml.

MYSQL_ROOT_PASSWORD=somewordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress

Démarrage des services

Lorsque vous avez plusieurs docker-compose il est conseillé de nommer les projets pour bien les différencier.

docker-compose -p mon_projet_1 up -d

docker-compose -p mon_projet_2 up -d

Toujours dans le dossier de votre projet et lancez la commande.

docker-compose up -d

Dans votre terminal, accédez au répertoire contenant votre fichier docker-compose.yml et exécutez la commande suivante pour démarrer les services :

docker-compose up -d

docker-compose up: cette partie de la commande est utilisée pour démarrer les services définis dans le fichier docker-compose.yml. Lorsque vous exécutez docker-compose up, Docker Compose lit le fichier docker-compose.yml et crée et démarre les conteneurs nécessaires pour chaque service défini.

L’option -d, ou --detach, est utilisée pour exécuter les conteneurs en mode détaché. Cela signifie que les conteneurs s’exécutent en arrière-plan et que vous récupérez immédiatement le contrôle de votre terminal après avoir lancé la commande. Sans cette option, les logs des conteneurs seraient affichés directement dans votre terminal, ce qui rendrait difficile l’utilisation de votre terminal pour d’autres tâches.

La commande docker-compose crée d’abord des images puis des conteneurs.

docker compose up

La commande a réussi à créer le réseau qui permet aux conteneurs de communiquer entre eux ainsi que le volume wp_db_data. Elle a démarré les conteneurs de services WordPress et de base de données.

Annuler la commande

Pour annuler l’exécution de docker-compose up -d et arrêter tous les conteneurs démarrés par cette commande, vous pouvez utiliser la commande suivante :

docker-compose down

Pour supprimer un projet en particulier

docker-compose -p mon_projet_1 up -d

docker-compose -p mon_projet_2 up -d

docker-compose up -d

docker containers

docker images

docker volumes

Etape 4 – Vérifier l’état des conteneurs Docker

Utilisez la commande docker ps pour voir les conteneurs en cours d’exécution. Assurez-vous que les conteneurs WordPress, la base de données et éventuellement sont en cours d’exécution.

docker ps
docker ps

Etape 5 – Installer WordPress

Accéder à l’installation de WordPress

Ouvrez un navigateur Web et accédez à l’adresse http://localhost:8000 (ou à l’adresse spécifiée dans votre fichier docker-compose.yml si vous avez utilisé un port différent). Vous devriez voir la page d’installation de WordPress.

installation wordpress

http://localhost/wp-admin/install.php

Utiliser un fichier dockerfile

L’utilisation d’un dockerfile apporte de nombreux avantages. Cela nous permet entre autre de personnaliser l’image et spécifier des dépendances logicielles, des configurations système pour WordPress dans notre cas.

Avec ce Etape 5 – Accéder à l’installation WordPress sur mesure nous pourrons ajouter WP-Cli un logiciel additionnel utile pour notre productivité.

Dans le fichier docker-compose.yml nous déclarons le fichier php.dockerfile

version: '3.8'

services:

  db:
    image: mariadb:latest
    restart: always
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

  wordpress:
    build: 
      context: .
      dockerfile: php.dockerfile  # Utiliser le fichier php.dockerfile
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - "8181:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

volumes:
  db_data: {}

Création du fichier php.dockerfile

Dans ce fichier nous indiquons de la provenance de l’image avec le mot clé FROM

Nous lançons l’exécution de l’installation des dépendances nécessaires à Composer et WP-Cli.

WP-Cli a lui aussi besoin de Composer.

# Utilisez l'image WordPress officielle comme image de base
FROM wordpress:latest

# Installer les dépendances nécessaires pour Composer et WP-CLI
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get install -y git && \
    apt-get install -y unzip

# Installer Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Installer WP-CLI
RUN curl -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
    chmod +x /usr/local/bin/wp

Paramétrage d’un utilisateur pour lancer les commandes WP-CLI

Comme il déconseillé d’utiliser l’utilisateur root dans l’utilisation de WP-Cli nous créons un utilisateur

# Utilisez l'image WordPress officielle comme image de base
FROM wordpress:latest
# Installer les dépendances nécessaires pour Composer et WP-CLI
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get install -y git && \
    apt-get install -y unzip
# Installer Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Installer WP-CLI
RUN curl -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
    chmod +x /usr/local/bin/wp
# Créer un utilisateur non-root pour exécuter WP-CLI
RUN useradd -m wpcliuser

# Définir le mot de passe de l'utilisateur
RUN echo 'wpcliuser:${WPCLIUSER_PASSWORD}' | chpasswd

# Donner les permissions nécessaires au nouvel utilisateur
RUN chown -R wpcliuser /var/www/html
#RUN chown -R wpcliuser /var/www/html/wp-content


# Définir l'utilisateur non-root comme utilisateur par défaut
USER wpcliuser

Fichier php.dockerfile

Ajout de Node.js dans docker-compose.yaml

  nodejs:
    image: node:latest
    restart: unless-stopped  # Change to unless-stopped for development
    working_dir: /app
    volumes:
      - ./app:/app
    command: ["npm", "install", "-g", "pnpm", "webpack"]

Commandes utiles

Afficher les journaux d’un conteneur Docker nommé wordpress :

docker-compose logs wordpress  

Exécuter une commande WordPress CLI (wp-cli) dans un conteneur Docker.

docker-compose run --rm wp-cli wp --info

Installer un plugin en ligne de commande

docker-compose run --rm wp-cli wp plugin install smush

Reconstruire et redémarrer vos conteneurs

docker-compose up -d --build

Vérifier les processus actifs

docker-compose ps

Afficher WordPress dans VSCode

Nous montons le volume dans le conteneur WordPress au niveau du fichier docker-compose.yml

  wordpress:
    build: 
      context: .
      dockerfile: php.dockerfile  # Utiliser le fichier php.dockerfile
    restart: always
    volumes:
      - ./wordpress:/var/www/html
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}

Il est temps de relaire un buid et de tester

docker-compose up -d --build

Vérifiez les éventuelles erreurs affichées dans le terminal.

Forcez me redémarrage du conteneur WordPress

docker-compose restart wordpress

Listez les processus actifs

docker ps

En cas de problème

docker logs

Pour lancer les conteneurs dans leur ensemble

/docker-compose start 

Nettoyer l’ensemble du système Docker en supprimant les conteneurs, images, réseaux et volumes inutilisés.

docker system prune -a

Supprimer les modules non utilisés

docker volume prune

En synthèse pour l’installation de WordPress avec un Dockerfile personnalisé

  • Créez un Dockerfile:
    • Définissez les instructions pour installer et configurer WordPress, PHP, MySQL/MariaDB, etc.
    • Incluez les dépendances, les variables d’environnement et les configurations spécifiques.
  • Construisez l’image Docker:
    • Utilisez docker build pour créer une image à partir de votre Dockerfile.
    • Spécifiez un nom et un tag pour votre image.
  • Exécutez le conteneur Docker:
    • Utilisez docker run comme décrit précédemment, en faisant référence à l’image que vous avez créée.

Utiliser Docker Compose: cet outil vous simplifie la gestion de plusieurs conteneurs et de la configuration.

Installer phpMyAdmin dans le conteneur pour gérer la base de données MySQL/MariaDB graphiquement.

Utiliser des volumes Docker: persistez les données WordPress et les fichiers de configuration en dehors du conteneur.

Dans un prochain épisode je vous montrerai comment installer un WordPress depuis une image préparée.

Ressources

Dépôt GitHub

OpenClassrooms Optimisez votre déploiement en utilisant Docker

Documentation Docker Desktop

Exemples de fichiers Docker Compose pour WordPress

https://docs.docker.com/samples/wordpress/

https://github.com/docker/awesome-compose/blob/master/wordpress-mysql/compose.yaml

Retour en haut