Docker – Mise en place d’une infrastructure internet sous WordPress (LAMP)

Docker – Mise en place d’une infrastructure internet sous WordPress (LAMP)

Contexte

Ce projet avait pour but de tester la technologie de conteneurs Open Source « Docker ».

Cette technologie présentée comme concurrente à la virtualisation sur bien des points (bien que personnellement je pense qu’elle est plutôt complémentaire !) est encore jeune, mais possède effectivement un énorme potentiel pour les développeurs et les administrateurs systèmes : elle permet d’embarquer des applications dans des conteneurs virtuels Linux (LXC) et exécute celle-ci à l’intérieur de cet environnement. Seul l’application et ses dépendances sont embarquées, ainsi le conteneur peut migrer d’un serveur à l’autre sans aucun changement de configuration nécessaire.

Docker01

L’intérêt immédiat est une simplification de configuration (on ne perd plus de temps à configurer les parties OS et services puisque les dépendances sont intégrées au conteneur), une utilisation moindre des ressources partagées par l’hôte (finit le temps des hyperviseurs « machine de guerre » ?) et une taille  réduite au minimum par rapport aux VM classiques, mais après quelques tests on comprend vraiment l’énorme potentiel concernant les migrations et évolutions qui sont elles, grandement simplifier … ce que je démontrerais sur ce projet !

Pourquoi les conteneurs sont complémentaires à la virtualisation ? Cars ils présentent des défauts propres à cette nouvelle méthodologie de fonctionnement :

  • Un OS mutualiser qui oblige les conteneurs à fonctionner sur celui-ci (impossible de faire fonctionner des conteneurs Linux sous environnement Windows Server par exemple).
  • Toujours lier à cet OS mutualiser et le partage des ressources : les conteneurs sont donc beaucoup moins isoler qu’avec des VM classique. En cas de virus ou de bug, c’est l’ensemble des conteneurs qui peuvent être impactés !

 

MAJ  (février 2016) : Microsoft, qui travaille de concert avec Docker, a communiqué sur l’implémentation de la technologie des conteneurs Docker combinés avec la virtualisation Hyper-V dans sa prochaine version de serveur Windows Server 2016 ! Cette approche des deux mondes de la virtualisation devrait permettre de garder les avantages des conteneurs tout en permettant une meilleure isolation de ceux-ci. Nous arriverons donc dans les prochaines années à une technologie qui va gagner en maturité et commencer à avoir de sérieux arguments face aux VM classiques !

server-cloud-apr8-1.png-720x0

Sur cette image, la partie en cyan « Hyper-V Virtualisation » est l’approche de Microsoft pour répondre à la problématique d’isolement des conteneurs.


 

 

 

Je ne vais pas faire un cours sur Docker, le site internet https://www.docker.com/whatisdocker décrit très bien le produit.

Pour ce projet l’objectif est de mettre en place un hébergement d’un site web sous WordPress, avec une optimisation de la sécurité ainsi qu’une possibilité d’évolution facilitée : Docker.

Matos

Pour ce projet j’utilise :

  • Une machine hôte avec Ubuntu server.
  • SSH, pour la connexion à distance
  • Docker, pour l’utilisation des LXC (un conteneur WordPress (Serveur Apache) / un conteneur MySQL / Un conteneur Piwik)
  • Fail2Ban, pour la sécurisation des accès SSH sur le site web

 

1- Installation de Docker

On commence par la création du fichier suivant :

nano /etc/apt/sources.list.d/docker.list

écrire à l’intérieur :

deb http://get.docker.io/ubuntu docker main

Télécharger la clé GPG et installer le paquet :

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
apt-get update
apt-get install lxc-docker

Docker est maintenant installé :

dockerinstalle

 

2- Installation et configuration de la BDD

Pour l’installation de la base de données, j’utilise l’image officielle MySQL. Pour la télécharger :

docker pull mysql:latest

Quand le téléchargement se termine, on peut vérifier la présence de l’image avec la commande:

dockerimagesPour lancer le conteneur basé sur cette image, on lance la commande :

docker run -e MYSQL_ROOT_PASSWORD=**** --name DB -v /home/mysql/:/var/lib/mysql/ -d mysql

Quelques petites explications sur cette commande :

  • « docker run »   = commande pour « lancer » un container
  • « -e » = option de la commande pour préciser une variable d’environnement
  • « MYSQL-ROOT-PASSWORD=**** » = permet de préciser le mot de passe d’administration de MySQL.
  • « — name DB » = permet de donner un nom au conteneur, ici « DB »
  • « -v … » = cette option permet de monter un volume partagé entre l’hôte et le container. Le répertoire « /home/mysql » de l’hôte est monté sur le répertoire « /var/lib/mysql » du container.
  • « -d mysql » = précise quelle image doit lancer Docker.

L’avantage de l’option -v est qu’elle va permettre de simplifier les mises à jour du conteneur : il suffira de télécharger l’image mise à jour, de supprimer le conteneur initial, de démarrer le nouveau conteneur sur l’image téléchargé puis de lier ce nouveau conteneur avec les données présentes sur la machine hôte.

Pour vérifier le fonctionnement du conteneur :

docker ps

La base de données MySQL est maintenant en place, elle est en écoute sur le port 3306, l’ identifiant « root » avec le mot de passe précisé plus haut permet l’administration de celle-ci.

Pour tester son fonctionnement depuis la machine hôte (sans rentrer dans le conteneur donc) on peut utiliser la commande suivante :

mysql -h <ip du conteneur> -uroot -pmotdepasse

La BDD n’est joignable que de l’hôte et de ses conteneurs uniquement. Elle n’est pas joignable depuis l’extérieur.

Récupérer les adresses IP des différents conteneurs est une tâche récurrente lorsque l’on utilise Docker. Pour simplifier la tâche on peut crée un alias :

alias dip="docker inspect --format '{{ .NetworkSettings.IPAddress }}'"

Avec la commande alias « dockip »+ le nom du conteneur nous pouvons récupérer facilement l’adresse ip. Par exemple :

mysql -h$(dip DB) -uroot -pvotremotdepasse

Cette commande nous permet également une connexion sur la base MySQL.

 

3 – Le conteneur WordPress

Pour commencer je télécharge l’image officielle de WordPress

docker pull wordpress:latest

Puis je lance un nouveau conteneur basé sur cette image

docker run --name some-wordpress --link db:mysql -v /home/wp/:/var/www/html/ -p 80:80 -d wordpress

Dans cette commande on peut voir l’option « link » qui me permet de connecter un autre container (je connecte ici mon nouveau container avec mon container MySQL).

Le conteneur étant maintenant opérationnel, il suffit de lancer notre navigateur favori et tester avec l’adresse ip de notre serveur

WP login

Nous avons terminé notre infrastructure web avec nos conteneurs « Serveur Web » et « Base de données » qui communiquent entre eux.

4 – Le conteneur PIWIK

Comme précédemment, on commence par trouver une image Piwik sur le site https://registry.hub.docker.com/

piwik github

Puis on la télécharge

docker pull cbeer/piwik:latest

Et enfin on lance un nouveau conteneur basé sur cette image

docker run -d --name piwik --link db:mysql -p 48000:80 cbeer/piwik

Notre nouveau conteneur Piwik écoute sur le port 48000 (en réalité l’host va associer ce port vers le port 80 du conteneur Piwik). Maintenant pour tester ce conteneur nous ajoutons le port après l’adresse ip sur l’url « http://ipserveur:48000 ».

Les premières étapes de réalisation pour la mise en place de Piwik sont la configuration de la base de données. Nous pouvons donc commencer par la créer manuellement :

mysql -uroot -h$(dip DB) -pvotremotdepasse

Puis sous MySQL :

CREATE DATABASE piwik;
GRANT ALL PRIVILEGES ON piwik.* TO "user"@"%" IDENTIFIED BY 'motdepasse';
FLUSH PRIVILEGES;

Maintenant sous l’interface web Piwik, on renseigne les informations demandées :

  • Serveur : mysql (c’est l’option « link » entrée précédemment lors de la création du conteneur basé sur l’image Piwik)
  • Utilisateur : user
  • Mot de passe : motdepasse
  • Nom de la base : piwik
  • Prefixe : piwik_

Après cette étape, il faut renseigner l’URL du site à surveiller ainsi qu’un utilisateur pour Piwik.

Enfin nous arrivons sur l’interface de connexion :

Piwik

Une fois Piwik installé, la première étape consiste à aller dans les paramètres généraux afin de modifier le « nom d’hôte Piwik valide » de « site.com » à « site.com:48000 » (idem pour www.site.com à modifier en www.site.com:48000).

Prochaine étape : l’installation de l’extension Piwik pour WordPress. (recherchez le module WP-Piwik sous les extensions WordPress).

Une fois le module Piwik installé sous WordPress, il faut le configurer également.

  • Piwik URL : http://www.site.com:48000/
  • Auth Toke, : ici il faut copier coller le jeton que l’on trouve sur notre interface Piwik (cliquez en haut à droite sur le login puis sur API)
  • User-Agent : WP-Piwik

Pour terminer la configuration de Piwik, il faut aller sous « suivi » et cocher la case « Ajouter code de suivi ».

5 – Sécurisation Fail2Ban

Après toutes ces étapes il serait dommage de ne pas finir par un minimum de sécurité sur notre infrastructure web avec l’installation de Fail2Ban.

apt-get install fail2ban

Pour modifier la configuration de Fail2Ban, il faut éditer le fichier /etc/fail2ban/jail.conf.

On peut également compléter le niveau sécurité avec la configuration du pare-feu Iptable.

 

Sources :

Page Officielle de l’image WordPress

Page Officielle de l’image MySQL