Al giorno d'oggi, termini come Docker, Immagini o Contenitori sono piuttosto comuni in tutti gli ambienti di database, quindi è normale vedere un server MariaDB in esecuzione su Docker sia in configurazioni di produzione che non di produzione. È possibile, tuttavia, che mentre potresti aver sentito i termini, ora potresti conoscere le differenze tra loro. In questo blog, forniamo una panoramica di questi termini e di come possiamo applicarli nella pratica per distribuire un server MariaDB.
Cos'è Docker?
Docker è lo strumento più comune per creare, distribuire ed eseguire applicazioni utilizzando i container. Ti consente di impacchettare un'applicazione con tutte le parti di cui ha bisogno (come librerie e altre dipendenze) e spedire il tutto come un unico pacchetto, consentendo la condivisione portatile di contenitori su macchine diverse.
Contenitore vs macchina virtualeCos'è un'immagine?
Risorse correlate ClusterControl e Docker MySQL su Docker Blog Series MySQL su Docker - Come containerizzare il databaseUn'immagine è come un modello di macchina virtuale. Ha tutte le informazioni necessarie per eseguire il container. Ciò include il sistema operativo, i pacchetti software, i driver, i file di configurazione e gli script di supporto... il tutto racchiuso in un unico pacchetto.
Un'immagine Docker può essere creata da chiunque abbia la capacità di scrivere uno script. Ecco perché ci sono molte immagini simili costruite dalla community, ognuna con piccole differenze... ma che servono a uno scopo comune.
Cos'è un Docker Container?
Un Docker Container è un'istanza di un'immagine Docker. Viene eseguito completamente isolato dall'ambiente host per impostazione predefinita, accedendo ai file host e alle porte solo se configurato per farlo.
Un container può essere considerato come una macchina virtuale, ma invece di creare un intero sistema operativo virtuale, consente alle applicazioni di utilizzare lo stesso kernel Linux del sistema su cui sono in esecuzione. Richiede solo che le applicazioni vengano spedite con parti non già in esecuzione sul computer host. Questo ti dà un notevole incremento delle prestazioni e riduce le dimensioni dell'applicazione.
Tieni presente che tutte le modifiche apportate al contenitore vengono registrate su un livello separato, non nella stessa immagine Docker. Ciò significa che se elimini il contenitore o se ne crei uno nuovo basato sulla stessa immagine Docker, le modifiche non ci saranno. Per preservare le modifiche, devi salvarle in una nuova immagine Docker o creare un file Docker.
Cos'è un DockerFile?
Un DockerFile è uno script utilizzato per generare un'immagine Docker in cui hai i passaggi per generarla in base alle modifiche che desideri applicare.
Componenti DockerVediamo un esempio di file 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
Ora possiamo creare una nuova immagine Docker da questo file Docker:
$ docker build --rm=true -t severalnines/mariadb-ssh .
Controlla la nuova immagine creata:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
severalnines/mariadb-ssh latest a8022951f195 17 seconds ago 485MB
E ora possiamo utilizzare la nuova immagine come un'immagine Docker comune, come vedremo nella prossima sezione.
Diversinines DevOps Guide to Database ManagementScopri cosa devi sapere per automatizzare e gestire i tuoi database open sourceScarica gratuitamenteCome distribuire MariaDB su Docker senza Dockerfile
Ora che sappiamo di più sul mondo Docker, vediamo come utilizzarlo per creare un server MariaDB. Per questo, supponiamo che tu abbia già installato Docker.
Possiamo usare l'immagine creata usando il Dockerfile, ma estrarremo l'immagine Docker ufficiale di MariaDB.
$ docker search mariadb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mariadb MariaDB is a community-developed fork of MyS… 2804 [OK]
Senza specificare un TAG, per impostazione predefinita, estrarrà l'ultima versione dell'immagine, in questo caso, MariaDB Server 10.3 su Ubuntu 18.04.
$ docker pull mariadb
Possiamo controllare l'immagine scaricata.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest e07bb20373d8 2 weeks ago 349MB
Quindi, creeremo due directory nella nostra directory Docker di MariaDB, una per la datadir e un'altra per i file di configurazione di MariaDB. Li aggiungeremo entrambi nel nostro MariaDB Docker Container.
$ cd ~/Docker
$ mkdir datadir
$ mkdir config
La configurazione di avvio è specificata nel file /etc/mysql/my.cnf e include tutti i file trovati nella directory /etc/mysql/conf.d che terminano con .cnf.
$ tail -1 /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/
Il contenuto di questi file sovrascriverà qualsiasi parametro ripetuto configurato in /etc/mysql/my.cnf, quindi puoi creare una configurazione alternativa qui.
Eseguiamo il nostro primo 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
Successivamente, possiamo controllare i nostri contenitori in esecuzione:
$ 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
Il registro del contenitore:
$ 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
E il contenuto del nostro percorso datadir Docker (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
Possiamo accedere al contenitore MariaDB eseguendo il seguente comando e utilizzando la password specificata nella variabile MYSQL_ROOT_PASSWORD:
$ docker exec -it mariadb1 bash
[email protected]:/# mysql -p -e "SHOW DATABASES;"
Enter password:
+--------------------+
| Database |
+--------------------+
| dbtest |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
Qui possiamo vedere il nostro dbtest creato.
Comandi Docker
Infine, vediamo alcuni comandi utili per la gestione di Docker.
- Ricerca immagine
$ docker search Image_Name
- Scarica immagine
$ docker pull Image_Name
- Elenca le immagini installate
$ docker images
- Elenca i contenitori (aggiungendo il flag -a possiamo vedere anche i contenitori fermi)
$ docker ps -a
- Elimina un'immagine Docker
$ docker rmi Image_Name
- Elimina un Docker Container (il container deve essere interrotto)
$ docker rm Container_Name
- Esegui un container da un'immagine Docker (aggiungendo il flag -p possiamo mappare una porta container su localhost)
$ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
- Arresta container
$ docker stop Container_Name
- Avvia contenitore
$ docker start Container_Name
- Controlla i registri del contenitore
$ docker logs Container_Name
- Controlla le informazioni sul contenitore
$ docker inspect Container_Name
- Crea un contenitore collegato
$ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
- Connetti a un container da localhost
$ docker exec -it Container_Name bash
- Crea un contenitore con il volume aggiunto
$ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
- Imposta le modifiche a una nuova immagine
$ docker commit Container_ID Image_Name:TAG
Conclusione
Docker è uno strumento davvero utile per condividere facilmente un ambiente di sviluppo utilizzando un Dockerfile o pubblicando un'immagine Docker. Usandolo puoi assicurarti che tutti utilizzino lo stesso ambiente. Allo stesso tempo è anche utile ricreare o clonare un ambiente esistente. Docker può condividere volumi, utilizzare reti private, mappare le porte e altro ancora.
In questo blog, abbiamo visto come distribuire MariaDB Server su Docker come server autonomo. Se desideri utilizzare un ambiente più complesso come Replication o Galera Cluster, puoi utilizzare bitnami/mariadb per ottenere questa configurazione.