MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

So stellen Sie MariaDB Server in einem Docker-Container bereit

Heutzutage sind Begriffe wie Docker, Images oder Container in allen Datenbankumgebungen weit verbreitet, daher ist es normal, dass ein MariaDB-Server sowohl in Produktions- als auch in Nicht-Produktionsumgebungen auf Docker läuft. Es ist jedoch möglich, dass Sie die Begriffe zwar gehört haben, aber jetzt die Unterschiede zwischen ihnen kennen. In diesem Blog geben wir einen Überblick über diese Begriffe und wie wir sie in der Praxis anwenden können, um einen MariaDB-Server bereitzustellen.

Was ist Docker?

Docker ist das gängigste Tool zum Erstellen, Bereitstellen und Ausführen von Anwendungen mithilfe von Containern. Es ermöglicht Ihnen, eine Anwendung mit allen benötigten Teilen (z. B. Bibliotheken und andere Abhängigkeiten) zu packen und alles als ein Paket zu versenden, was die portable gemeinsame Nutzung von Containern auf verschiedenen Computern ermöglicht.

Container vs. virtuelle Maschine

Was ist ein Bild?

Zugehörige Ressourcen ClusterControl und Docker MySQL auf Docker-Blogserie MySQL auf Docker – How to Containerize Your Database

Ein Image ist wie eine Vorlage für eine virtuelle Maschine. Es verfügt über alle erforderlichen Informationen, um den Container auszuführen. Dazu gehören das Betriebssystem, Softwarepakete, Treiber, Konfigurationsdateien und Hilfsskripte … alles in einem Paket verpackt.

Ein Docker-Image kann von jedem erstellt werden, der die Fähigkeit hat, ein Skript zu schreiben. Aus diesem Grund werden viele ähnliche Images von der Community erstellt, jedes mit geringfügigen Unterschieden ... aber einem gemeinsamen Zweck dienend.

Was ist ein Docker-Container?

Ein Docker-Container ist eine Instanz eines Docker-Images. Es läuft standardmäßig vollständig isoliert von der Host-Umgebung und greift nur auf Host-Dateien und Ports zu, wenn dies so konfiguriert ist.

Ein Container könnte als virtuelle Maschine betrachtet werden, aber anstatt ein vollständiges virtuelles Betriebssystem zu erstellen, ermöglicht er Anwendungen, denselben Linux-Kernel wie das System zu verwenden, auf dem sie ausgeführt werden. Es erfordert lediglich, dass Anwendungen mit Teilen versendet werden, die noch nicht auf dem Host-Computer ausgeführt werden. Dadurch erhalten Sie eine deutliche Leistungssteigerung und reduzieren die Größe der Anwendung.

Denken Sie daran, dass alle am Container vorgenommenen Änderungen auf einer separaten Ebene und nicht im selben Docker-Image aufgezeichnet werden. Das bedeutet, wenn Sie den Container löschen oder einen neuen erstellen, der auf demselben Docker-Image basiert, sind die Änderungen nicht vorhanden. Um die Änderungen beizubehalten, müssen Sie sie in ein neues Docker-Image übertragen oder eine Docker-Datei erstellen.

Was ist eine Docker-Datei?

Ein DockerFile ist ein Skript, das verwendet wird, um ein Docker-Image zu generieren, in dem Sie die Schritte haben, um es basierend auf allen Änderungen zu generieren, die Sie anwenden möchten.

Docker-Komponenten

Sehen wir uns ein Beispiel für eine Docker-Datei an.

$ 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

Jetzt können wir aus dieser Docker-Datei ein neues Docker-Image erstellen:

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

Überprüfen Sie das neu erstellte Image:

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

Und jetzt können wir das neue Image als gemeinsames Docker-Image verwenden, wie wir im nächsten Abschnitt sehen werden.

Multiplenines DevOps-Leitfaden zur DatenbankverwaltungErfahren Sie, was Sie wissen müssen, um Ihre Open-Source-Datenbanken zu automatisieren und zu verwalten.Kostenlos herunterladen

So stellen Sie MariaDB auf Docker ohne Dockerfile bereit

Nachdem wir nun mehr über die Docker-Welt wissen, sehen wir uns an, wie man damit einen MariaDB-Server erstellt. Dazu gehen wir davon aus, dass Sie Docker bereits installiert haben.

Wir können das mit Dockerfile erstellte Image verwenden, aber wir ziehen das offizielle MariaDB-Docker-Image.

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

Ohne Angabe eines TAG wird standardmäßig die neueste Image-Version abgerufen, in diesem Fall MariaDB Server 10.3 auf Ubuntu 18.04.

$ docker pull mariadb

Wir können das heruntergeladene Bild überprüfen.

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

Dann erstellen wir zwei Verzeichnisse unter unserem MariaDB-Docker-Verzeichnis, eines für das Datadir und ein weiteres für die MariaDB-Konfigurationsdateien. Wir fügen beides zu unserem MariaDB Docker Container hinzu.

$ cd ~/Docker
$ mkdir datadir
$ mkdir config

Die Startkonfiguration ist in der Datei /etc/mysql/my.cnf angegeben und enthält alle Dateien, die im Verzeichnis /etc/mysql/conf.d gefunden werden und auf .cnf enden.

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

Der Inhalt dieser Dateien überschreibt alle wiederholten Parameter, die in /etc/mysql/my.cnf konfiguriert sind, sodass Sie hier eine alternative Konfiguration erstellen können.

Lassen Sie uns unseren ersten MariaDB-Docker-Container ausführen:

$ 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

Danach können wir überprüfen, ob unsere Container laufen:

$ 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

Das Containerprotokoll:

$ 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

Und der Inhalt unseres Docker-Datadir-Pfads (Host):

$ 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

Wir können auf den MariaDB-Container zugreifen, indem wir den folgenden Befehl ausführen und das in der MYSQL_ROOT_PASSWORD-Variable angegebene Passwort verwenden:

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

Hier können wir sehen, wie unser dbtest erstellt wurde.

Docker-Befehle

Sehen wir uns abschließend einige nützliche Befehle zum Verwalten von Docker an.

  • Bildsuche
    $ docker search Image_Name
  • Image-Download
    $ docker pull Image_Name
  • Auflisten der installierten Images
    $ docker images
  • Container auflisten (mit dem Flag -a können wir auch die gestoppten Container sehen)
    $ docker ps -a
  • Löschen Sie ein Docker-Image
    $ docker rmi Image_Name
  • Löschen Sie einen Docker-Container (der Container muss gestoppt werden)
    $ docker rm Container_Name
  • Führen Sie einen Container von einem Docker-Image aus (durch Hinzufügen des Flags -p können wir einen Container-Port localhost zuordnen)
    $ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
  • Container stoppen
    $ docker stop Container_Name
  • Container starten
    $ docker start Container_Name
  • Containerprotokolle prüfen
    $ docker logs Container_Name
  • Containerinformationen prüfen
    $ docker inspect Container_Name
  • Erstellen Sie einen Container, der mit
    $ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
  • Verbinden Sie sich mit einem Container von localhost
    $ docker exec -it Container_Name bash
  • Erstellen Sie einen Container mit hinzugefügtem Volume
    $ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
  • Änderungen in ein neues Image übernehmen
    $ docker commit Container_ID Image_Name:TAG

Schlussfolgerung

Docker ist ein wirklich nützliches Tool, um eine Entwicklungsumgebung einfach mit einem Dockerfile zu teilen oder ein Docker-Image zu veröffentlichen. Indem Sie es verwenden, können Sie sicherstellen, dass alle dieselbe Umgebung verwenden. Gleichzeitig ist es auch nützlich, eine vorhandene Umgebung neu zu erstellen oder zu klonen. Docker kann Volumes freigeben, private Netzwerke verwenden, Ports zuordnen und noch mehr.

In diesem Blog haben wir gesehen, wie MariaDB Server auf Docker als eigenständiger Server bereitgestellt wird. Wenn Sie eine komplexere Umgebung wie Replikation oder Galera-Cluster verwenden möchten, können Sie bitnami/mariadb verwenden, um diese Konfiguration zu erreichen.