Création du conteneur
docker-compose.yml avec
image: mariadb
container_name: "my-db-container"
Variables d’environnement
environment:
MARIADB_ROOT_PASSWORD=blabla1
MARIADB_USER=myuser
MARIADB_PASSWORD=blabla2
MARIADB_DATABASE=my-database
Vont respectivement définir le mot de passe root, créer un user avec un password, et créer une base de données.
Le user créé pourra se connecter depuis n’importe quel hôte, et aura les droits complets sur la base créée.
J’ai l’impression qu’elles ne sont utilisées que si aucune base de données (volume) n’existe déjà. Par la suite, elles n’ont aucun effet.
Configuration
Les fichiers de configuration, à l’intérieur du conteneur, donc dans
/etc/mysql/
/etc/mysql/my.cnf
est un lien vers /etc/alternatives/my.cnf
qui est un lien vers /etc/mysql/mariadb.cnf
.
On peut lister les options en SQL :
SHOW VARIABLES;
Si on connaît le nom de l’option que l’on cherche on peut faire
SHOW VARIABLES LIKE 'my_config_option';
On peut aussi utiliser le wildcard %
:
SHOW VARIABLES LIKE '%option%';
Résolution des noms
Par défaut, la résolution des noms est désactivée dans la configuration MariaDB du conteneur Docker, via la directive skip-name-resolve
présente dans le fichier /etc/mysql/mariadb.conf.d/05-skipcache.cnf
.
La raison à ceci semble être que le résolveur DNS d’un conteneur est défini uniquement au moment de sa création, et s’il change, le conteneur ne recevra pas les nouvelles informations et n’aura plus de DNS disponible, ce qui ralentira considérablement les requêtes DNS.
Ceci empêche toutefois d’utiliser une syntaxe de type user@conteneur.network
pour autoriser les connexions à la base.
Pour changer ce comportement, on peut monter un fichier vide à l’emplacement du fichier de conf :
volumes:
- ./config/empty.cnf:/etc/mysql/mariadb.conf.d/05-skipcache.cnf
Connexion à l’interface SQL du conteneur
docker exec -it docker-db mariadb --user root -pblabla1
On arrive sur un shell type
MariaDB [(selected-database)]
Aucune base n’étant initialement sélectionnée, on a
MariaDB [(none)]
On peut directement fournir la commande à exécuter avec
-e 'COMMAND;'
Voir la version
Sur le shell SQL :
SELECT VERSION() ;
Caractères spéciaux
Éviter les points ou tirets. underscore OK.
Si besoin quand même, échapper avec backtick `
Gestion des bases de données
voir les différents bases :
SHOW DATABASES;
Créer une base :
CREATE DATABASE my_database;
Choisir une base pour l’usage courant :
USE my_database;
Supprimer une DB et toutes les tables dedans :
DROP DATABASE my_database;
Gestion des users
Créer un user et restreindre l’accès depuis un domaine :
CREATE USER 'myuser'@'authorizeddomain' IDENTIFIED BY 'my-password'
Si on ne spécifie pas de “authorizeddomain”, alors ce sera %
, ce qui semble signifier “tous”.
Lister les users et le(s) domaines qui autorisent leur accès :
SELECT user,host FROM mysql.user;
Ceci va lire le contenu de la table “user” de la base “mysql” (base créée automatiquement au déploiement de MariaDB).
Supprimer un user, ou un accès :
DROP USER 'myuser'@'authorizeddomain';
Si on ne spécifie pas de “@authorizeddomain”, il va supprimer ‘user’@’%’
Voir les permissions d’un utilisateur :
SHOW GRANTS for myuser;
Ajouter des droits complets à un utilisateur :
GRANT ALL ON my_database.* TO 'my-user'@'authorizeddomain';
Les apostrophes semblent poser problème sur le nom de la base de données.
Bien ajouter le .*
car les privilèges s’appliquent aux tables.
Gestion des tables
Voir les tables d’une base :
SHOW TABLES;
# si DB déjà selectionnée
SHOW TABLES FROM my-database;
# si pas encore sélectionnée