Tutoriel Docker 3 : docker compose pour le multi-conteneur

Ecrit par << Paquet Judicaël >>

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.

Commençons 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 ». C’est celui qu’on 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. Elle vous 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 docker compose

Vous avez à présent toutes les bases pour être capable de maîtriser rapidement docker compose. C’est un outil 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 réponses sur “Tutoriel Docker 3 : docker compose pour le multi-conteneur”

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.