/ HOWTO

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

Subscríbete y recibirás los últimos artículos semanalmente en tu email.