Créer son environnement de développement LAMP grâce à Docker Compose

Magazine
Marque
Linux Pratique
Numéro
111
Mois de parution
janvier 2019
Spécialité(s)


Résumé

Il est souvent chose ardue de maintenir son environnement de développement. Lors d’un travail d’équipe, on doit aussi s’assurer que tous les développeurs ont le même environnement. Aujourd’hui, les conteneurs offrent une solution élégante à ces problèmes récurrents. Nous allons voir dans cet article comment mettre en œuvre un environnement de développement LAMP (Linux+Apache+MySQL+PHP) à l’aide de Docker Compose.


Body

Grâce aux conteneurs, je suis sûr de pouvoir reproduire exactement le même environnement. Pour mon environnement de développement, je vais avoir besoin de plusieurs conteneurs : un conteneur pour PHP qui hébergera mon code, un conteneur pour ma base de données MySQL et un dernier conteneur pour PHPMyAdmin pour administrer ma base de données. Docker Compose me permet de décrire simplement ces conteneurs ainsi que leurs relations.

architecture

1. Environnement de développement cible

Avant toutes choses, il faut définir parfaitement l’environnement que l’on souhaite créer. Dans cet article, nous allons essayer de nous rapprocher au maximum de l’environnement du fournisseur OVH (offre mutualisée) incluant PHP & MySQL. Cela nous permettra de développer notre application localement et de la déployer ensuite chez OVH.

Voici donc la liste des conteneurs que nous souhaitons créer :

  • un conteneur PHP7 : conteneur le plus complexe à créer, car il doit est au plus proche de l’environnement OVH ;
  • un conteneur MySQL : la version de la base de données pourra être plus à jour que celle d’OVH ;
  • un conteneur PHPMyAdmin : conteneur pour le confort d’administration de la base de données.

Pour décrire la configuration de ces différents conteneurs ainsi que leur interaction, Docker Compose se base sur un fichier de configuration au format YAML. Voici le squelette que nous allons utiliser (fichier docker-compose.yml) :

# Conteneur PHP nommé php

php:

# Description du conteneur

# Conteneur MySQL nommé db (database)

db:

# Description du conteneur

# Conteneur PhpMyAdmin nommé phpmyadmin

phpmyadmin:

# Description du conteneur

Nous allons aborder les conteneurs les uns après les autres du plus simple au plus complexe : db, phpmyadmin, php.

2. Le conteneur MySQL

Voici la description du conteneur db :

db:

image: mysql

environment:

MYSQL_ROOT_PASSWORD: Secret

MYSQL_DATABASE: mydb

MYSQL_USER: mydb_user

MYSQL_PASSWORD: mydb_password

volumes:

- /home/article/docker/ovh/mysqld_charset.cnf:/etc/mysql/conf.d/mysqld_charset.cnf

Examinons les mots-clés suivants : image, environment et volumes.
Tout d’abord, image permet de créer notre conteneur à l’aide de l’image officielle mysql sur le hub docker [1].
Pour que notre base de données MySQL fonctionne correctement, il faut un certain nombre d’informations telles que le mot de passe administrateur, le nom de la base à créer, ainsi qu’un utilisateur/mot de passe. C’est ce que nous permet la section environment avec les variables d’environnement MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD. On retrouve la description de ces variables dans la documentation officielle [1].

Cela pourrait suffire, mais pour être compatible avec l’environnement OVH, il faut que l’encodage des caractères au niveau de la base soit uft8, ce qui n’est pas le cas par défaut. C’est l’objet du mot-clef volumes qui permet d’exporter des fichiers ou répertoires du système de fichiers local (dans notre cas, /home/article/docker/ovh/mysqld_charset.cnf) vers le conteneur (dans notre cas, /etc/mysql/conf.d/mysqld_charset.cnf).

Voici le contenu du fichier de configuration mysql mysqld_charset.cnf :

[mysqld]

character_set_server=utf8

character_set_filesystem=utf8

collation-server=utf8_general_ci

init-connect='SET NAMES utf8'

init_connect='SET collation_connection = utf8_general_ci'

skip-character-set-client-handshake

3. Le conteneur PhpMyAdmin

Voici la description du conteneur phpmyadmin :

phpmyadmin:

image: phpmyadmin/phpmyadmin

links:

- db

ports:

- 8181:80

environment:

MYSQL_USERNAME: root

MYSQL_ROOT_PASSWORD: Secret

La section image nous permet de créer un conteneur avec l’image officielle de PhpMyAdmin [2].

La section environment nous permet de définir l’utilisateur et le mot de passe de l’administrateur MySQL. Attention de bien mettre les mêmes informations que dans le conteneur db.

La section links nous permet de relier le conteneur à notre conteneur base de données. En effet, le conteneur phpmyadmin a besoin de connaître la localisation de la base (dans notre cas, le conteneur db).

Pour finir, la section ports permet de lier notre conteneur à notre machine locale. Le premier paramètre est le port local (ici 8181), le second paramètre est le port dans le conteneur (ici 80). Nous pourrons donc accéder à PhpMyAdmin en tapant l’url : http://localhost:8181.

4. Le conteneur PHP

Voici la description du conteneur php :

php:

build: ./engine/php_server/

ports:

- 80:80

volumes:

- /home/article/docker/ovh/www/html:/var/www/html

links:

- db

dns:

- 208.67.222.222

- 208.67.220.220

Un gros changement pour commencer, le mot-clé build est à la place d’image. En effet, build va nous permettre de configurer plus finement notre image docker, c’est ce que nous verrons en détail ultérieurement.

La section port nous permet d’accéder au port 80 de notre conteneur en utilisant le port local 80 (on suppose ici que le port est disponible). Nous pourrons donc accéder à notre conteneur PHP en tapant l’url : http://localhost.

Nous allons développer dans le répertoire : /home/article/docker/ovh/www/html, on va donc exporter ce répertoire local vers le répertoire hébergeant le contenu web de notre conteneur php : /var/www/html, c’est ce qui est fait ici dans la section volumes.

Notre programme PHP devra accéder à la base de données, pour ce faire, on utilisera le nom de machine db. La section links nous permet cela.

Pour finir, la section dns nous permet de définir les serveurs DNS utilisés au sein du conteneur, ici nous utiliserons les serveurs OpenDNS : 208.67.222.222, 208.67.220.220.

5. Configuration avancée du conteneur PHP

Dans la définition du conteneur php, nous avons écrit : build: ./engine/php_server/.
Cela signifie que nous voulons utiliser un fichier Dockerfile situé dans le répertoire : ./engine/php_server/. Voici le contenu de ce fichier :

FROM php:7.1-apache

RUN apt-get update \

&& apt-get install -y \

libpng-dev \

aptitude \

libfreetype6-dev \

libjpeg62-turbo-dev \

libmcrypt-dev \

libbz2-dev \

libgmp-dev \

libzip-dev \

libc-client-dev \

libkrb5-dev \

libpspell-dev \

libmagickwand-dev \

libxslt-dev --no-install-recommends \

&& rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ \

--with-jpeg-dir=/usr/include/

RUN docker-php-ext-install -j$(nproc) \

mysqli exif mbstring zip dba bz2 calendar bcmath gettext gmp intl pdo pdo_mysql pspell gd \

imap iconv mcrypt soap sockets sysvmsg sysvsem sysvshm wddx xmlrpc xsl

RUN pecl install imagick && docker-php-ext-enable imagick

RUN pecl install -o -f redis \

&& rm -rf /tmp/pear \

&& docker-php-ext-enable redis

RUN a2enmod rewrite

Regardons un peu notre fichier de configuration Docker.
nous permet de sélectionner l’image docker à personnaliser, ici php:7.1-apache [3].

Une fois l’image téléchargée localement, nous allons la personnaliser. Le mot-clé RUN nous permet d’exécuter des commandes au sein du conteneur, regardons nos différentes commandes :

  • apt-get update : mise à jour des packages ;
  • apt-get install -y --no-install-recommends : installation des packages sans les recommandations ;
  • docker-php-ext-* : commandes internes au conteneur PHP permettant la configuration, l’installation, l’activation d’extensions PHP [3] ;
  • pecl install : installation d’extensions PHP ;
  • a2enmod : activation de module apache.

6. Démarrage et vérification des conteneurs

Une fois notre configuration effectuée, il faut démarrer les conteneurs :

$ sudo docker-compose up

Il faut être patient, car Docker Compose va télécharger les images Docker à partir du Hub Docker.
Une fois les images présentes, le démarrage des conteneurs phpmyadmin et db démarrent rapidement.
Pour le conteneur php, c’est plus long, cela est dû à notre personnalisation.

Pour arrêter nos trois conteneurs, il suffit de taper <ctrl>-c dans notre terminal.

Pour relancer les conteneurs, on relance la même commande :

$ sudo docker-compose up

On peut à l’aide des commandes Docker vérifier que tout fonctionne :

sudo docker ps

 

CONTAINER ID IMAGE                  COMMAND                CREATED      STATUS         PORTS                 NAMES

0094bc324ab4 phpmyadmin/phpmyadmin  "/run.sh phpmyadmin"   6 hours ago  Up 28 minutes  0.0.0.0:8181->80/tcp  ovh_phpmyadmin_1

012f6f125a5d ovh_php                "docker-php-entryp..." 6 hours ago  Up 28 minutes  0.0.0.0:80->80/tcp    ovh_php_1

841469a3623f mysql                  "docker-entrypoint..." 6 hours ago  Up 28 minutes  3306/tcp              ovh_db_1

Les CONTAINER ID sont générés par Docker, les vôtres seront probablement différents.

Conclusion

Dans cet article, nous avons vu comment décrire un environnement de développement PHP basé sur plusieurs conteneurs Docker à l’aide de Docker Compose. Cet environnement se rapproche très fortement de l’environnement de production offre mutualisée d’OVH.

Nous pouvons constater les différences entre notre environnement Docker Compose et l’environnement OVH avec le fichier /home/article/docker/ovh/www/html/infos.php :

<?php

phpinfo()

?>

Nous pouvons désormais très facilement distribuer notre environnement en étant sûrs qu’il sera recréé à l’identique.

Références

[1] Page officielle du conteneur MySQL sur le Hub Docker : https://hub.docker.com/_/mysql/

[2] Page officielle du conteneur PhpMyAdmin sur le Hub Docker : https://hub.docker.com/r/phpmyadmin/phpmyadmin/

[3] Page officielle du conteneur PHP sur le Hub Docker : https://hub.docker.com/_/php/



Article rédigé par

Par le(s) même(s) auteur(s)

Contrôler vos modèles LEGO Powered Up au Nunchuk à l'aide de votre Arduino

Magazine
Marque
Hackable
Numéro
33
Mois de parution
avril 2020
Spécialité(s)
Résumé

Dans cet article, nous allons voir comment piloter un robot LEGO Powered Up à l’aide d’un Nintendo Nunchuk, grâce à un Arduino. Nous allons installer les librairies nécessaires pour pouvoir piloter notre modèle Powered Up et accéder aux informations du Nunchuk. Nous développerons ensuite notre programme de contrôle en C.

Auto-héberger son agenda avec Baïkal

Magazine
Marque
Linux Pratique
HS n°
Numéro
46
Mois de parution
octobre 2019
Spécialité(s)
Résumé

Il est très utile de pouvoir avoir un calendrier partagé accessible à tout moment sur toute sorte de clients : PC, tablette, téléphone... La solution la plus simple est souvent d’utiliser Google Calendar. Dans cet article, nous allons voir qu’il n’est pas si compliqué d’héberger soi-même un calendrier partagé à l’aide de Baïkal. Nous aborderons l’installation et la configuration de Baïkal. Pour finir, nous découvrirons la configuration des clients Thunderbird, Android et iOS.

Contrôler vos modèles Lego PoweredUp au Joypad à l'aide de votre Raspberry Pi

Magazine
Marque
Hackable
Numéro
30
Mois de parution
juillet 2019
Spécialité(s)
Résumé

Dans cet article, nous allons voir comment piloter un robot Lego PoweredUp à l’aide d’un JoyPad, grâce à un Raspberry Pi. Nous allons installer tout le nécessaire sur notre Raspberry Pi pour pouvoir piloter notre modèle Lego PoweredUp. Nous utiliserons NodeJS, donc le langage JavaScript, pour piloter notre modèle Lego.

Les derniers articles Premiums

Les derniers articles Premium

La place de l’Intelligence Artificielle dans les entreprises

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

L’intelligence artificielle est en train de redéfinir le paysage professionnel. De l’automatisation des tâches répétitives à la cybersécurité, en passant par l’analyse des données, l’IA s’immisce dans tous les aspects de l’entreprise moderne. Toutefois, cette révolution technologique soulève des questions éthiques et sociétales, notamment sur l’avenir des emplois. Cet article se penche sur l’évolution de l’IA, ses applications variées, et les enjeux qu’elle engendre dans le monde du travail.

Petit guide d’outils open source pour le télétravail

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Ah le Covid ! Si en cette période de nombreux cas resurgissent, ce n’est rien comparé aux vagues que nous avons connues en 2020 et 2021. Ce fléau a contraint une large partie de la population à faire ce que tout le monde connaît sous le nom de télétravail. Nous avons dû changer nos habitudes et avons dû apprendre à utiliser de nombreux outils collaboratifs, de visioconférence, etc., dont tout le monde n’était pas habitué. Dans cet article, nous passons en revue quelques outils open source utiles pour le travail à la maison. En effet, pour les adeptes du costume en haut et du pyjama en bas, la communauté open source s’est démenée pour proposer des alternatives aux outils propriétaires et payants.

Sécurisez vos applications web : comment Symfony vous protège des menaces courantes

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Les frameworks tels que Symfony ont bouleversé le développement web en apportant une structure solide et des outils performants. Malgré ces qualités, nous pouvons découvrir d’innombrables vulnérabilités. Cet article met le doigt sur les failles de sécurité les plus fréquentes qui affectent même les environnements les plus robustes. De l’injection de requêtes à distance à l’exécution de scripts malveillants, découvrez comment ces failles peuvent mettre en péril vos applications et, surtout, comment vous en prémunir.

Bash des temps modernes

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Les scripts Shell, et Bash spécifiquement, demeurent un standard, de facto, de notre industrie. Ils forment un composant primordial de toute distribution Linux, mais c’est aussi un outil de prédilection pour implémenter de nombreuses tâches d’automatisation, en particulier dans le « Cloud », par eux-mêmes ou conjointement à des solutions telles que Ansible. Pour toutes ces raisons et bien d’autres encore, savoir les concevoir de manière robuste et idempotente est crucial.

Les listes de lecture

8 article(s) - ajoutée le 01/07/2020
Découvrez notre sélection d'articles pour faire vos premiers pas avec les conteneurs, apprendre à les configurer et les utiliser au quotidien.
11 article(s) - ajoutée le 02/07/2020
Si vous recherchez quels sont les outils du DevOps et comment les utiliser, cette liste est faite pour vous.
8 article(s) - ajoutée le 02/07/2020
Il est essentiel d'effectuer des sauvegardes régulières de son travail pour éviter de perdre toutes ses données bêtement. De nombreux outils sont disponibles pour nous assister dans cette tâche.
Voir les 60 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous