Dockerfile et Docker Compose

10 – Le combo Dockerfile et Docker Compose

Pour ce chapitre, nous utiliserons l’étude de cas que celle utilisés dans le chapitre précédent. Par conséquent, une stack LAMP qui éxecutera WordPress. Nous aurons un Dockerfile par conteneur et nous intégrerons Docker Compose pour orchestrer notre application.

Combo Dockerfile et Docker Compose

Création d’un répertoire de travail

Pour ce projet, nous créer un nouveau répertoire sur notre machine hôte, puis nous allons nous y rendre.

[root@docker ~]# mkdir /home/stack-lamp-compose-dockerfile
[root@docker ~]# cd /home/stack-lamp-compose-dockerfile

Création du Dockerfile pour MariaDB

Dans ce répertoire nous créerons notre premier dockerfile pour le conteneur « mariadb ».

[root@docker stack-lamp-compose-dockerfile]# vi dockerfile-mariadb
Contenu du dockerfile MariaDB
# Utilisez l'image officielle MariaDB
FROM mariadb:latest
# Définir les variables d'environnement
ENV MYSQL_ROOT_PASSWORD=p@ssw0rd1 \
MYSQL_DATABASE=wordpress \
MYSQL_USER=wordpress_user \
MYSQL_PASSWORD=p@ssw0rd1
# Copiez le script d'initialisation
COPY init.sql /docker-entrypoint-initdb.d/
# Exposez le port 3306 pour MariaDB
EXPOSE 3306

Dans ce dockerfile, nous allons copier un fichier « init.sql », ce fichier que nous allons créer contiendras les requêtes SQL :

  • Création de la base de données
  • Création de l’utilisateur
  • La gestion des droits de l’utilisateur sur la base de données
[root@docker stack-lamp-compose-dockerfile]# vi init.sql

Contenu init.sql

CREATE DATABASE IF NOT EXISTS wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress_user'@'%' IDENTIFIED BY 'p@ssw0rd1';
FLUSH PRIVILEGES;

Ce script sql devra avoir le droit en exécution.

[root@docker stack-lamp-compose-dockerfile]# chmod +x init.sql

Création du Dockerfile pour MariaDB

Nous créerons également le Dockerfile pour le serveur web et WordPress.

[root@docker stack-lamp-compose-dockerfile]# vi dockerfile-wordpress

Contenu du Dockerfile WordPress

# Utilisez l'image Ubuntu la plus récente
FROM ubuntu:latest
# Mises à jour et installations nécessaires
RUN apt-get update \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get install -y apache2 php libapache2-mod-php php-mysql mysql-client php-gd php-curl php-zip php-mbstring php-xml wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
&& cd /var/www/html/
&& rm index.html
# Télécharger et configurer WordPress
RUN cd /var/www/html && \
wget https://wordpress.org/latest.tar.gz && \
tar -xzvf latest.tar.gz --strip-components=1 && \
rm latest.tar.gz && \
mv wp-config-sample.php wp-config.php && \
sed -i 's/database_name_here/wordpress/g' wp-config.php && \
sed -i 's/username_here/wordpress_user/g' wp-config.php && \
sed -i 's/password_here/p@ssw0rd1/g' wp-config.php && \
sed -i 's/localhost/mariadb-server/g' wp-config.php && \
chown -R www-data:www-data /var/www/html
# Attribue une adresse IP au serveur web
CMD ["apache2ctl", "-D", "FOREGROUND"]
# Expose le port 80 pour Apache
EXPOSE 80

Nous créerons le fichier Docker-Compose qui s’appuiera sur les deux Dockerfile que nous avons créé.

version: '3.8'
services:
# Service pour le serveur web Apache
web-server:
container_name: wp
build:
context: .
dockerfile: dockerfile-wordpress
depends_on:
- mariadb-server
ports:
- "80:80"
# Service pour la base de données MariaDB
mariadb-server:
container_name: mariadb-server
build:
context: .
dockerfile: dockerfile-mariadb

Déploiement de conteneur en s’appuyant sur Dockerfiles et Docker Compose

Nous pouvons tester que notre déploiement de WordPress est maintenant fonctionnel.

[root@docker stack-lamp-compose-dockerfile]# docker-compose up -d

Depuis un navigateur, nous allons tenter de nous connecter à notre serveur WEB.

L’approche qui combine Docker Compose et Dockerfiles segmente le travail de développement et de déploiement d’applications en conteneurs. En effet, cette segmentation introduit une séparation claire des responsabilités à plusieurs niveaux.

Tout d’abord, les Dockerfiles décrivent en détail la construction des images de conteneurs. Ainsi, les développeurs définissent les dépendances, les configurations et les étapes d’installation spécifiques à chaque composant de l’application. Grâce à cette séparation des préoccupations, les développeurs peuvent se concentrer sur la construction et la maintenance des images conteneurs, sans avoir à gérer la configuration des environnements de déploiement.

En parallèle, Docker Compose intervient au niveau de la composition et de la gestion de l’ensemble de l’application. En effet, les opérations d’orchestration des conteneurs, la gestion des réseaux et la coordination entre les services sont encapsulées dans le fichier docker-compose.yml. De cette manière, les équipes opérationnelles peuvent se concentrer sur la gestion des aspects liés au déploiement global de l’application, en utilisant une configuration déclarative simplifiée.

Cette segmentation du travail permet donc une collaboration plus fluide entre les équipes de développement et d’exploitation. Les développeurs créent des environnements conteneurisés spécifiques à leurs applications, tandis que les opérations prennent en charge l’orchestration et la gestion des déploiements à grande échelle. En résumé, Docker Compose et Dockerfiles encouragent une approche modulaire et efficace du développement et du déploiement d’applications en conteneurs.