Tutoriel Docker 3 : docker-compose pour le multi-conteneur

Si vous avez loupé les deux articles précédents, je vous propose d’aller les lire avant de vous lancer dans ce tutoriel docker 3 où nous allons apprendre à gérer plusieurs conteneurs ensemble avec l’aide du docker-compose.

Article 1 : Premiers pas avec Docker
Article 2 : Maitrisez les Dockerfile

Ce tutoriel est indépendant des deux précédents mais il est fort utile d’avoir quelques connaissances en Docker pour bien comprendre la puissance de docker-compose.

Qu’est-ce que docker-compose

docker-compose est un outil très intéressant de gestion de package docker. Cet outil va lancer vos conteneurs et leurs éventuels liens à partir d’un fichier de configuration écrit en yaml. Nous pourrions comparer cet outil à apt-get ou composer mais dans le but de packager des conteneurs docker. Cet outil vient simplifier la vie aux utilisateurs aux utilisateurs de docker.

Installation de docker-compose

“Sous Ubuntu configuré de base, il vous faudra mettre sudo devant vos commandes ou revoir la configuration de vos utilisateurs”

Nous allons devoir installer ce nouvel outil qui ne fait pas parti des outils de base lors de l’installation de Docker

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

Nous allons pouvoir vérifier que l’installation a bien fonctionné en testant une fonction très simple de docker-compose qui permet d’afficher le numéro de version de l’outil installé :

docker-compose -v

Préparation de nos images

Pour utiliser notre docker-compose nous allons utiliser deux images docker : une que nous allons créer avec un Dockerfile et l’autre que nous allons récupérer sur Docker Hub

Image créée à partir d’un Dockerfile

Nous allons créer notre première image qui sera un serveur apache avec du php qui aura la capacité de se connecter à un serveur MySql extérieur.

Nous allons commencer par créer un dossier docker/ et y mettre un fichier index.php comme ceci :

<?php
 
 $dbh = new PDO('mysql:host=db;dbname=mysql', 'root', 'passe');
 
 foreach($dbh->query('SHOW DATABASES') as $row) {
   echo $row[0]. '<br/>';
 }

Nous allons également faire un fichier docker/host.conf :

<VirtualHost *:80>
     ServerAdmin webmaster@localhost
     DocumentRoot /var/www/test
 </VirtualHost>

Nous allons à présent écrire notre Dockerfile qui va utiliser ces deux fichiers lors du build de l’image :

FROM ubuntu:16.04
 MAINTAINER Judicael paquet
 
RUN apt-get update && \
     apt-get install -y apache2 php libapache2-mod-php mysql-client php7.0-mysql
 
 RUN sed -i 's/;extension=php_mysqli.dll/extension=php_mysqli.dll/' /etc/php/7.0/apache2/php.ini
 RUN sed -i 's/;extension=php_pdo_mysql.dll/extension=php_pdo_mysql.dll/' /etc/php/7.0/apache2/php.ini
 
 ADD docker/host.conf /etc/apache2/sites-enabled/000-default.conf
 ADD docker/index.php /var/www/test/index.php
 
 ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Tout est prêt pour builder notre image :

docker build -t monapache .

Image récupérée sur Docker Hub

Pour notre deuxième image nous allons utiliser une autre méthode : docker hub. Nous allons récupérer une image du Docker Hub en local grâce à la commande suivante :

docker pull mysql/mysql-server:5.7

Création du fichier docker-compose.yml

Docker-compose comme je le disais plus haut propose de gérer plusieurs conteneurs en même temps avec la possibilité de les faire communiquer entre eux grâce à un seul fichier : le docker-compose.yml.

Je vous propose de créer le notre :

db:
     image: mysql/mysql-server:5.7
     ports:
       - "3306:3306"
     environment:
       - "MYSQL_ROOT_PASSWORD=passe"
       - "MYSQL_USER=your_user"
       - "MYSQL_PASSWORD=your_user_password"
       - "MYSQL_DATABASE=your_database_name"
superapachephp:
     build: ./
     ports:
       - "8010:80"
     links:
       - "db:db"
     working_dir: "/home/docker"

Comme vous le voyez, nous avons volontairement mis “passe” en mot de passe “root” comme on l’avait déjà mis dans notre fichier PHP. Sachez que le nom “db” est important car  il sera automatiquement le nom de l’host du conteneur ; c’est pour cela qu’on a mis “db” en hostname sur la connexion SQL faites en PHP.

A part la syntaxe qui change, si vous êtes familier avec docker run et les dockerfile, vous ne devriez pas être dérouté avec ce fichier. Le link permet de lier le conteneur à un autre comme avec l’option -v du docker run que nous n’avions pas vu.

A présent nous allons lancer notre docker-compose comme ceci :

docker-compose up -d

A présent tentez d’appeler dans votre navigateur l’url http://localhost:8010. Si vous avez une page blanche, il vous faudra faire la manipulation suivante qui permettra de mettre les bons droits à l’utilisateur Mysql :

docker ps 
# remplacez ubuntu_db_1 par l'id de votre conteneur db
docker exec -it ubuntu_db_1 mysql -uroot -p -e "CREATE USER 'root'@'%' IDENTIFIED BY 'passe';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';FLUSH PRIVILEGES;"

Pour rappel, le mot de passe sera “passe”.

Si tout est ok, vous aurez la liste des bases présentes dans la base de données Mysql sur votre navigateur Internet.

Conclusion

Vous avez à présent toutes les bases pour être capable de maîtriser rapidement docker-compose qui est vraiment un outil utile. De plus en plus de projets sur Github proposent d’ailleurs ce fichier docker-compose.yml pour monter rapidement le projet.

4 Replies to “Tutoriel Docker 3 : docker-compose pour le multi-conteneur”

Leave a Reply

Your email address will not be published. Required fields are marked *