curso
Cómo instalar y configurar MySQL en Docker
MySQL es la herramienta de base de datos relacional más popular, con una cuota de mercado de más del 40%. En comparación con sus competidores, PostgreSQL (16%) y Oracle Database (11%), sus cifras parecen muy buenas.
MySQL es popular porque es sencillo pero potente. Estas son sus mejores características:
- Relacional: sigue el modelo relacional y utiliza SQL para gestionar las bases de datos.
- Código abierto (licencia GNU): a la comunidad le encanta. A las empresas les encanta.
- Escalable: puede gestionar aplicaciones desde las de pequeño tamaño hasta las de nivel empresarial.
- Seguro: ofrece autenticación de usuarios, gestión de accesos y encriptación.
- Alto rendimiento: conocido por su velocidad y eficacia en el manejo de consultas complejas y grandes volúmenes de datos.
- Replicación y copia de seguridad: tiene opciones de replicación de datos y copia de seguridad, que permiten estrategias de recuperación ante desastres.
En cuanto a utilizar MySQL dentro de contenedores Docker, bueno, eso es simplemente una combinación hecha en las nubes. Si has trabajado antes con Docker, todas sus ventajas se aplican también a los contenedores Docker de MySQL:
- Aislamiento y coherencia: La instancia MySQL estará aislada de otros programas y dependencias, evitando posibles conflictos
- Control de versiones: Docker te permite versionar toda tu pila de software junto con MySQL. Esto significa que puedes reproducir tu entorno en cualquier momento, facilitando el desarrollo y las pruebas.
- Escalabilidad y gestión de recursos: Con Docker, puedes escalar tu aplicación MySQL asignando fácilmente más recursos como memoria o CPU.
- Gestión de la dependencia: Docker encapsula tu instancia MySQL, permitiéndote gestionar diferentes versiones de la misma sin molestar a nada en tu máquina local.
Lo más importante de todo es que tu aplicación MySQL funcionará en cualquier lugar, no sólo en tu ordenador.
Si quieres comparar MySQL con su segundo competidor más popular, consulta nuestro PostgreSQL vs. PostgreSQL. Comparación de MySQL.
Así pues, hoy aprenderás los fundamentos de la ejecución de MySQL en tándem con Docker. ¡Empecemos!
Requisitos previos
Como este artículo se centra en los contenedores Docker de MySQL, tiene algunos requisitos previos para seguir adelante:
- Línea de comandos/acceso al terminal: necesitas un entorno local con acceso al terminal. Si estás en un entorno Jupyter como Colab, por favor, cambia ahora.
- Una instancia de Docker en funcionamiento: deberías tener Docker Desktop ya instalado (instrucciones en nuestro tutorial Docker para la Ciencia de Datos). Cuando esté totalmente operativo, en la parte inferior izquierda de la interfaz aparecerá una cría de ballena verde:
y el comando docker --help
funciona sin errores en el terminal.
- Familiaridad básica con Docker: aunque explicaré todos los comandos utilizados en el artículo, una comprensión básica de Docker aumentará significativamente los beneficios que puedes obtener de este artículo.
- SQL: lo mismo ocurre con SQL - no explicaré ningún comando SQL utilizado en este artículo, ya que nos desviaría del tema principal. Si tus conocimientos de SQL están un poco oxidados, puedes repasar los temas más importantes de este curso de SQL.
Descargar la imagen Docker oficial de MySQL
Empezaremos descargando la imagen Docker oficial de MySQL con el siguiente comando:
$ docker pull mysql:latest
docker pull
requiere el nombre y la versión de la imagen con la sintaxis image:version
. Si utilizas la palabra clave latest
, descargarás la versión estable más reciente.
Si visitas la página oficial de imágenes de MySQL en Docker Hub, podrás ver muchas otras versiones para distintos fines.
Aquí tienes cómo descargar la v8.2, a modo de ejemplo:
$ docker pull mysql:8.2
Una vez descargada la imagen, debería aparecer entre tus imágenes Docker existentes:
También es posible listar imágenes Docker a través del terminal:
$ docker images
Recuerda: Las imágenes Docker son planos para construir contenedores. Igual que un plano te permite construir una casa, una imagen Docker contiene todas las instrucciones y componentes necesarios para crear una instancia en ejecución de una aplicación o servicio.
Si tienes conocimientos de programación orientada a objetos, piensa en las imágenes Docker como clases. Al igual que crear una única clase te permite crear múltiples objetos, las imágenes Docker te permiten crear múltiples contenedores a partir de ellas.
Ejecutar y gestionar un contenedor de servidor MySQL
Ahora, vamos a crear nuestro primer contenedor a partir de la imagen mysql
. Éste es el comando que utilizaremos:
$ docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=strong_password -d mysql
run
: crea un nuevo contenedor o inicia uno existente--name CONTAINER_NAME
: da un nombre al contenedor. El nombre debe ser legible y corto. En nuestro caso, el nombre estest-mysql
.-e ENV_VARIABLE=value
la etiqueta -e crea una variable de entorno que será accesible dentro del contenedor. Es crucial configurarMYSQL_ROOT_PASSWORD
para que podamos ejecutar comandos SQL posteriormente desde el contenedor. Asegúrate de guardar tu contraseña segura en un lugar seguro (no en tu cerebro).-d
: abreviatura de detached, la etiqueta-d
hace que el contenedor se ejecute en segundo plano. Si eliminas esta etiqueta, el comando seguirá imprimiendo registros hasta que el contenedor se detenga.image_name
: el argumento final es el nombre de la imagen a partir de la cual se construirá el contenedor. En este caso, nuestra imagen esmysql
.
Si el comando devuelve una larga cadena de galimatías (el ID del contenedor), significa que el contenedor se ha iniciado. Puedes comprobar su estado con docker ps
:
Recuerda: un contenedor Docker es un potente emulador de un sistema operativo. Aparte de ejecutar MySQL, puedes hacer cualquier tarea que harías normalmente con el terminal de tu ordenador desde dentro del contenedor.
Para acceder al terminal dentro de tu contenedor, puedes utilizar el siguiente comando:
$ docker exec -it container_name bash
Esto iniciará una sesión bash.
Conectarse localmente al contenedor del servidor MySQL
Todos los contenedores MySQL lanzan un servidor MySQL que incluye todo lo necesario para crear y gestionar bases de datos utilizando SQL. Para conectar con el servidor, los contenedores también vienen con un cliente MySQL que nos permite ejecutar consultas SQL. El cliente no es más que un nombre elegante para el comando de terminal mysql. Vamos a utilizarlo en el terminal de test-mysql
:
1. Abre el terminal bash de test-mysql
:
$ docker exec -it test-mysql bash
2. Conéctate al cliente como usuario root:
$ mysql -u root -p
Enter password: ...
mysql>
Estamos utilizando la etiqueta -u
para especificar el nombre de usuario (root
) y añadiendo la etiqueta -p
para introducir la contraseña cuando se te solicite.
También es posible conectarse al servidor MySQL fuera del contenedor. Por ejemplo, para conectarte desde tu máquina anfitriona, puedes instalar el cliente MySQL manualmente en tu sistema.
Para instalar MySQL y su cliente en Windows, puedes seguir las instrucciones de la guía oficial de instalación de MySQL.
Para Mac, puedes utilizar Homebrew:
$ brew install mysql
Para Linux o WSL2 (mi elección), puedes utilizar sudo
:
$ sudo apt update
$ sudo apt install mysql-client
Tras la instalación, si estás ejecutando el contenedor, deténlo y elimínalo:
$ docker stop test-mysql
test-mysql
$ docker rm test-mysql
A continuación, reiniciaremos el contenedor asignando un puerto del contenedor a un puerto de nuestra máquina local:
$ docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=strong_password -p 3307:3306 mysql
Este comando hace lo siguiente:
-p 3307:3306
: Asigna el puerto 3306 del contenedor (el puerto por defecto para MySQL) a tu puerto local 3307. Esto significa que cualquier tráfico enviado a tu puerto local 3307 será reenviado al puerto 3306 del contenedor y tu servidor MySQL será accesible en ese puerto.-d
: Vuelve a ejecutar el contenedor en modo separado.--name test-mysql
: Reutiliza el mismo nombre de contenedor "prueba-mysql".-e MYSQL_ROOT_PASSWORD=strong_password
: Establece de nuevo la contraseña de root para el servidor MySQL.mysql
: Especifica la imagen Docker a ejecutar, que es la imagen oficial de MySQL.
Después de que el terminal dé como resultado un nuevo ID para el contenedor, podemos comprobar las asignaciones de puertos:
$ docker port test-mysql
3306/tcp -> 0.0.0.0:3307
¡Fue un éxito! Ahora, desde tu máquina local, puedes conectarte al servidor en el puerto 3307 utilizando el cliente mysql
:
$ mysql --host=127.0.0.1 --port=3307 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.2.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates…
Certifícate en SQL
Configurar el Contenedor MySQL
Puedes configurar los contenedores MySQL para tantos ajustes mediante un archivo de configuración. Normalmente, el archivo se almacenará dentro de uno de los siguientes directorios del contenedor:
/etc/mysql/
/etc/mysql/conf.d
/etc/mysql/mysql.conf.d
Los directorios cambian de una imagen a otra. Pero el nombre de archivo y la extensión estándar para un archivo de configuración es my.cnf
. Si el archivo no existe en ninguno de los directorios enumerados anteriormente, significa que el contenedor necesita un archivo de configuración personalizado. Éste es el caso de nuestro contenedor test-mysql
:
$ ls /etc/mysql/conf.d/ # Returns no output
En situaciones como ésta, tenemos que tomar las siguientes medidas cuidadosas:
1. Detente y retira el recipiente:
$ docker stop test-mysql; docker rm test-mysql
2. Crea un archivo de configuración vacío localmente (en tu máquina):
$ sudo mkdir -p /etc/docker/test-mysql # Create a dir
$ sudo touch /etc/docker/test-mysql/my.cnf # Create a config file inside dir
3. Reinicia el contenedor enlazando los dos archivos .cnf
vacíos:
$ docker run \
--name test-mysql \
-v /etc/docker/test-mysql:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=strong_password \
-d mysql
Estamos escribiendo una nueva etiqueta: -v
, que es la abreviatura de volumen. La etiqueta puede utilizarse para enlazar directorios entre el contenedor y la máquina local. En la jerga informática, este proceso se denomina montaje.
Así, en el comando anterior, estamos montando el directorio local /etc/docker/test-mysql
en el directorio /etc/mysql/conf.d
del contenedor. Esto enlazará el contenido de ambos directorios. Cualquier cambio realizado en cualquiera de los dos directorios se reflejará en ambos.
El montaje nos permite editar el archivo my.cnf
en nuestra máquina local para cambiar las configuraciones de los contenedores Docker. Y lo mejor es que las configuraciones modificadas persistirán en nuestra máquina local incluso después de detener o eliminar el contenedor. Será reutilizable.
Entonces, después de este paso, ¿qué tipo de configuraciones podemos cambiar? La respuesta depende de tu caso de uso. Los trataremos a continuación.
¿Quieres obtener la certificación Docker? ¡Consulta nuestra guía para obtener una certificación Docker!
¿Qué opciones debes configurar?
Aunque la configuración por defecto de los contenedores Docker MySQL funciona para muchos escenarios comunes, debes modificar ciertos ajustes para optimizar el rendimiento, la seguridad y el uso de recursos. Estas son algunas de las opciones de configuración que se modifican con más frecuencia:
Rendimiento
- innodb_buffer_pool_size: Este ajuste determina la cantidad de memoria asignada a la reserva de búferes de InnoDB, que almacena en caché los datos a los que se accede con frecuencia para una recuperación más rápida. Aumentar este valor puede mejorar el rendimiento para cargas de trabajo de lectura intensiva, pero también consume más memoria.
- query_cache_size: Este ajuste controla el tamaño de la caché de consultas, que almacena las consultas ejecutadas anteriormente para una reejecución más rápida. Aumentar este valor puede mejorar el rendimiento de las consultas repetitivas, pero también consume más memoria y puede no ser eficaz para las consultas dinámicas.
- thread_pool_size: Este ajuste determina el número máximo de conexiones simultáneas que puede manejar el servidor. Ajustar este valor en función de tu carga de tráfico prevista puede optimizar la utilización de los recursos y evitar cuellos de botella.
Seguridad
- dirección-bind: Esta opción restringe el servidor MySQL para que escuche sólo en determinadas interfaces de red, limitando el acceso desde fuentes no autorizadas.
- mysql_bind_host: Esta configuración permite vincular el servidor MySQL a direcciones IP específicas en lugar de escuchar en todas las interfaces.
- validate_password_policy: Esta opción permite establecer requisitos de contraseña más estrictos para mejorar la seguridad.
Utilización de los recursos
- max_connections: Este ajuste controla el número máximo de conexiones simultáneas permitidas. Ajustar este valor puede evitar el agotamiento de los recursos y garantizar un funcionamiento eficaz del servidor.
- innodb_file_per_table: Esta opción almacena cada tabla InnoDB en un archivo independiente, lo que mejora potencialmente el rendimiento pero aumenta los requisitos de espacio de almacenamiento.
- innodb_io_capacity: Esta opción establece las IOPS (operaciones de entrada/salida por segundo) estimadas para el sistema de almacenamiento, lo que permite al motor optimizar el uso del conjunto de búferes y las operaciones de disco.
Otras modificaciones comunes
- character_set_server: Esta opción establece el juego de caracteres por defecto para el servidor, garantizando una codificación y un tratamiento coherentes de los datos.
- collation_server: Esta opción determina las reglas de cotejo por defecto utilizadas para la ordenación y comparación de datos de caracteres.
- log_bin: Esta opción permite el registro binario de la actividad del servidor, lo que puede ser útil para la resolución de problemas y la replicación.
Para ver la lista completa de opciones de configuración, puedes ejecutar el siguiente comando:
$ docker run -it --rm mysql:tag --verbose --help
Puedes editar el archivo .cnf
con cualquier editor de texto. Ésta es la sintaxis que debes seguir:
[mysqld]
max_connections=200
other_params=value
...
Cómo conservar los datos almacenados en el contenedor Docker de MySQL
Persistir los datos almacenados en tus contenedores MySQL es crucial por muchas razones:
- Persistencia de los datos: Cuando detienes o eliminas un contenedor, se pierden todos los datos, incluida tu base de datos. Desacoplar los datos del contenedor los hace siempre accesibles.
- Compartir datos entre contenedores: Separar los datos del contenedor permite que varios contenedores tengan acceso a ellos. De esta forma, puedes evitar la duplicación de datos y simplificar la sincronización entre proyectos que utilicen los mismos datos.
- Portabilidad y copia de seguridad: se puede hacer fácilmente una copia de seguridad de los datos persistentes y compartirlos de forma independiente, proporcionando una forma fiable de recuperarlos en caso de pérdida de datos o borrado accidental.
- Mejora del rendimiento y la escalabilidad: Al almacenar los datos a los que se accede con frecuencia en un almacenamiento persistente como los SSD, puedes mejorar el rendimiento de tu aplicación en comparación con confiar en la capa de escritura del contenedor, que suele ser más lenta.
El proceso es el que ya hemos visto: vamos a crear un volumen y montarlo donde estén almacenados los datos en nuestro contenedor. Estos son los pasos:
1. Crea un volumen:
$ docker volume create test-mysql-data
El comando volume create
crea un almacenamiento dedicado en tu sistema de archivos local para el volumen. Una vez montado el volumen, todos los datos del contenedor se vincularán a él.
2. Reinicia el contenedor con el volumen montado:
$ docker stop test-mysql; docker rm test-mysql
$ docker run \
--name test-mysql \
-v test-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=strong_password \
-d mysql
Esta vez, la sintaxis tiene este formato: -v volume_name:directory_in_container
. Todos los volúmenes creados deben montarse en el directorio /var/lib/mysql
, tal y como se especifica en la documentación de la imagen de MySQL.
Así que, ahora, cualquier base de datos o tabla creada dentro de test-mysql
persistirá localmente, incluso después de que el contenedor se detenga o se elimine.
El mando final
A lo largo del artículo, nuestro comando docker run
ha evolucionado significativamente. Así que vamos a reunir todas sus variantes en un comando maestro final. Tenemos que parar y volver a quitar el contenedor. Eliminaremos también el volumen para empezar de cero:
$ docker stop test-mysql; docker rm test-mysql
$ docker volume rm test-mysql-data
Así pues, aquí tienes el comando maestro final:
$ docker run \
--name final-mysql \
-e MYSQL_ROOT_PASSWORD=strong_password \
-p 3307:3306 \
-v /etc/docker/test-mysql:/etc/mysql/conf.d \
-v final-mysql-data:/var/lib/mysql \
-d mysql
Este comando monta nuestro archivo local anterior my.cnf
en la ubicación deseada, además de crear un nuevo volumen llamado final-mysql-data
y montarlo.
Gestión de configuraciones MySQL complejas con Docker Compose
Para configuraciones más avanzadas que impliquen varios contenedores, como ejecutar MySQL junto con otros servicios (por ejemplo, servidores web o backends de aplicaciones), Docker Compose simplifica el proceso permitiéndote definir y gestionar aplicaciones multicontenedor con un único archivo de configuración.
Aquí tienes un ejemplo básico de un archivo docker-compose.yml
para un contenedor MySQL:
version: '3.9'
services:
db:
image: mysql:8.3.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: strong_password
MYSQL_DATABASE: example_db
MYSQL_USER: user
MYSQL_PASSWORD: user_password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
- ./mysql-config:/etc/mysql/conf.d
volumes:
db_data:
Pasos para utilizar Docker Compose:
- Crea un archivo
docker-compose.yml
: Guarda el archivo de configuración en el directorio de tu proyecto. - Inicia los servicios: Ejecuta el siguiente comando para iniciar todos los servicios definidos en el archivo:
docker-compose up -d
- Detén los servicios: Cierra los servicios cuando hayas terminado:
docker-compose down
Ventajas de Docker Compose para MySQL:
- Configuración simplificada: Gestiona las configuraciones, puertos y volúmenes de MySQL en un único archivo.
- Escalado más fácil: Amplía fácilmente la base de datos o intégrala con otros servicios de tu pila de aplicaciones.
- Datos persistentes: Gestiona automáticamente los volúmenes para la persistencia de los datos en los reinicios de los contenedores.
Utilizar Docker Compose es especialmente útil para gestionar varios entornos (por ejemplo, desarrollo, preparación y producción) o cuando se colabora con equipos.
Conclusión
Este artículo ha cubierto aspectos esenciales de la ejecución y gestión de bases de datos MySQL dentro de contenedores Docker. Hemos aprendido a descargar y configurar imágenes MySQL, a iniciar servidores MySQL dentro de contenedores, a modificar esos contenedores y a añadir volúmenes para la configuración personalizada y la persistencia de datos.
Para saber más sobre el tema, te recomiendo los siguientes recursos:
- Introducción a Docker para la ciencia de datos
- Curso de Introducción a Docker
- Contenedores Docker y Kubernetes para el aprendizaje automático
- Documentación de la imagen Docker de MySQL
- MySQL Reference Manual
¡Gracias por leer!
Conviértete en Ingeniero de Datos
Preguntas frecuentes
¿Puedo utilizar Docker Compose para gestionar varios contenedores MySQL?
Sí, Docker Compose es una herramienta excelente para gestionar varios contenedores Docker, incluido MySQL. Puedes definir las configuraciones de tus servicios MySQL en un archivo docker-compose.yml
, lo que te permitirá iniciar, detener y gestionar varios servicios con un solo comando.
¿Cómo actualizo MySQL a una versión más reciente en un contenedor Docker?
Para actualizar MySQL en un contenedor Docker, tienes que extraer la nueva versión de la imagen Docker de MySQL y luego volver a crear tu contenedor con esta nueva imagen. Asegúrate de que tienes copias de seguridad de tus datos antes de proceder a la actualización.
¿Puedo ejecutar varios contenedores MySQL en el mismo host?
Sí, puedes ejecutar varios contenedores MySQL en el mismo host. A cada contenedor se le debe asignar un puerto único en el host utilizando la opción -p
para evitar conflictos de puertos.
¿Cuáles son las mejores prácticas de seguridad para ejecutar contenedores MySQL?
Las mejores prácticas de seguridad incluyen no exponer los contenedores MySQL a la Internet pública sin las medidas de seguridad adecuadas, utilizar contraseñas seguras, actualizar regularmente las imágenes Docker y MySQL, y utilizar secretos Docker para la información sensible como las contraseñas.
¿Cómo puedo automatizar la copia de seguridad de las bases de datos MySQL en Docker?
Puedes automatizar las copias de seguridad creando una tarea cron en la máquina anfitriona que utilice docker exec
para ejecutar mysqldump
dentro del contenedor. Alternativamente, puedes utilizar volúmenes Docker para persistir los datos y gestionar las copias de seguridad directamente desde el host.
¿Puedo conectarme al contenedor Docker MySQL desde otro contenedor?
Sí, puedes conectarte desde otro contenedor asegurándote de que ambos contenedores están en la misma red Docker. Puedes utilizar el nombre del contenedor como nombre de host al conectarte.
¿Cómo puedo solucionar los problemas de conexión con mi contenedor MySQL?
Soluciona los problemas de conexión comprobando si el contenedor se está ejecutando (docker ps
), verificando las asignaciones de puertos (docker port
), comprobando las configuraciones de red y asegurándote de que el servidor MySQL dentro del contenedor está configurado para aceptar conexiones de tu servidor o de otros contenedores.
¿Es posible utilizar un archivo de configuración MySQL personalizado sin montarlo desde el host?
Sí, puedes crear un archivo de configuración personalizado dentro del propio contenedor. Sin embargo, es más habitual montarlo desde el host para facilitar su gestión y persistencia.
¿Cómo puedo controlar el rendimiento de mi contenedor MySQL?
Puedes controlar el rendimiento utilizando herramientas como mysqladmin
para métricas específicas de MySQL, el comando stats integrado en Docker (docker stats
), o soluciones de monitorización de terceros como Prometheus con exportadores para Docker y MySQL.
¿Qué debo hacer si mi contenedor Docker MySQL se bloquea?
Si tu contenedor se bloquea, comprueba primero los registros utilizando docker logs
para identificar cualquier error. Asegúrate de que tu configuración y las variables de entorno son correctas, y comprueba que no hay limitaciones de recursos (CPU, memoria). Reinicia el contenedor y controla su rendimiento.
Soy un creador de contenidos de ciencia de datos con más de 2 años de experiencia y uno de los mayores seguidores en Medium. Me gusta escribir artículos detallados sobre IA y ML con un estilo un poco sarcastıc, porque hay que hacer algo para que sean un poco menos aburridos. He publicado más de 130 artículos y un curso DataCamp, y estoy preparando otro. Mi contenido ha sido visto por más de 5 millones de ojos, 20.000 de los cuales se convirtieron en seguidores tanto en Medium como en LinkedIn.
¡Comienza hoy tu viaje de aprendizaje!
programa
Containerization and Virtualization
curso
Intermediate Docker
blog
SQL Server, PostgreSQL, MySQL... ¿cuál es la diferencia? ¿Por dónde empiezo?
tutorial
Introducción a los disparadores SQL: Guía para desarrolladores
Oluseye Jeremiah
13 min
tutorial
Base de datos Azure SQL: Configuración y gestión paso a paso
Anneleen Rummens
25 min
tutorial
Tutorial de SQLAlchemy con ejemplos
tutorial
Ejemplos y tutoriales de consultas SQL
tutorial