/ Docker

Votre blog sous Alpine Linux et Docker

Nous avons vu comment mettre en place une stack LEMP très facilement avec Docker. Comme dit dans l’article précédent, celui-ci était uniquement un template, nous allons voir comment l’exploiter afin de mettre en place très rapidement un blog WordPress.

Notre stack WordPress

Nous allons avoir besoin de différents docker que nous avons déjà utilisés lors de la mise en place de stack LEMP. On remplacera juste l’image PHP que j’ai utilisé par une image WordPress.

Voici la stack LEMP que nous avions avant :

Nginx (evild/alpine-nginx)
PHP (evild/alpine-php)
MYSQL (mariadb)

On remplace donc PHP par WordPress. Cette image se base sur l’image de PHP mais rajoute les fichiers nécessaires de WordPress.

Nginx (evild/alpine-nginx)
WordPress (evild/alpine-wordpress)
MYSQL (mariadb)

Qu’est-ce qui change ?

Vous pouvez conserver la configuration que j’ai choisi pour l’article sur la mise en place d’une stack LEMP avec Docker. Le seul changement ici est le container de PHP qui est remplacé par celui de WordPress.

Reprenons le docker-compose de la stack LEMP :

Code:
version: '2' services: nginx: image: evild/alpine-nginx:1.9.15-openssl containername: lempnginx restart: always links: - php volumes: - ./html:/var/www/html/:ro - ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro ports: - 80:80 - 443:443 php: image: evild/alpine-php:7.0.6 containername: lempphp restart: always volumes: - ./html:/var/www/html dependson: - db links: - db environment: - DBNAME=lempbdd - TABLEPREFIX=lemp - DBHOST=lemp - DBPASSWORD=password db: image: mariadb:latest containername: lempmariadb restart: always volumes: - db-data:/var/lib/mysql environment: - MYSQLROOTPASSWORD=password volumes: db-data: driver: local

On remplace l’image du service php par evild/alpine-wordpress:latest. Le tag peut également être remplacé par une version. Cependant, il n’y a actuellement que le tag 4.5.2 et latest qui sont disponibles. Quelques variables d’environnement sont aussi nécessaires pour paramétrer le fichier de configuration de WordPress.

*Code:

  • WORDPRESSDBNAME=wpdb - WORDPRESSTABLEPREFIX=wp - WORDPRESSDBHOST=db - WORDPRESSDBPASSWORD=password*
    **
    On obtient ainsi ce fichier :

Code:
version: '2' services: nginx: image: evild/alpine-nginx:latest restart: always links: - php volumes: - wordpress-data:/var/www/html/:ro - ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro ports: - 80:80 - 443:443 php: image: evild/alpine-wordpress:latest restart: always volumes: - wordpress-data:/var/www/html - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini depends_on: - db links: - db environment: - WORDPRESS_DB_NAME=wpdb - WORDPRESS_TABLE_PREFIX=wp_ - WORDPRESS_DB_HOST=db - WORDPRESS_DB_PASSWORD=password db: image: mariadb:latest restart: always volumes: - wordpress-db-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=password volumes: wordpress-data: driver: local wordpress-db-data: driver: local

Un volume supplémentaire est apparu dans le service PHP. Celui-ci permet d’augmenter la taille des fichiers autorisés en upload sur le serveur. Il faut aussi définir une limite de taille pour nginx. Pour cela, nous pouvons ajouter une ligne dans notre fichier de configuration nginx.conf :

Code:
clientmaxbodysize 64M;

Utilisation des networks avec docker-compose

On m’a également suggéré d’exploiter le potentiel des networks dans docker-compose, sachant que ces derniers ne peuvent être utilisés qu’avec une version 2. Le network permet d’accéder à différents dockers sans mettre en place des links. On peut facilement séparer la partie frontend de celle du backend. Dans notre cas Nginx sera donc dans le network frontend.

MariaDB sera dans la partie backend. En ce qui concerne WordPress, il doit être accessible à partir du container Nginx mais aussi pouvoir accéder à notre base de donnée (MariaDB), de ce fait on lui attribut les deux networks : frontend & backend.

Pour simplifier un peu les choses on va raccourcir les mots en front & back. Pour commencer, il faut définir les deux networks sous nos services.

Code:
version: '2' services : nginx: php: mariadb: networks: front: back:

Maintenant nous pouvons enlever nos links et ajouter le ou les networks à chaque services. On obtiendra donc le docker-compose suivant :

Code:
version: '2' services: nginx: image: evild/alpine-nginx:1.11.1-libressl restart: always volumes: - wordpress-data:/var/www/html/:ro - ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro ports: - 80:80 - 443:443 networks: - front php: image: evild/alpine-wordpress:latest restart: always volumes: - wordpress-data:/var/www/html - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini environment: - WORDPRESSDBNAME=wpdb - WORDPRESSTABLEPREFIX=wp - WORDPRESSDBHOST=db - WORDPRESSDBPASSWORD=password networks: - front - back db: image: mariadb:latest restart: always volumes: - wordpress-db-data:/var/lib/mysql environment: - MYSQLROOTPASSWORD=password networks: - back volumes: wordpress-data: driver: local wordpress-db-data: driver: local networks: front: back:

Les sources sont disponibles sur github.

Lancement du docker-compose

On utilise toujours la même commande :

Code:
docker-compose up -d

On va devoir patienter quelques secondes, le temps que tous nos containers soient opérationnels, et si tout s’est bien passé vous allez voir en accédant à l’IP de votre serveur la page de choix de langue de WordPress.

wordpress_language

Allons plus vite

Grâce à Docker & Docker-compose nous avons pu mettre en place facilement un WordPress en moins de 90 secondes.

A vous de jouer maintenant :

root@vps447310:~# sudo apt-get -y install python-pip

root@vps447310:~# sudo pip install docker-compose

root@vps447310:~# git clone https://github.com/Evild67/docker-compose-wordpress Cloning into 'docker-compose-wordpress'... remote: Counting objects: 81, done. remote: Total 81 (delta 0), reused 0 (delta 0), pack-reused 81 Unpacking obj**ects: 100% (81/81), done. Checking connectivity... done.

root@vps447310:~# cd docker-compose-wordpres

root@vps447310:~# cd docker-compose-wordpress
root@vps447310:~/docker-compose-wordpress# docker-compose pull Pulling nginx (evild/alpine-nginx:1.11.2-libressl)... 1.11.2-libressl: Pulling from evild/alpine-nginx fae91920dcd4: Pull complete dc2c482e40ba: Pull complete 54d163497710: Pull complete b2132f5d43bd: Pull complete 654916cb1636: Pull complete Digest: sha256:b8bb1ed9e7fbead6265e8b03ae85b349b146fa40789c55e61e1c4bebfd43c616 Status: Downloaded newer image for evild/alpine-nginx:1.11.2-libressl Pulling php (evild/alpine-wordpress:4.5.3)...
4.5.3: Pulling from evild/alpine-wordpress fae91920dcd4: Already exists dc2c482e40ba: Already exists 54d163497710: Already exists b06ebf82f9e5: Pull complete a0b5448cc3cf: Pull complete cdb0aa568ce1: Pull complete 0c03c7c10e2b: Pull complete b582e02e52bd: Pull complete 348cd95cd4ad: Pull complete 93ec67f45bf1: Pull complete 5b749c2640c3: Pull complete 35d202cc58d2: Pull complete d3a11b1e161a: Pull complete Digest: sha256:ee75c5082ac2314b1e43f240270daf29900fb1087107e18b1e0eb481993fa649
Status: Downloaded newer image for evild/alpine-wordpress:4.5.3 Pulling db (mariadb:10)... 10: Pulling from library/mariadb ad74af05f5a2: Pull complete 0639788facc8: Pull complete de70fa77eb2b: Pull complete 724179e94999: Pull complete 57fbc7ff5cf1: Pull complete 9d5794cf4e5c: Pull complete b29a1331369b: Pull complete d9c9f0d8893c: Pull complete 59e8f74949a5: Pull complete 1281256e330d: Pull complete 3cc58a9ae809: Pull complete 2d75c7c0e6fc: Pull complete Digest: sha256:801ba73f78da191339d1cf2acdb98f2ea6fe2d38974e838a4a5f1535563e4ed7 Status: Downloaded newer image for mariadb:10

root@vps447310:~/docker-compose-wordpress# docker-compose up -d Creating network "dockercomposewordpress_front" with the default driver Creating network "dockercomposewordpress_back" with the default driver Creating volume "dockercomposewordpress_wordpress-db-data" with local driver Creating volume "dockercomposewordpress_wordpress-data" with local driver Creating wordpress_mariadb ... Creating wordpress_nginx ... Creating wordpress_php ... Creating wordpress_mariadb Creating wordpress_nginx Creating wordpress_nginx ... done

root@vps447310:~/docker-compose-wordpress# curl -I 127.0.0.1 HTTP/1.1 302 Found Server: nginx/1.11.2 Date: Tue, 22 Aug 2017 12:28:28 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/7.0.8 Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache Location: http://127.0.0.1/wp-admin/install.php
Et maintenant laissons la magie de Docker opérer :

Screenshot-2017-09-03-at-10.44.15

Via le terminal et SSH :

Screenshot-2017-09-03-at-11.00.53

Et depuis OVH manager :

Screenshot-2017-09-03-at-11.07.31

Mon blog tourne à plein régime, et comme vous pouvez le constater, il est rapide d'après mes récents tests de vitesse :

  • Chez Pingdom on constate que la stack Wordpress sous Alpine nous fait gagner de précieuses secondes.

Screenshot-2017-09-03-at-19.36.34-1

  • Chez PageSpeed Insights:

Screenshot-2017-09-03-at-19.46.41-1

Le résultat est sympa, malgré les optimisations menées à travers les extensions (mise en cache, minification fichiers JS, CSS ou encore images, CDN etc...), le blog peine à parvenir au 80/100 de score auprès de la référence pour améliorer son site. Je vais tâcher de suivre ces conseils donnés sur le site : https://www.nosyweb.fr/les-autres-outils-google/obtenir-100-100-sous-wordpress-avec-google-pagespeed-insights.html

En attendant, je me suis amusé à apporter une modification sur mon VPS : Glances pour la supervision de celui-ci (cf. article sur Glances).

Screenshot-2017-09-03-at-19.51.37

On suit la procédure décrite,

Screenshot-2017-09-03-at-19.35.21

Et on admire le résultat, on peut noter la présence des containers de mon blog (Mariadb, PHP et Nginx).