Une infrastructure de conteneurs (Docker-compose)


Pour comprendre la méthode de déploiement de conteneurs, j'exprime ici une situation où l'on va créer une application web écrite en PHP qui stockera ses données dans une base de donnée MySQL. Pour ne pas se compliquer la tâche, on se basera sur les images eboraas/apache-php et mysql:5.7.

Voici techniquement le schéma représentant ce que nous allons reproduire:

Cette topologie réseau permettra à l'application web d'être accessible en local via un navigateur web à l'adresse http://127.0.0.1/

Pré-requis

Avant de poursuivre le tutoriel, installons les bon outils :

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

On définit l'utilisateur qui aura le droit de les utiliser :

sudo usermod -aG docker mon_utilisateur

Créer notre infrastructure

Tout au long de ce tutoriel on restera dans le dossier de l'utilisateur courant. Le code source se situe dans le chemin relatif suivant :

mkdir ~/code
nano ~/code/index.php
index.php
<?php
        // Information sur le conteneur :
        echo gethostname();
        echo "<h1>tout fonctionne bien!<h1>";
 
        // Test d'une connexion à la base de donnée :
        try {
                $bdd = new PDO("mysql:host=bdd;dbname=mysql","root","mysql");
                echo '<p>Connecté à la Base de donnée</p>';
 
                echo "<p>Simple requête : </p>";
                foreach  ($bdd->query('SELECT * from user') as $row)
                { echo '<pre>'.var_dump($row).'</pre>';}
        }
        catch(PDOException $e) {
                echo $e->getMessage();
        }
?>

Rédigeons notre plan de travail sur lequel on défini la composition des conteneurs :

nano ~/docker-compose.yml
docker-compose.yml
version: '2'

services:

  site:
    image: eboraas/apache-php
    ports:
     - "80:80"
    volumes:
     - ./code:/var/www/html
    links:
     - bdd

  bdd:
    image: mysql:5.7
    environment:
       MYSQL_ROOT_PASSWORD: mysql
       MYSQL_DATABASE: mysql

Pour ajouter d'autres directives, elles sont disponible dans la documentation de Docker.

Ci-dessus j'indique dans un premier temps que le conteneur site se basera sur l'image apache-php de l'utilisateur eboraas. Il aura le port 80 “natté” sur la machine hôte et il aura connaissance du conteneur bdd grâce à la fonction “links”. Pour utiliser le code source de l'application, on créer un point de montage dans le conteneur à l'emplacement /var/www/html.

Concernant la base de donnée, je me base sur la version 5.7 de l'image officiel Mysql dont j'ai renseigné via des variables de post-configuration, le nom de la BDD et le mot de passe administrateur

On peut maintenant lancer la création des conteneurs :

docker-compose up -d
Creating network "projet_app" with driver "bridge"
Creating projet_bdd_1
Creating projet_site_1

Ainsi on peut voir que les conteneurs fonctionnent bien :

docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                         NAMES
386f3519cf4a        eboraas/apache-php   "/usr/sbin/apache2ctl"   46 seconds ago      Up 45 seconds       0.0.0.0:80->80/tcp, 443/tcp   projet_site_1
362e1be8dd76        mysql:5.7            "docker-entrypoint.sh"   46 seconds ago      Up 45 seconds       3306/tcp                      projet_bdd_1

Voici la belle réponse de notre conteneur site !

Détruire le projet

Sa destruction est encore plus simple que sa construction car elle se faut en une seule ligne :

docker-compose down