Instalar MySQL 5.6/5.7/8.0 en Docker.
Receta detallada para instalar la últimas versiones de MySQL, varias versiones en Docker.
Recomendamos comenzar con el post sobre MariaDB primero.
Para continuar con nuestras pruebas de motores MySQL, ahora instalaremos 3 contenedores con varias versiones de MySQL.
Aunque es algo sin implicancias (o casi), mientras que MariaDB utiliza Debian como S.O. para el contenedor, la gente de MySQL prefiere Oracle Linux 7.4, algo mas que obvio pensando que Oracle es el dueño de MySQL.
Algo que no debería afectarnos, pero que a nivel de S.O. del contenedor, algunos procesos se deberán hacer de otra manera (Deb vs RPM).
En Docker existe una página oficial con información sobre MySQL.
https://github.com/mysql/mysql-docker
En nuestro equipo real, clonamos el repositorio oficial MySQL para Docker
# git clone https://github.com/mysql/mysql-docker
Ahora generaremos las imágenes para varios motores MySQL.
# cd 5.6
# docker build -t mysql56 .
# docker run --name mysql5638 -e MYSQL_ROOT_PASSWORD=testing -d mysql56
# cd ../5.7
# docker build -t mysql57 .
# docker run --name mysql5720 -e MYSQL_ROOT_PASSWORD=testing -d mysql57
# cd ../8.0
# docker build -t mysql80 .
# docker run --name mysql803 -e MYSQL_ROOT_PASSWORD=testing -d mysql80
Luego de unos minutos tendremos corriendo las 3 versiones de MySQL.
Podemos arrancar una sesión “bash” contra cada contenedor que acabamos de crear.
# docker exec -it mysql5638 bash
También podemos conectarnos contra los motores de bases de datos.
# docker exec -it mysql5638 mysql -uroot -p
# docker exec -it mysql5720 mysql -uroot -p
# docker exec -it mysql803 mysql -uroot -p
Las imágenes que tenemos instaladas localmente, cuando mide cada una y cuando fueron creadas.
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql80 latest 6f9870f70688 9 minutes ago 295MB
mysql57 latest a91bca14d61d 11 minutes ago 246MB
mysql56 latest a67ae0388d7e 13 minutes ago 226MB
mariadb55 latest 8d77deaa9aa5 23 minutes ago 280MB
mariadb101 latest 1b1ceb2ffadd 30 minutes ago 395MB
mariadb102 latest 2e00b3316123 About an hour ago 397MB
Los contenedores creados
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8abcb524a17e mysql80 "/entrypoint.sh my..." About a minute ago Up About a minute (healthy) 3306/tcp, 33060/tcp mysql803
3eeae33cde01 mysql57 "/entrypoint.sh my..." 3 minutes ago Up 3 minutes (healthy) 3306/tcp, 33060/tcp mysql5720
331df765d34a mysql56 "/entrypoint.sh my..." 6 minutes ago Up 6 minutes (healthy) 3306/tcp mysql5638
f1773511204b mariadb55 "docker-entrypoint..." 23 minutes ago Up 23 minutes 3306/tcp mariadb5558
47b2b77cf25b mariadb101 "docker-entrypoint..." 29 minutes ago Up 29 minutes 3306/tcp mariadb10128
d3f16f7859c1 mariadb102 "docker-entrypoint..." About an hour ago Up About an hour 3306/tcp mariadb10210
Un consumo de recursos bastante menor que tener corriendo 6 servidores Linux, cada uno con una versión distinta de MariaDB y MySQL.
Reiniciamos todos los contenedores para verlos funcionando desde cero
# docker restart mysql80
# docker restart mysql803
# docker restart mysql5720
# docker restart mysql5638
# docker restart mariadb5558
# docker restart mariadb10128
# docker restart mariadb10210
Las estadísticas simples de docker, nos muestran los consumos de recursos de cada uno.
# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8abcb524a17e mysql803 0.09% 284.9MiB / 7.685GiB 3.62% 3.51kB / 0B 934kB / 13.1MB 28
3eeae33cde01 mysql5720 0.09% 180.8MiB / 7.685GiB 2.30% 3.51kB / 0B 4.27MB / 12.7MB 28
331df765d34a mysql5638 0.08% 452.7MiB / 7.685GiB 5.75% 3.51kB / 0B 2.29MB / 49.2kB 22
f1773511204b mariadb5558 0.13% 103.4MiB / 7.685GiB 1.31% 3.33kB / 0B 15.8MB / 12.3kB 19
47b2b77cf25b mariadb10128 0.07% 108.8MiB / 7.685GiB 1.38% 3.26kB / 0B 20.4MB / 69.6kB 26
d3f16f7859c1 mariadb10210 0.12% 93.45MiB / 7.685GiB 1.19% 3.26kB / 0B 16.1MB / 2.22MB 30
Para nuestras pruebas de cargas de datos en varios motores, preparamos este script.
# vi run_all.sh
#!/bin/bash
docker restart mysql803
docker restart mysql5720
docker restart mysql5638
docker restart mariadb5558
docker restart mariadb10128
docker restart mariadb10210
# eof
Para verificar los motores corriendo, usamos “nmap”.
# nmap -v -sn 172.17.0.1/24
Nmap scan report for 172.17.0.2
Host is up (0.000058s latency).
MAC Address: 02:42:AC:11:00:02 (Unknown)
Nmap scan report for 172.17.0.3
Host is up (0.000014s latency).
MAC Address: 02:42:AC:11:00:03 (Unknown)
Nmap scan report for 172.17.0.4
Host is up (0.000012s latency).
MAC Address: 02:42:AC:11:00:04 (Unknown)
Nmap scan report for 172.17.0.5
Host is up (0.000011s latency).
MAC Address: 02:42:AC:11:00:05 (Unknown)
Nmap scan report for 172.17.0.6
Host is up (0.000011s latency).
MAC Address: 02:42:AC:11:00:06 (Unknown)
Nmap scan report for 172.17.0.7
Host is up (0.000028s latency).
MAC Address: 02:42:AC:11:00:07 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:02 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:03 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:04 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:05 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:06 (Unknown)
PORT STATE SERVICE
3306/tcp open mysql
MAC Address: 02:42:AC:11:00:07 (Unknown)
Mientras que en MariaDB la conexión se puede realizar directamente
# mysql -uroot -ptesting -h 172.17.0.2
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.10-MariaDB-10.2.10+maria~jessie mariadb.org binary distribution
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> exit
Bye
En MySQL no es posible. ¿ Por qué ?
# mysql -uroot -ptesting -h 172.17.0.5
ERROR 1130 (HY000): Host '172.17.0.1' is not allowed to connect to this MySQL server
En las instalaciones de MySQL, solamente se han creado cuentas “root” que pueden conectarse al motor de manera local.
Ahora crearemos cuentas para conectarnos a esos motores (MySQL) desde cualquier IP ( cliente ).
Debemos repetir este paso para los tres motores MySQL.
# docker exec -it mysql803 bash
# mysql -u root -ptesting
mysql> create user 'root'@'%' identified by 'testing';
mysql> flush privileges;
mysql> exit
# exit
# docker exec -it mysql5720 bash
# mysql -u root -ptesting
mysql> create user 'root'@'%' identified by 'testing';
mysql> flush privileges;
mysql> exit
# exit
# docker exec -it mysql5638 bash
# mysql -u root -ptesting
mysql> create user 'root'@'%' identified by 'testing';
mysql> flush privileges;
mysql> exit
# exit
Ahora desde nuestro equipo real podremos conectarnos a los servidores MySQL. (IP finalizarán del 2 al 7)
# mysql -uroot -ptesting -h 172.17.0.7
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 8.0.3-rc-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
Mientras que el consumo de CPU% y Mem% es “ahora, “ los contadores de NET y I/O son acumulativos.
Luego de trabajar un rato con MySQL 5.6.38, vemos el aumento de tráfico de datos que tuyo.
# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8abcb524a17e mysql803 0.10% 202.6MiB / 7.685GiB 2.58% 5.53kB / 0B 14.9MB / 15.6MB 28
3eeae33cde01 mysql5720 0.11% 161.5MiB / 7.685GiB 2.05% 5.53kB / 0B 2.72MB / 12.7MB 28
331df765d34a mysql5638 0.09% 410.8MiB / 7.685GiB 5.22% 14.4kB / 134kB 13.2MB / 49.2kB 23
f1773511204b mariadb5558 0.09% 85.4MiB / 7.685GiB 1.09% 5.53kB / 0B 4.99MB / 12.3kB 19
47b2b77cf25b mariadb10128 0.12% 84.41MiB / 7.685GiB 1.07% 5.53kB / 0B 4.98MB / 69.6kB 26
d3f16f7859c1 mariadb10210 0.12% 90.46MiB / 7.685GiB 1.15% 5.53kB / 0B 6.23MB / 2.22MB 30
Llegando a los 14.4kB de Input y 134KB de Output.
En el resto de los servidores vemos que no hubo envío de datos a clientes.
En algunos motores se crea una base de datos para pruebas llamada “test”.
MySQL/MariaDB tienen un comando para extraer todas las estructuras y datos de una base de datos (mysqldump) y el cliente “mysql” puede importar esos datos en un nuevo motor, debe existir la base de datos en destino.
Desde nuestro equipo real, probemos hacer un backup/copia de esa base de datos de un servidor y la restauramos en el nuevo.
En este caso, en el server 2 y 3, ya está creada la base de datos.
# mysqldump test -uroot -ptesting -h172.17.0.2 | mysql test -uroot -ptesting -h172.17.0.3
También veremos como correr programas en cada servidor, para obtener datos del mismo.
# docker exec -it mysql5638 df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 240012884 210057916 17693288 93% /
tmpfs 65536 0 65536 0% /dev
tmpfs 4029052 0 4029052 0% /sys/fs/cgroup
/dev/sda2 240012884 210057916 17693288 93% /etc/hosts
shm 65536 0 65536 0% /dev/shm
tmpfs 4029052 0 4029052 0% /sys/firmware