Skip to main content

Docker

Introduction à docker

Docker est un logiciel qui permet de créer des conteneurs isolés sur une machine linux. Un conteneur est en général associé à un service. Contrairement à la virtualisation, un conteneur n'est pas un système d'exploitation à part entière, car il s'appuie sur votre système linux pour fonctionner.

Vous allez découvrir le fonctionnement de docker à travers la commande associée.

info

Pour les utilisateurs de windows, vous vous placerez dans la machine WSL Debian pour réaliser les commandes à suivre.

Pour tous, pensez à arrêter les conteneurs déjà en place avec la stack devphplp en faisant un make down.

Mon premier conteneur

Exécutez la commande suivante permettant de créer un conteneur appelé demo_mysql à partir de la dernière image (latest) docker de mysql.

Vous pouvez voir comment cette image a été construite à travers un fichier Dockerfile.

Comme le dit la documentation, on peut passer à ce conteneur des variables d'environnement : ici, nous définissons le mot de passe root de notre base de données.

docker run --name demo_mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

On peut vérifier que le conteneur est bien lancé avec la commande suivante.

docker ps

Fonctionnement de docker

Entrons dans ce conteneur en ouvrant un terminal bash dans celui-ci.

docker exec -it demo_mysql bash

Essayons de comprendre comment fonctionne docker en faisant les commandes suivantes :

  • création d'un dossier
  • connexion au serveur mysql
  • création d'une base de données test
mkdir /test
ls
mysql -uroot -p
show databases;
create database test;
show databases;
exit
exit

Arrêtons le conteneur comme si on faisait un make down ou un docker compose down

docker stop demo_mysql
docker container rm demo_mysql

Relançons le conteneur en retapant les mêmes commandes que précédemment. Affichons les éléments créés.

docker run --name demo_mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
docker exec -it demo_mysql bash
ls
ls /var/lib/mysql

Le dossier test n'existe pas et la base de données test créée à disparu. Elle devrait se trouver dans le dossier /var/lib/mysql.

L'explication est quand un conteneur est lancé, il est basé sur un état de départ.

Lorsqu'on crée un fichier dans le conteneur dans un terminal par exemple, ces modifications sont stockées à côté.

Si le conteneur est arrêté et supprimé (ce que fait make down), le conteneur revient à son état d'origine. Heureusement des solutions existent pour persister les données amenées à être créées. Pour cela, il faut utiliser les volumes.

Les volumes

Un volume est un espace de stockage particulier pour un conteneur. Il peut soit correspondre à :

  • un dossier physique de notre disque dur à l'intérieur de notre projet,
  • un dossier géré uniquement par docker.

Nous allons commencer par descendre le conteneur.

docker stop demo_mysql
docker container rm demo_mysql

Puis, nous allons créer un dossier sur notre machine en local. L'option -p permet de créer toute l'arborescence en une seule commande. Ensuite, remontons le conteneur en lui ajoutant un volume entre notre répertoire local et sa correspondance avec un dossier du conteneur.

mkdir -p devops/data_mysql
docker run --name demo_mysql -v $(pwd)/devops/data_mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

Ici, le dossier de sauvegarde des bases de données mysql (/var/lib/mysql) correspondra au dossier local devops/data_mysql.

Ainsi tout fichier créé dans le dossier du conteneur sera accessible en local et tout fichier créé en local dans le dossier devops/data_mysql sera accessible dans le conteneur.

Connectons-nous à nouveau et recréons la base de données.

docker exec -it demo_mysql bash
mysql -uroot -p
show databases;
create database test;
exit
exit
ls devops/data_mysql

Vous pouvez retrouver tous les fichiers associés à votre base de données dans le dossier devops/data_mysql ainsi que le dossier test associé à la base de données créée existe.

À qui appartiennent ces fichiers ? Nous verrons un peu plus tard la gestion de ces permissions.

warning

Attention, toutes manipulations malencontreuses sur le dossier devops/data_mysql peuvent endommager votre base de données.

Arrêtons proprement le conteneur et relançons-le. Vous verrez que vos données sont bien présentes.

docker stop demo_mysql
docker container rm demo_mysql
docker run --name demo_mysql -v $(pwd)/devops/data_mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
docker exec -it demo_mysql bash
mysql -uroot -p
show databases;
exit
exit