Utilisation de Docker dans un environnement de développement

26 Juin 2019
actu2606
Quand je reviens quelques années en arrière en me demandant : Quels environnements de développement j’utilisais ? Quelles étaient les difficultés ? Comment je procédais lorsqu’un client m’annonce que son application tourne sur du PHP 4 alors que, sur mon PC, je dispose de la version PHP 5.6? Je me rends compte des difficultés rencontrées. En effet, il était impossible de faire cohabiter différentes configurations sur le même poste sans passer par des machines virtuelles.

La première fois où j’ai entendu parler de Docker, c’était il y a déjà 6 ans. A l’époque, on commençait à peine à se familiariser avec Vagrant, alors le logiciel phare de création et de configuration des environnements de développement virtuel. Une recherche rapide m’a redirigé vers la première conférence donnée par Solomon Hykes, cofondateur de dotCloud, dans laquelle, il présentait Docker avec une démonstration live de cet outil. J’ai immédiatement pris conscience de l’apport que l’utilisation de DOCKER fournirait aux équipes de développement. Depuis, Docker a connu de nombreuses évolutions ; la conférence DockerCon 2019 a d’ailleurs permis d’annoncer la troisième version de la plateforme Docker.

 

Mais c’est quoi Docker ?

Docker est un logiciel open source permettant d’embarquer une ou plusieurs applications et leurs dépendances dans des conteneurs, facilitant ainsi leurs déploiements. Un conteneur, contrairement à une machine virtuelle, ne contient pas le système d’exploitation.

 

Docker Vs Machine Virtuelle

Contrairement aux machines virtuelles, Docker permet une conteneurisation des applicatifs de manière isolée avec partage des ressources de la machine Hôte. Les machines virtuelles embarquent un système d’exploitation en plus des applications.

2606photo

Docker chez AUSY

Le défi de mettre à disposition un environnement de développement standard doit tenir compte des exigences projets et du matériel disponible. Un bon environnement de développement est un environnement accessible et assimilable rapidement par des développeurs ou intégrateurs qui n’ont pas forcément de connaissances poussées en infrastructure.

Dans cet esprit, AUSY a lancé il y a quelques années des ateliers de réflexion et ce, afin d’analyser nos besoins internes ainsi que les attentes des clients. Le but étant de produire un environnement facilitant le démarrage rapide d’un développeur.

Afin de rendre disponible un environnement sur tous les systèmes d’exploitation possibles, notre choix s’est arrêté sur la construction d’une Virtual Machine Linux desktop, dans laquelle, tous les outils de développement et surtout un environnement Docker sont préinstallés.

Ensuite, pour chaque projet Drupal 8, un montage en multiservices a été adopté. Il se compose des éléments suivants :

  • Service apache-php, basé sur une image centos 7, enrichie par les packages suivants :
    • Apache
    • Php 7 et les modules requis par Drupal 8
    • Drush
    • Composer
    • compass
    • mhsendmail
  • Service db : basé sur l’image “mysql:5.6” avec un fichier de configuration personnalisé
  • Service phpmyadmin : basé sur l’image “phpmyadmin/phpmyadmin” standard
  • Service Mailhog : basé sur une l’image “mailhog/mailhog:v1.0.0”. Cet outil prêt à l’emploi semble précieux pour tester rapidement des fonctionnalités liées à l’envoi des mails.
  • Service Behat : basé sur une image construite elle-même sur image “debian:stretch” que nous avons dotée d’outils spécifiques aux tests fonctionnels.

L’ensemble de ces éléments constitue un environnement d’exécution robuste, prêt à l’emploi et possédant des possibilités d’extensibilité au travers des fichiers de description de configuration Dockerfile et docker-compose.yml.

Le retour d’expérience, suite à la mise en place, a été très positif dans la mesure où le gain d’efficacité et de productivité est significatif.

 

Un peu de pratique

Installation

Pour pouvoir utiliser Docker, il indispensable de l’installer. Pour ce faire, lancer le terminal et exécuter les commandes suivantes spécifiques à la distribution linux centos 7. Pour les autres distributions, il convient de consulter la documentation officielle https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce

sudo yum check-update

sudo curl -fsSL https://get.docker.com/ | sh

 

Une fois l’installation terminée, on lance le service Docker :

sudo systemctl start docker

Pour s’assurer que le docker tourne bien, on exécute la commande suivante :

sudo systemctl status docker

visuel


Dans la sortie de la commande précédente, la mention “active (running)”, visible sur la copie d’écran ci-dessus, indique que le service Docker est actif et tourne.

Astuce : Pour s’assurer que le service Docker est lancé automatiquement à chaque démarrage du système, il convient de l’activer.

sudo systemctl enable docker

 

Utilisation

Docker-compose

En général, une application moderne est composée de plusieurs services. On parle d’une architecture microservices. Dans le contexte de Docker, l’outil Docker-compose permet de construire et exécuter des applications multi conteneurs.

Prenons l’exemple d’une application Drupal. On considère le montage multiservices suivant :

  • Apache
  • Php et modules php requis par Drupal
  • Mysql
  • Phpmyadmin pour accéder visuellement à la base de données
  • Éventuellement une interface pour intercepter les mails envoyés à partir de l’application.

Si on veut l’ensemble de ces logiciels dans une VM, il est fort probable de devoir consacrer un temps non négligeable pour rendre l'environnement opérationnel. Pour la maintenance et la réalisation nécessaire des mises à jour des packages (ensemble de composants de chaque containeur), il faudrait encore dédier un certain temps tout en évitant les régressions. Alors que, grâce à Docker, il suffit de créer un fichier docker-compose.yml pour définir les différentes versions dans notre environnement.

Contenu du fichier docker-compose.yml

visuel_2

Remarque : Dans le but de rendre le fichier docker-compose.yml le plus générique possible, il est possible de définir des variables comme par exemple ${PROJECT_NAME} et les valeurs de ces variables seront renseignées par projet dans le fichier .env situé au même niveau. On peut ainsi gérer une activité de manière homogène sur l’ensemble des projets et environnements.

 

Contenu du fichier .env

visuel_3

Dans le fichier docker-compose.yml, on a défini les services suivants :

 

Service Web

visuel4

Le service web, container contenant Apache, php et les modules php nécessaires, a été construit à partir de l’image “php:7.2-apache” qui se télécharge automatiquement à partir du repository docker. Une fois récupérée, on peut l’enrichir avec les packages manquants ou nécessaires à notre projet.

A noter que la seule commande exécutée lors de la mise en place de cette architecture est la commande :

docker-compose up

La mention ‘build:docker/apache’ qu’on retrouve dans la définition du service fait qu’une image est construite à partir d’un fichier “Dockerfile”, lui-même présent dans le dossier “docker/apache”.

Au début de ce fichier, on trouve les lignes suivantes :

visuel5

Concrètement, docker-compose va chercher l’image “php:7.2-apache” puis installer composer.

Ainsi, le changement de version est grandement facilité puisqu’il suffit de remplacer la ligne :

FROM php:7.2-apache

Par 

FROM php:7.3-apache

Et lancer la commande : docker-compose build && docker-compose up

 

Service db

visuel6

Ce bloc d’instruction cherche l’image mysql avec sa version 5.7 du repository docker et charge une configuration personnalisée stockée dans le fichier “docker/db/custom.cnf”. Ce mécanisme de partage de fichiers entre la machine hôte et le conteneur est possible grâce aux volumes. Il permet la persistance des données issues de la base de données.

 

Service Phpmyadmin

visuel7

Ce service est basé sur l’image phpmyadmin, disponible directement dans le docker hub.

On déclare que ce service dépendra du container db (mysql)

depends_on:

  • db

On définit le port d’écoute du service dans le service web avec la commande suivante :

ports:

  • 8083:80

Ainsi, si on souhaite accéder à phpmyadmin, il suffit de visiter l’adresse http://localhost:8083

Enfin, on définit les variables d’environnements du conteneur phpmyadmin :

PMA_HOST : nom du conteneur de base de données (db).

PMA_USER : utilisateur de la base de données défini dans le conteneur db.

PMA_PASSWORD : mot de passe associé.

Une fois tous les services chargés grâce à la commande docker-compose up, il est possible d’accéder à notre application Drupal 8 en visitant l’URL : http://localhost:8082   

Docker est donc un outil incontournable pour mettre en place rapidement des environnements de développements. Le comparatif avec la virtualisation classique prouve que Docker est de loin un outil adapté pour des montages d’environnements robustes et optimisés.

À l’aide de docker-compose, il est possible de créer et exécuter facilement des conteneurs avec une simple définition de fichier. La multitude des images disponibles sur le repository docker et l’extensibilité du contexte Docker rend ce dernier difficilement remplaçable en l’état actuel, faut-il encore lui trouver des concurrents sérieux.

 

Aussi, n’hésitez pas à découvrir notre offre Drupal.

Parlons ensemble de vos projets.

contact