domingo, 15 de marzo de 2020

MySQL y Dockers ... una configuración simple

MySQL y Dockers ... no son conceptos nuevos, la gente se ha mudado a Dockers desde hace algún tiempo. Para alguien que solo se está moviendo hacia esto para el desarrollo, puede tener algunos obstáculos.

Si bien MySQL funciona bien localmente, si está probando código en diferentes versiones de MySQL, es bueno tener varias versiones fácilmente disponibles.

Una opción durante años ha sido, por supuesto, https://mysqlsandbox.net/ de Giuseppe Maxia. Esta es una solución muy válida para poder obtener varias instancias y probar la replicación, etc.

Los Dockers ahora también son otro escenario de uso frecuente cuando se trata de probar en diferentes versiones de MySQL. A continuación se detallan algunos de los pasos para instalar fácilmente varias versiones. Yo uso OSX, así que estos ejemplos son para OSX.

Necesita Docker para comenzar y, por supuesto, Docker Desktop es una herramienta útil para que pueda acceder fácilmente.

Una vez que configuré Docker, puedo preparar mi entorno para MySQL.

Aquí creé una carpeta Docker que contiene los directorios de datos MySQL, los archivos de configuración y el directorio de archivos mysql si lo necesitaba.

mkdir ~/Docker ;

mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~ / Docker / cnf;

Ahora dentro de mysql_data


cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;


Ahora configuro archivos cnf simples para este ejemplo. Lo principal a tener en cuenta es la dirección de enlace. Esto está configurado para garantizar que esté abierto para que podamos llegar a MySQL fuera del docker. También puede observar que estos archivos se pueden usar para configurar información de configuración adicional como mejor le parezca por instancia de Docker de MySQL.



cd ~/Docker/cnf;

cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80


# Custom config should go here
!includedir /etc/mysql/conf.d/

cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M

$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56

$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55


Bien, ahora que tenemos configurados los archivos de configuración, necesitamos construir los acopladores. Algunas cosas a tener en cuenta para los comandos de compilación.

--name Establecimos una referencia con nombre para la ventana acoplable.

Aquí estamos asignando los archivos de configuración, el directorio de datos y los directorios de archivos mysql al docker. Esto nos permite ajustar el archivo my.cnf y etc. fácilmente.
-v ~ / Docker / cnf / my.8.0.cnf: /etc/mysql/my.cnf
-v ~ / Docker / mysql_data / 8.0: / var / lib / mysql
-v ~ / Docker / mysql-files: / var / lib / mysql-files

Queremos poder llegar a estas instancias de MySQL fuera del docker, por lo que debemos publicar y asignar el puerto en consecuencia.
-p 3306: 3306 Esto significa 3306 local a 3306 dentro de la ventana acoplable
-p 3307: 3306 Esto significa 3307 local a 3306 dentro de la ventana acoplable
-p 3308: 3306 Esto significa 3308 local a 3306 dentro de la ventana acoplable
-p 3309: 3306 Esto significa 3309 local a 3306 dentro de la ventana acoplable

Luego también pasamos un par de variables de entorno.
-e MYSQL_ROOT_HOST =% -e MYSQL_ROOT_PASSWORD = <establezca una contraseña aquí>

Poniendo todo junto ...


docker run --restart always --name mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/8.0:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:8.0

docker run --restart always --name mysql5.7 -v ~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.7:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.7

docker run --restart always --name mysql5.6 -v ~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.6:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.6

docker run --restart always --name mysql5.5 -v ~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.5:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.5

Después de cada ejecución de los comandos anteriores, debe obtener una identificación devuelta.
ejemplo: 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

Puede iniciar / reiniciar y acceder a cada terminal acoplable fácilmente a través del escritorio de Docker o simplemente tomar nota de las ID relacionadas y ejecutar a través del terminal.

Docker Desktop también le muestra todas las variables que pasó para que pueda validar.
Por supuesto, también puede acceder a la CLI aquí, detenerla, iniciarla o destruirla fácilmente.


$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p

Si el contenedor Docker ya se está ejecutando, ahora puede acceder a MySQL a través de su terminal localhost.

$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root

Ahora, si tiene problemas de acceso, recuerde asegurarse de que las cuentas de MySQL sean correctas y de que sus puertos y mapas estén correctos.
  • Se perdió la conexión con el servidor MySQL al "leer el paquete de comunicación inicial"
  • ERROR 1045 (28000): acceso denegado para el usuario 'root'@'192.168.0.5' (usando la contraseña: SÍ)

Ahora puede ver que todos están activos y disponibles, y que los Id. De servidor coinciden con lo que configuramos por archivo de cnf.

$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+