MariaDB via Docker (en dev)

Notre choix de self-hosting de notre SGBDR demande qu'on l'installe sur notre serveur, avec toutes ses dépendances.

Pourquoi pas utiliser Docker pour récupérer une image déjà conçu par les créateurs du SGBDR afin de s'en passer des différentes phases de mise en service.

L'utilisation de Docker présente plusieurs avantages :

  • Toutes les dépendances et détails de l'installation sont déjà pris en compte

  • À l'aide d'un fichier docker-compose.yml, on pourrait partager la même configuration de notre SGBDR entre notre serveur de production, notre déploiement de test (staging), et aussi nos machines de développement. Plus l'environnement de dev ressemble à notre environnement de production, mieux c'est !

  • L'utilisation d'un container ouvre la possibilité à la tolérance des fautes. À l'aide d'un système d'orchestration (Docker Swarm ou Kubernetes) notre SGDBR est plus facilement transférable vers une autre instance ou VM si jamais le matériel tombe en panne. Attention ! Cet avantage ne tient uniquement si le stockage des données est bien géré, par exemple, sur un volume indépendant du container et VM.

Nous utiliserons MariaDB comme DBMS pour ce programme :

  • C’est un fork du projet MySQL Open Source, et maintenu par la communauté

  • Certains features qui sont payants dans MySQL sont gratuits dans MariaDB (ex. cryptographie)

  • En ce qui concerne SQL, MariaDB est identique

Configuration docker-compose.yml

Les créateurs de MariaDB maintiennent une image sur Docker Hub : https://hub.docker.com/_/mariadb

Si on lit bien la documentation, on peut constater un nombre d'options d'initialisation. Pour notre installation, nous allons préciser :

  • Via des variables d'environnement :

    • Le mot de pass de l'utilisateur root

    • Désactiver la possibilité de se connecter sans mots de passe

    • La base de données à utiliser par défaut

  • Où stocker les données, en spécifiant un volume en dehors du Container

  • Spécifier des options de lancement, notamment l'encodage de caractère à utiliser

Ci-dessous un exemple d'un docker-compose.yml pour utilisation en local sur une machine de développement.

docker-compose.yml
version: '3.9'

services:
  mon_sgbdr:
    image: mariadb
    restart: always
    # port-externe (hôte) : port-interne (container)
    ports:
      - "3306:3306"    
    # variables d'environnement à créer dans le container
    environment:      
      - MYSQL_ALLOW_EMPTY_PASSWORD=false
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=myfirstdb
    # options de lancement (encodage)
    command: [
      "--character-set-server=utf8mb4",
      "--collation-server=utf8mb4_unicode_ci",
    ]
    volumes:
      # stocker les données dans un dossier ./dbms-data
      # à coté du fichier docker-compose.yml
      - ./dbms-data:/var/lib/mysql
    networks:
      # Ce service existera sur le réseau virtuel suivant
      - sgbdr-network
      
networks:
  sgbdr-network:
    driver: bridge
    name: sgbdr-network

On peut lancer la base avec la commande, en ouvrant une invite de commandes, en naviguant dans le même dossier que le fichier docker-compose.yml, et en tapant :

docker compose up

Si tout se passe bien, on verra apparaître dans le même dossier que le docker-compose.yml un nouveau répertoire dbms-data

Les données physiques de notre SGBDR sont stockés dans ce dossier.

Le mot de passe du root

Les coordonnées de compte root sont configurés une seule fois à la création du SGBDR, en utilisant la variable d'environnement MYSQL_ROOT_PASSWORD.;

Même si on arrête et relance le container, ce mot de passe n'est plus jamais reconfiguré !

À la première création du SGBDR, si vous êtes trompé de mot de passe, ou dans la rédaction de votre docker-compose.yml, il est possible qu'il faille supprimer le répertoire dbms-data et recommencer.

Dans une nouvelle invite de commandes, on peut vérifier l'existence de notre Container :

docker container ls

Ici, on voit que le Container est bien lancé, qu'il y a un port ouvert sur le numéro 3306.

Contrôle de Docker

Rappelez les commandes pour contrôler Docker :

Pour lancer les services de votre docker-compose :

docker compose up -d

Pour arrêter l'ensemble des services de votre docker-compose, naviguez vers le répertoire contenant le fichier, et ensuite :

docker compose down

Pour ouvrir une séance interactive (ou on peut rédiger les commandes via le clavier) :

docker exec -it [ID DU CONTAINER] [COMMANDE]

# exemples
# docker exec -it [ID DU CONTAINER] mysql -u root -p
# docker exec -it [ID DU CONTAINER] /bin/bash

Pour rediriger les contenus d'un fichier vers un Container, on crée une séance interactive, sans préciser le clavier comme périphérique (dans pas de tty). La commande va lire plutôt le stdin :

docker exec -i [ID DU CONTAINER] mysql -u root -p[mot de passe] myfirstdb < ./ddl.sql

Attention :

  • ;exec -i (sans t !)

  • Je suis obligé de spécifier le mot de passe directement (collé au paramètre-p)

  • Je suis obligé de préciser le nom de la database à utiliser par défaut (ici, myfirstdb)

Dernière mise à jour