MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment déployer le serveur MariaDB sur un conteneur Docker

De nos jours, des termes comme Docker, Images ou Conteneurs sont assez courants dans tous les environnements de base de données, il est donc normal de voir un serveur MariaDB s'exécuter sur Docker dans les configurations de production et hors production. Il est possible, cependant, que même si vous avez entendu les termes, vous connaissiez maintenant les différences entre eux. Dans ce blog, nous fournissons un aperçu de ces termes et comment nous pouvons les appliquer dans la pratique pour déployer un serveur MariaDB.

Qu'est-ce que Docker ?

Docker est l'outil le plus courant pour créer, déployer et exécuter des applications à l'aide de conteneurs. Il vous permet de regrouper une application avec toutes les parties dont elle a besoin (telles que des bibliothèques et d'autres dépendances) et de l'expédier dans un seul package, permettant le partage portable de conteneurs sur différentes machines.

Conteneur vs machine virtuelle

Qu'est-ce qu'une image ?

Ressources associées ClusterControl et Docker Série de blogs MySQL sur Docker MySQL sur Docker - Comment conteneuriser votre base de données

Une image est comme un modèle de machine virtuelle. Il contient toutes les informations requises pour exécuter le conteneur. Cela inclut le système d'exploitation, les packages logiciels, les pilotes, les fichiers de configuration et les scripts d'assistance... le tout regroupé dans un seul ensemble.

Une image Docker peut être créée par toute personne ayant la capacité d'écrire un script. C'est pourquoi de nombreuses images similaires sont construites par la communauté, chacune avec des différences mineures... mais servant un objectif commun.

Qu'est-ce qu'un conteneur Docker ?

Un conteneur Docker est une instance d'une image Docker. Il s'exécute complètement isolé de l'environnement hôte par défaut, n'accédant aux fichiers et ports hôtes que s'il est configuré pour le faire.

Un conteneur peut être considéré comme une machine virtuelle, mais au lieu de créer un système d'exploitation virtuel complet, il permet aux applications d'utiliser le même noyau Linux que le système sur lequel elles s'exécutent. Il nécessite uniquement que les applications soient livrées avec des composants qui ne s'exécutent pas déjà sur l'ordinateur hôte. Cela vous donne une amélioration significative des performances et réduit la taille de l'application.

Gardez à l'esprit que toutes les modifications apportées au conteneur sont enregistrées sur une couche distincte, et non dans la même image Docker. Cela signifie que si vous supprimez le conteneur ou si vous en créez un nouveau basé sur la même image Docker, les modifications ne seront pas là. Pour conserver les modifications, vous devez les valider dans une nouvelle image Docker ou créer un fichier Docker.

Qu'est-ce qu'un DockerFile ?

Un DockerFile est un script utilisé pour générer une image Docker où vous avez les étapes pour la générer en fonction des modifications que vous souhaitez appliquer.

Composants Docker

Voyons un exemple de fichier Docker.

$ vi Dockerfile
# MariaDB 10.3 with SSH
# Pull the mariadb latest image
FROM mariadb:latest
# List all the packages that we want to install
ENV PACKAGES openssh-server openssh-client
# Install Packages
RUN apt-get update && apt-get install -y $PACKAGES
# Allow SSH Root Login
RUN sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
# Configure root password
RUN echo "root:root123" | chpasswd

Maintenant, nous pouvons créer une nouvelle image Docker à partir de ce fichier Docker :

$ docker build --rm=true -t severalnines/mariadb-ssh .

Vérifiez la nouvelle image créée :

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
severalnines/mariadb-ssh                   latest              a8022951f195        17 seconds ago      485MB

Et maintenant, nous pouvons utiliser la nouvelle image comme image Docker commune, comme nous le verrons dans la section suivante.

Guide DevOps de la gestion des bases de données de ManyninesDécouvrez ce que vous devez savoir pour automatiser et gérer vos bases de données open sourceTélécharger gratuitement

Comment déployer MariaDB sur Docker sans Dockerfile

Maintenant que nous en savons plus sur le monde Docker, voyons comment l'utiliser pour créer un serveur MariaDB. Pour cela, nous supposerons que Docker est déjà installé.

Nous pouvons utiliser l'image créée à l'aide du Dockerfile, mais nous extrairons l'image Docker MariaDB officielle.

$ docker search mariadb
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mariadb                                MariaDB is a community-developed fork of MyS…   2804                [OK]

Sans spécifier de TAG, par défaut, il extrait la dernière version de l'image, dans ce cas, MariaDB Server 10.3 sur Ubuntu 18.04.

$ docker pull mariadb

Nous pouvons vérifier l'image téléchargée.

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
mariadb                                    latest              e07bb20373d8        2 weeks ago         349MB

Ensuite, nous allons créer deux répertoires sous notre répertoire MariaDB Docker, un pour le datadir et un autre pour les fichiers de configuration de MariaDB. Nous ajouterons les deux sur notre MariaDB Docker Container.

$ cd ~/Docker
$ mkdir datadir
$ mkdir config

La configuration de démarrage est spécifiée dans le fichier /etc/mysql/my.cnf et inclut tous les fichiers trouvés dans le répertoire /etc/mysql/conf.d qui se terminent par .cnf.

$ tail -1 /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/

Le contenu de ces fichiers remplacera tout paramètre répété configuré dans /etc/mysql/my.cnf, vous pouvez donc créer une configuration alternative ici.

Exécutons notre premier conteneur Docker MariaDB :

$ docker run -d --name mariadb1 \
-p 33061:3306 \
-v ~/Docker/mariadb1/config:/etc/mysql/conf.d \
-v ~/Docker/mariadb1/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dbtest \
mariadb

Après cela, nous pouvons vérifier nos conteneurs en cours d'exécution :

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES
12805cc2d7b5        mariadb             "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:33061->3306/tcp   mariadb1

Le journal du conteneur :

$ docker logs mariadb1
MySQL init process done. Ready for start up.
2019-06-03 23:18:01 0 [Note] mysqld (mysqld 10.3.15-MariaDB-1:10.3.15+maria~bionic) starting as process 1 ...
2019-06-03 23:18:01 0 [Note] InnoDB: Using Linux native AIO
2019-06-03 23:18:01 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-06-03 23:18:01 0 [Note] InnoDB: Uses event mutexes
2019-06-03 23:18:01 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-06-03 23:18:01 0 [Note] InnoDB: Number of pools: 1
2019-06-03 23:18:01 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-06-03 23:18:01 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
2019-06-03 23:18:01 0 [Note] InnoDB: Completed initialization of buffer pool
2019-06-03 23:18:01 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-06-03 23:18:01 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-06-03 23:18:01 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-06-03 23:18:01 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-06-03 23:18:02 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-06-03 23:18:02 0 [Note] InnoDB: Waiting for purge to start
2019-06-03 23:18:02 0 [Note] InnoDB: 10.3.15 started; log sequence number 1630824; transaction id 21
2019-06-03 23:18:02 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-06-03 23:18:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-06-03 23:18:02 0 [Note] Server socket created on IP: '::'.
2019-06-03 23:18:02 0 [Note] InnoDB: Buffer pool(s) load completed at 190603 23:18:02
2019-06-03 23:18:02 0 [Note] Reading of all Master_info entries succeded
2019-06-03 23:18:02 0 [Note] Added new Master_info '' to hash table
2019-06-03 23:18:02 0 [Note] mysqld: ready for connections.
Version: '10.3.15-MariaDB-1:10.3.15+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

Et le contenu de notre chemin Docker datadir (hôte) :

$ ls -l ~/Docker/mariadb1/datadir/
total 249664
-rw-rw----   1 sinsausti  staff     16384 Jun  3 20:18 aria_log.00000001
-rw-rw----   1 sinsausti  staff        52 Jun  3 20:18 aria_log_control
drwx------   3 sinsausti  staff        96 Jun  3 20:18 dbtest
-rw-rw----   1 sinsausti  staff       976 Jun  3 20:18 ib_buffer_pool
-rw-rw----   1 sinsausti  staff  50331648 Jun  3 20:18 ib_logfile0
-rw-rw----   1 sinsausti  staff  50331648 Jun  3 20:17 ib_logfile1
-rw-rw----   1 sinsausti  staff  12582912 Jun  3 20:18 ibdata1
-rw-rw----   1 sinsausti  staff  12582912 Jun  3 20:18 ibtmp1
-rw-rw----   1 sinsausti  staff         0 Jun  3 20:17 multi-master.info
drwx------  92 sinsausti  staff      2944 Jun  3 20:18 mysql
drwx------   3 sinsausti  staff        96 Jun  3 20:17 performance_schema
-rw-rw----   1 sinsausti  staff     24576 Jun  3 20:18 tc.log

Nous pouvons accéder au conteneur MariaDB en exécutant la commande suivante et en utilisant le mot de passe spécifié dans la variable MYSQL_ROOT_PASSWORD :

$ docker exec -it mariadb1 bash
[email protected]:/# mysql -p -e "SHOW DATABASES;"
Enter password:
+--------------------+
| Database           |
+--------------------+
| dbtest             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Ici, nous pouvons voir notre dbtest créé.

Commandes Docker

Enfin, voyons quelques commandes utiles pour gérer Docker.

  • Recherche d'images
    $ docker search Image_Name
  • Télécharger l'image
    $ docker pull Image_Name
  • Liste des images installées
    $ docker images
  • Liste des conteneurs (en ajoutant le drapeau -a on peut voir aussi les conteneurs arrêtés)
    $ docker ps -a
  • Supprimer une image Docker
    $ docker rmi Image_Name
  • Supprimer un conteneur Docker (le conteneur doit être arrêté)
    $ docker rm Container_Name
  • Exécutez un conteneur à partir d'une image Docker (en ajoutant le drapeau -p, nous pouvons mapper un port de conteneur sur localhost)
    $ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
  • Arrêter le conteneur
    $ docker stop Container_Name
  • Démarrer le conteneur
    $ docker start Container_Name
  • Vérifier les journaux du conteneur
    $ docker logs Container_Name
  • Vérifier les informations sur le conteneur
    $ docker inspect Container_Name
  • Créer un conteneur lié
    $ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
  • Se connecter à un conteneur depuis localhost
    $ docker exec -it Container_Name bash
  • Créer un conteneur avec le volume ajouté
    $ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
  • Valider les modifications sur une nouvelle image
    $ docker commit Container_ID Image_Name:TAG

Conclusion

Docker est un outil vraiment utile pour partager facilement un environnement de développement en utilisant un Dockerfile ou en publiant une image Docker. En l'utilisant, vous pouvez vous assurer que tout le monde utilise le même environnement. En même temps, il est également utile de recréer ou de cloner un environnement existant. Docker peut partager des volumes, utiliser des réseaux privés, mapper des ports et bien plus encore.

Dans ce blog, nous avons vu comment déployer MariaDB Server sur Docker en tant que serveur autonome. Si vous souhaitez utiliser un environnement plus complexe comme Replication ou Galera Cluster, vous pouvez utiliser bitnami/mariadb pour réaliser cette configuration.