Tegenwoordig zijn termen als Docker, Images of Containers vrij gebruikelijk in alle database-omgevingen, dus het is normaal dat een MariaDB-server op Docker draait in zowel productie- als niet-productieconfiguraties. Het is echter mogelijk dat u, hoewel u de voorwaarden misschien hebt gehoord, nu de verschillen ertussen kent. In deze blog geven we een overzicht van deze voorwaarden en hoe we ze in de praktijk kunnen toepassen om een MariaDB-server in te zetten.
Wat is Docker?
Docker is de meest gebruikte tool voor het maken, implementeren en uitvoeren van applicaties met behulp van containers. Hiermee kunt u een toepassing verpakken met alle benodigde onderdelen (zoals bibliotheken en andere afhankelijkheden) en deze als één pakket verzenden, waardoor containers op verschillende machines mobiel kunnen worden gedeeld.
Container versus virtuele machineWat is een afbeelding?
Gerelateerde bronnen ClusterControl &Docker MySQL op Docker Blog Series MySQL op Docker - Hoe u uw database kunt containeriserenEen afbeelding is als een sjabloon voor een virtuele machine. Het heeft alle benodigde informatie om de container uit te voeren. Dit omvat het besturingssysteem, softwarepakketten, stuurprogramma's, configuratiebestanden en helperscripts... allemaal verpakt in één bundel.
Een Docker-image kan worden gebouwd door iedereen die een script kan schrijven. Dat is de reden waarom er veel vergelijkbare afbeeldingen worden gebouwd door de gemeenschap, elk met kleine verschillen... maar met een gemeenschappelijk doel.
Wat is een Docker-container?
Een Docker Container is een instantie van een Docker Image. Het werkt standaard volledig geïsoleerd van de hostomgeving en heeft alleen toegang tot hostbestanden en poorten als dit is geconfigureerd.
Een container kan worden beschouwd als een virtuele machine, maar in plaats van een heel virtueel besturingssysteem te creëren, kunnen applicaties dezelfde Linux-kernel gebruiken als het systeem waarop ze draaien. Het vereist alleen dat applicaties worden geleverd met onderdelen die nog niet op de hostcomputer draaien. Dit geeft u een aanzienlijke prestatieverbetering en vermindert de grootte van de applicatie.
Houd er rekening mee dat eventuele wijzigingen in de container worden vastgelegd op een aparte laag, niet in dezelfde Docker-afbeelding. Dit betekent dat als u de container verwijdert, of als u een nieuwe maakt op basis van dezelfde Docker-afbeelding, de wijzigingen er niet zullen zijn. Om de wijzigingen te behouden, moet u deze vastleggen in een nieuwe Docker-afbeelding of een Docker-bestand maken.
Wat is een DockerFile?
Een DockerFile is een script dat wordt gebruikt om een Docker-afbeelding te genereren, waarbij u de stappen hebt om deze te genereren op basis van eventuele wijzigingen die u wilt toepassen.
DockercomponentenLaten we een Docker-bestandsvoorbeeld bekijken.
$ 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 kunnen we een nieuwe Docker-afbeelding maken van dit Docker-bestand:
$ docker build --rm=true -t severalnines/mariadb-ssh .
Controleer de nieuwe afbeelding die is gemaakt:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
severalnines/mariadb-ssh latest a8022951f195 17 seconds ago 485MB
En nu kunnen we de nieuwe afbeelding gebruiken als een algemene Docker-afbeelding, zoals we in de volgende sectie zullen zien.
DevOps-gids voor databasebeheer van verschillendenines Lees meer over wat u moet weten om uw open source-databases te automatiseren en beherenGratis downloadenHoe MariaDB op Docker te implementeren zonder Dockerfile
Nu we meer weten over de Docker-wereld, laten we eens kijken hoe we deze kunnen gebruiken om een MariaDB-server te maken. Hiervoor gaan we ervan uit dat Docker al is geïnstalleerd.
We kunnen de afbeelding gebruiken die is gemaakt met behulp van de Dockerfile, maar we zullen de officiële MariaDB Docker-afbeelding gebruiken.
$ docker search mariadb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mariadb MariaDB is a community-developed fork of MyS… 2804 [OK]
Zonder een TAG op te geven, wordt standaard de nieuwste afbeeldingsversie opgehaald, in dit geval MariaDB Server 10.3 op Ubuntu 18.04.
$ docker pull mariadb
We kunnen de gedownloade afbeelding controleren.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest e07bb20373d8 2 weeks ago 349MB
Vervolgens maken we twee mappen onder onze MariaDB Docker-map, een voor de datadir en een andere voor de MariaDB-configuratiebestanden. We voegen beide toe aan onze MariaDB Docker Container.
$ cd ~/Docker
$ mkdir datadir
$ mkdir config
De opstartconfiguratie wordt gespecificeerd in het bestand /etc/mysql/my.cnf en bevat alle bestanden die in de map /etc/mysql/conf.d worden gevonden die eindigen op .cnf.
$ tail -1 /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/
De inhoud van deze bestanden overschrijft elke herhaalde parameter die is geconfigureerd in /etc/mysql/my.cnf, dus u kunt hier een alternatieve configuratie maken.
Laten we onze eerste MariaDB Docker Container draaien:
$ 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
Hierna kunnen we controleren of onze containers lopen:
$ 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
Het containerlogboek:
$ 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
En de inhoud van ons Docker-datadir-pad (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
We hebben toegang tot de MariaDB-container door de volgende opdracht uit te voeren en het wachtwoord te gebruiken dat is opgegeven in de variabele MYSQL_ROOT_PASSWORD:
$ docker exec -it mariadb1 bash
[email protected]:/# mysql -p -e "SHOW DATABASES;"
Enter password:
+--------------------+
| Database |
+--------------------+
| dbtest |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
Hier kunnen we zien hoe onze dbtest is gemaakt.
Docker-opdrachten
Laten we tot slot enkele nuttige commando's bekijken voor het beheren van Docker.
- Afbeelding zoeken
$ docker search Image_Name
- Afbeelding downloaden
$ docker pull Image_Name
- Laat de geïnstalleerde afbeeldingen zien
$ docker images
- Lijst containers (toevoegen van de vlag -a we kunnen ook de gestopte containers zien)
$ docker ps -a
- Een Docker-afbeelding verwijderen
$ docker rmi Image_Name
- Verwijder een Docker-container (de container moet worden gestopt)
$ docker rm Container_Name
- Voer een container uit vanuit een Docker-image (voeg de vlag toe -p we kunnen een containerpoort toewijzen aan 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
- Controleer containerlogboeken
$ docker logs Container_Name
- Controleer containerinformatie
$ docker inspect Container_Name
- Maak een container gekoppeld
$ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
- Verbind met een container vanuit localhost
$ docker exec -it Container_Name bash
- Maak een container met toegevoegd volume
$ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
- Wijzigingen in een nieuwe afbeelding doorvoeren
$ docker commit Container_ID Image_Name:TAG
Conclusie
Docker is een erg handig hulpmiddel om eenvoudig een ontwikkelomgeving te delen met behulp van een Dockerfile of het publiceren van een Docker-image. Door het te gebruiken, kunt u ervoor zorgen dat iedereen dezelfde omgeving gebruikt. Tegelijkertijd is het ook handig om een bestaande omgeving te recreëren of te klonen. Docker kan volumes delen, privénetwerken gebruiken, poorten toewijzen en zelfs meer.
In deze blog hebben we gezien hoe MariaDB Server op Docker als een standalone server kan worden ingezet. Als u een complexere omgeving zoals Replication of Galera Cluster wilt gebruiken, kunt u bitnami/mariadb gebruiken om deze configuratie te bereiken.