Existen muchas razones para montar una instancia de MySQL en Docker, por ejemplo a veces, necesitas tener dos instancias de  bases de datos MySQL funcionando en la misma computadora, sin conflictos entre ellas, Docker te permite hacer esto fácilmente.

¿Necesitas usar MySQL por un tiempo corto, pero no quieres instalarlo directamente en tu computadora? Con Docker, es posible crear un ambiente temporal para la base de datos sin alterar nada en el sistema.

Otras veces, las aplicaciones necesitan una versión específica de MySQL que no está disponible fácilmente, con Docker, se puede obtener la versión exacta que se necesite sin preocupaciones por conflictos con otras versiones, también es posible tener diferentes instancias con diferentes versiones de MySQL según requiera cada aplicación.

Para desarrolladores que trabajan en varios proyectos con requerimientos diferentes, utilizar MySQL dentro de Docker es una alternativa fácil y rápida para cambiar de versión de MySQL según se requiera para cada proyecto.

Se torna ideal para realizar pruebas de desarrollo, Docker hace que sea muy fácil crear un ambiente de prueba para tu base de datos, realizar una “copia” de la base de datos en un contenedor, probar cosas nuevas y, si algo sale mal, simplemente desecharlo, es como tener una mesa de trabajo separada para tus experimentos sin ensuciar todo el laboratorio.

También es una gran alternativa cuando el servidor MySQL no arranca, por ejemplo tras un upgrade fallido de la propia base de datos o del algún componente del sistema relacionado, puede resultar una buena forma de salir rápido del problema, indicar una instancia de MySQL en Docker y restaurar un respaldo.

En resumen, Docker es una gran herramienta que te permite mantener múltiples bases de datos MySQL en múltiples versiones en una misma computadora o servidor sin problemas, probar cosas nuevas sin riesgos, obtener la versión exacta que se necesita y mover tu base de datos a donde se quiera sin complicaciones.

Existen dos maneras de hacerlo, una es utilizar un volumen de Docker para almacenar los datos y otra es mantener los datos en una carpeta físicamente fuera del contenedor, cada una tiene sus ventajas y desventajas.

Si se utiliza un volumen, es más sencillo de mantener, de desechar en caso necesario y además se evitan conflictos de permisos, sin embargo, tiene la desventaja que tiene una performance de rendimiento mucho más baja, en caso de base de datos de gran tamaño esto se notara.

Archivo Docker

Como mencionamos hay dos maneras almacenar los datos, una es dentro del contenedor y otra afuera, debemos elegir la que más convenga según la ocasión.

Datos dentro del contenedor

Creamos un archivo llamado mysql.yml con el siguiente contenido modificando el password:

version: '3.7'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql57
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ESTABLECER-PASSWORD
      MYSQL_DATABASE: test
      MYSQL_USER: restore
      MYSQL_PASSWORD: ESTABLECER-PASSWORD
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - /tmp/mysql/:/tmp/mysql/

volumes:
  mysql_data:

Datos fuera del contenedor

Si en cambio por una cuestion de performance queremos los datos fuera del contenedor, primero creamos la carpeta necesaria ejecutando:

mkdir -p /var/docker/mysql

Luego creamos un archivo llamado mysql.yml con el siguiente contenido:

version: '3.7'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql57
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ESTABLECER-PASSWORD
      MYSQL_DATABASE: test
      MYSQL_USER: restore
      MYSQL_PASSWORD: ESTABLECER-PASSWORD
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - /var/docker/mysql:/var/lib/mysql
      - /tmp/mysql/:/tmp/mysql/

Explicación

La mayoría de las opciones se explican solas, las que no tanto como el valor image, es donde se asigna el nombre de la imagen Docker que se quiere crear, en este caso mysql57, se debe remplazar ESTABLECER-PASSWORD por un password real propio, en volumen se establecerá que carpetas o volúmenes se montara y en que rutas.

Las dos rutas dentro de volumen, la primera es donde se guardaran los datos de la base de datos, mientras que la ruta /tmp/mysql/ esta configurada dentro de volume para poder cambiar el socket, lo veremos a continuación.

Si queremos asignar una configuración especial al servidor podemos crear un archivo llamado my.cnf y luego agregarlo a volumen:

    volumes:
      - ./my.cnf:/etc/my.cnf
      - /var/docker/mysql:/var/lib/mysql
      - /tmp/mysql/:/tmp/mysql/

Por ejemplo, un valor que podemos modificar el Socket para conectarse desde fuera del contenedor, un ejemplo de my.cnf:

[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/tmp/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/tmp/mysql/mysql.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

El directorio /tmp/mysql/ justamente lo montamos en volume para poder modificar el socket en my.cnf y poder conectarnos desde afuera.

Levantar el servidor

Una vez que creamos los archivos y configuramos los valores que necesitamos, por último para levantar el contenedor ejecutamos

docker-compose -f mysql.yml up

Al haber modificado la ruta del socket, tambien debemos modificarlo a nivel del cliente para poder conectarnos desde consola editando /etc/my.cnf.d/client.cnf:

[client]
socket=/tmp/mysql/mysql.sock
host=localhost

[client-mariadb]
socket=/tmp/mysql/mysql.sock
host=localhost

Este tema se encuentra un poco más desarrollado en Problemas de conexión a MySQL desde PHP, localhost no funciona

Para probar si todo funciona basta con ejecutar

mysql -p

Conclusión

Como vemos, es una forma muy sencilla de levantar un servidor de base de datos y poder cambiar entre versiones rápidamente, en especial si estamos trabajando en un entorno de desarrollo y se requieren entornos particulares para cada proyecto, aunque también es una gran alternativa para salir de apuros en un servidor de producción ante una falla, no tan común aunque posible, del servidor de base de datos, igualmente, esta alternativa no se limita solo a MySQL, con ciertos cambios puede perfectamente ser utilizada con otros servicios ya sean de base de datos o de otro tipo.

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Alvaro De León

Subscribe now to keep reading and get access to the full archive.

Continue reading