Déployer un site wordpress avec Docker et Apache
Le 12 décembre 2023 | serveur Docker
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.