Déployer un site wordpress avec Docker et Apache

Le déploiement d'un site WordPress peut être simplifié à l'aide de Docker, un outil de conteneurisation populaire qui assure l'isolation des logiciels et la portabilité des applications. J'ai pourtant eu quelques difficultés, notamment dans la configuration d'Apache. Voici donc comment déployer un site WordPress sur un serveur AlmaLinux en utilisant Docker et le serveur web Apache.

 

Installation de Docker et Docker Compose

1. Connectez-vous à votre serveur AlmaLinux.
2. Installez Docker :

sudo dnf install docker-ce docker-ce-cli containerd.io


3. Démarrez et activez Docker :

sudo systemctl start docker
sudo systemctl enable docker


4. Installez Docker Compose :
 

sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

 

 

Création des fichier Docker Compose et docker file

Le fichier docker-compose.yml doit être à la racine du dossier docker

Voici l'architecture des dossiers

| monprojet_docker
|-- monprojet_wordpress
    |_ Dockerfile
| docker-compose.yml
 
 

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
      WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
      WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
      WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
    volumes:
      - ./monprojet_wordpress:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    restart: always

    depends_on:
      - db

  db:
    image: mariadb
    ports:
      - "3307:3306"
    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}

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
    depends_on:
      - db


   volumes:
     monprojet_wordpress:
     db_data:

Dans cet exemple, la base de donnée est MariaDB. J'ai aussi rajouté phpmyadmin, ce qui me permet de gérer la base de donnée sur le port 8080 : mon_domaine.com:8080

Je conseille aussi la création d'un Dockerfile, qui va permettre de faire différentes actions lors de la création de l'image wordpress.
Le fichier .htaccess doit être modifiable par wordpress et doit être à la racine du site wordpress

FROM wordpress:latest

# Copiez votre fichier .htaccess personnalisé
COPY ./.htaccess /var/www/html/.htaccess

# Assurez-vous que les permissions sont correctes, afin que wordpress puisse modifier 
RUN chmod 664 /var/www/html/.htaccess
RUN chown www-data:www-data /var/www/html/.htaccess

et voici le fichier .htaccess (qui normalement est créé par wordpress : 


# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

 

Mis en place du certificat SSL

J'utilise Let'sEncrypt pour la création d'un certificat SSL

sudo dnf install certbot python3-certbot-apache

sudo certbot --apache -d mon_domaine.com

 

Modification des fichiers de configuration Apache

Il y a 3 fichiers de configurations à modifier : le fichier de configuration d'apache, et les deux fichiers de configuration du site.

Sur mon serveur Almalinux, le fichier de configuration Apache "httpd.conf" se situe dans le dossier /etc/httpd/conf/ 

J'ai simplement rajouté une ligne pour la lecture du header :

RequestHeader set X-Forwarded-Proto "https"

Il faut aussi modifier dans ce cas le fichier de configuration de wordpress : le fichier wp-config.php

// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
	$_SERVER['HTTPS'] = 'on';
}
// (we include this by default because reverse proxying is extremely common in container environments)

if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
	eval($configExtra);
}

 

Les deux fichiers de configurations du site sont situés dans le dossier /etc/httpd/conf.d/
le premier : mon_domaine.conf
 

<VirtualHost *:80>
    ServerName mon_domaine.com
    ServerAlias www.mon_domain.com

    # Redirection de tout le trafic HTTP vers HTTPS
    RewriteEngine On
    RewriteCond %{SERVER_NAME} =pamelamichel.com [OR]
    RewriteCond %{SERVER_NAME} =www.pamelamichel.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

 

et le fichier de conf avec le ssl : mon_domain-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName mon_domaine.com
    ServerAlias www.mon_domaine.com

    # DocumentRoot doit pointer vers le répertoire où est installé WordPress
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Configurations de Proxy pour Docker
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/

    SSLCertificateFile /etc/letsencrypt/live/mon_domaine.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mon_domaine.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # Log configurations (optionnel)
    ErrorLog /var/log/httpd/mon_domaine_error.log
    CustomLog /var/log/httpd/mon_domaine_access.log combined
</VirtualHost>
</IfModule>

 

Lancement de WordPress avec Docker Compose

Démarrez les conteneurs :

   docker-compose up -d


Le site wordpress est maintenant accessible à l'adresse mon_domaine.com !

 

Le site wordpress est maintenant déployé sur le serveur AlmaLinux à l'aide de Docker, avec Apache servant de reverse proxy. Cette configuration offre un environnement isolé et contrôlé pour exécuter WordPress, facilitant la gestion et la mise à jour.