Plusieurs sites sous WordPress sous docker avec docker-compose, nginx-proxy et leur propre base de données

Alors voilà, depuis le début du mois, dans l’objectif de migrer le blog (entre autre), j’ai passé une quinzaine d’heures à chercher un moyen d’utiliser docker-compose et l’image nginx-proxy pour pouvoir rendre disponible plusieurs sites sous WordPress. C’est simple, mais il était impossible de trouver cette simple solution sur le web. Les tutoriels existants (utilisant l’image officielle de WordPress) créent une erreur 503 sur l’un des sites. Certaines solutions alternatives ne sont plus maintenues tandis que d’autres ne permettent pas l’utilisation d’un conteneur séparé pour la base de données. Enfin, quelques-unes fonctionnent comme je veux, mais nécessitent la modification de plusieurs fichiers de configuration or je souhaite passer le moins de temps possible à faire de la maintenance. Il me faut donc une solution simple.

Bref, voici le docker-compose.yml fonctionnel (l’image pour WordPress utilise php7, certains modules pourraient donc ne pas fonctionner) :

version: '2'
services:
    nginx-proxy:
        restart: always
        image: etopian/nginx-proxy # pour profiter des 2G d'upload possible, car jwilder/nginx-proxy est limite a 2M
        container_name: nginx-proxy
        ports:
            - 80:80
            - 443:443
        volumes:
            - /srv/docker/nginx/certs:/etc/nginx/certs
            - /etc/nginx/htpasswd:/etc/nginx/htpasswd
            - /etc/nginx/vhost.d:/etc/nginx/vhost.d:ro
            - /var/run/docker.sock:/tmp/docker.sock:ro
        environment:
            - ENABLE_IPV6=true
    
    wordpress1:
        restart: always
        image: etopian/alpine-php-wordpress
        container_name: wp1_etopian
        links: 
            - db1
        volumes:
            - ./wp1data:/DATA
        environment:
            VIRTUAL_HOST: wp1.localhost

    db1:
        restart: always
        image: mariadb:latest
        container_name: wp1_db
        ports: 
            - 172.17.0.1:3306:3306
        volumes:
            - ./wp1mysql:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: pasimportantpourletuto
            MYSQL_DATABASE: wp1
            MYSQL_USER: wp1
            MYSQL_PASSWORD: wp1

    wordpress2:
        restart: always
        image: etopian/alpine-php-wordpress
        container_name: wp2_etopian
        links: 
            - db2
        volumes:
            - ./wp2data:/DATA    
        environment:
            VIRTUAL_HOST: wp2.localhost

    db2:
        restart: always
        image: mariadb:latest
        restart: always
        container_name: wp2_db
        ports: 
            - 172.17.0.1:3307:3306 #on redirige le port 3306 du conteneur sur le port 3307 
        volumes:
            - ./wp2mysql:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: pasimportantpourletuto
            MYSQL_DATABASE: wp2
            MYSQL_USER: wp2
            MYSQL_PASSWORD: wp2

Il reste deux petites choses à faire. Déjà mettez le code de WordPress dans ./wp1data/htdocs et ./wp2data/htdocs. Ensuite, faites chown -R 100:101 htdocs/ pour chaque dossier htdocs. Enfin, après un docker-compose up -d ,  allez sur wp1.localhost et wp2.localhost avec votre navigateur (oui je détaille des étapes évidentes).

Pour le nom de la base de données, l’identifiant et le mot de passe entrez les données correspondante du fichier docker-compose.yml (MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD).
Pour l’hôte de la base de données de wp1 entrez uniquement l’adresse ip 172.17.0.1 (si vous rajoutez le port 3306, qui est le port par défaut, allez savoir pourquoi cela ne fonctionnera pas) et pour l’hôte de la base de données de wp2 entrez 172.17.0.1:3307.

Et voilà, vous devriez avoir deux instances de WordPress sous docker.

Plusieurs sites sous WordPress sous docker avec docker-compose, nginx-proxy et leur propre base de données par La Réponse est 42 est sous Licence Creative Commons Internationale Attribution-Partage à l'identique 4.0.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *