sql >> Database teknologi >  >> RDS >> MariaDB

Sådan implementeres MariaDB Server til en Docker Container

I dag er udtryk som Docker, Images eller Containers ret almindelige i alle databasemiljøer, så det er normalt at se en MariaDB-server køre på Docker i både produktions- og ikke-produktionsopsætninger. Det er dog muligt, at selvom du måske har hørt vilkårene, kender du måske nu forskellene mellem dem. I denne blog giver vi et overblik over disse vilkår, og hvordan vi kan anvende dem i praksis til at implementere en MariaDB-server.

Hvad er Docker?

Docker er det mest almindelige værktøj til at oprette, implementere og køre applikationer ved at bruge containere. Det giver dig mulighed for at pakke et program sammen med alle de dele, det har brug for (såsom biblioteker og andre afhængigheder) og sende det hele ud som én pakke, hvilket giver mulighed for bærbar deling af containere på tværs af forskellige maskiner.

Container vs Virtual Machine

Hvad er et billede?

Relaterede ressourcer ClusterControl &Docker MySQL på Docker Blog Series MySQL på Docker - Sådan containeriserer du din database

Et billede er som en virtuel maskine skabelon. Den har alle de nødvendige oplysninger til at køre containeren. Dette inkluderer operativsystemet, softwarepakker, drivere, konfigurationsfiler og hjælpescripts... alt sammen pakket i én pakke.

Et Docker-billede kan bygges af alle, der har evnen til at skrive et script. Det er derfor, der er mange lignende billeder, der bygges af fællesskabet, hver med mindre forskelle...men tjener et fælles formål.

Hvad er en Docker Container?

En Docker Container er en forekomst af et Docker Image. Den kører som standard fuldstændig isoleret fra værtsmiljøet og har kun adgang til værtsfiler og -porte, hvis den er konfigureret til at gøre det.

En container kan betragtes som en virtuel maskine, men i stedet for at skabe et helt virtuelt operativsystem, tillader den applikationer at bruge den samme Linux-kerne som det system, de kører på. Det kræver kun, at applikationer sendes med dele, der ikke allerede kører på værtscomputeren. Dette giver dig et markant ydelsesboost og reducerer applikationens størrelse.

Husk, at eventuelle ændringer, der foretages i beholderen, optages på et separat lag, ikke i det samme Docker-billede. Dette betyder, at hvis du sletter containeren, eller hvis du opretter en ny baseret på det samme Docker-billede, vil ændringerne ikke være der. For at bevare ændringerne skal du overføre dem til et nyt Docker-billede eller oprette en Docker-fil.

Hvad er en DockerFile?

En DockerFile er et script, der bruges til at generere et Docker-billede, hvor du har trinene til at generere det baseret på eventuelle ændringer, du vil anvende.

Docker-komponenter

Lad os se et Docker File-eksempel.

$ 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

Nu kan vi bygge et nyt Docker-billede fra denne Docker-fil:

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

Tjek det nye oprettede billede:

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

Og nu kan vi bruge det nye billede som et almindeligt Docker-billede, som vi vil se i næste afsnit.

Severalnines DevOps Guide til Database Management Lær om, hvad du skal vide for at automatisere og administrere dine open source-databaser. Download gratis

Sådan installeres MariaDB på Docker uden Dockerfile

Nu hvor vi ved mere om Docker-verdenen, lad os se, hvordan man bruger den til at oprette en MariaDB-server. Til dette antager vi, at du allerede har Docker installeret.

Vi kan bruge det billede, der er oprettet ved at bruge Dockerfilen, men vi trækker det officielle MariaDB Docker-billede.

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

Uden at angive et TAG trækker det som standard den seneste billedversion, i dette tilfælde MariaDB Server 10.3 på Ubuntu 18.04.

$ docker pull mariadb

Vi kan tjekke det downloadede billede.

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

Derefter opretter vi to mapper under vores MariaDB Docker-bibliotek, en til datadir og en anden til MariaDB-konfigurationsfilerne. Vi tilføjer begge dele på vores MariaDB Docker Container.

$ cd ~/Docker
$ mkdir datadir
$ mkdir config

Opstartskonfigurationen er angivet i filen /etc/mysql/my.cnf, og den inkluderer alle filer fundet i /etc/mysql/conf.d-mappen, der ender med .cnf.

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

Indholdet af disse filer vil tilsidesætte enhver gentaget parameter konfigureret i /etc/mysql/my.cnf, så du kan oprette en alternativ konfiguration her.

Lad os køre vores første MariaDB Docker Container:

$ 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

Herefter kan vi kontrollere, at vores containere kører:

$ 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

Beholderloggen:

$ 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

Og indholdet af vores Docker datadir-sti (vært):

$ 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

Vi kan få adgang til MariaDB-beholderen, der kører følgende kommando og bruger den adgangskode, der er angivet i variablen MYSQL_ROOT_PASSWORD:

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

Her kan vi se vores dbtest oprettet.

Docker-kommandoer

Lad os endelig se nogle nyttige kommandoer til at administrere Docker.

  • Billedsøgning
    $ docker search Image_Name
  • Billeddownload
    $ docker pull Image_Name
  • Vis de installerede billeder
    $ docker images
  • List containere (ved at tilføje flaget -a kan vi også se de stoppede containere)
    $ docker ps -a
  • Slet et Docker-billede
    $ docker rmi Image_Name
  • Slet en Docker Container (containeren skal stoppes)
    $ docker rm Container_Name
  • Kør en container fra et Docker-billede (ved at tilføje flaget -p kan vi tilknytte en containerport til localhost)
    $ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
  • Stop container
    $ docker stop Container_Name
  • Start container
    $ docker start Container_Name
  • Tjek containerlogfiler
    $ docker logs Container_Name
  • Tjek containeroplysninger
    $ docker inspect Container_Name
  • Opret en container tilknyttet
    $ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
  • Opret forbindelse til en container fra localhost
    $ docker exec -it Container_Name bash
  • Opret en container med tilføjet volumen
    $ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
  • Bekræft ændringer til et nyt billede
    $ docker commit Container_ID Image_Name:TAG

Konklusion

Docker er et virkelig nyttigt værktøj til nemt at dele et udviklingsmiljø ved at bruge en Dockerfile eller udgive et Docker-billede. Ved at bruge det kan du sikre dig, at alle bruger det samme miljø. Samtidig er det også nyttigt at genskabe eller klone et eksisterende miljø. Docker kan dele mængder, bruge private netværk, kortporte og endnu mere.

I denne blog så vi, hvordan man implementerer MariaDB Server på Docker som en selvstændig server. Hvis du vil bruge et mere komplekst miljø som Replication eller Galera Cluster, kan du bruge bitnami/mariadb til at opnå denne konfiguration.


  1. Fremstil et 'DataSource'-objekt til Postgres JDBC, programmatisk

  2. Dataanalyse vs. datavidenskab:Hvad er forskellen?

  3. Indsamlingsmetode:LIMIT-funktion i Oracle-databasen

  4. Konverter et månedsnavn til månedsnummeret i SQL Server (T-SQL)