Saltar al contenido principal
InicioTutorialesSQL

Cómo instalar y configurar MySQL en Docker

Aprende a instalar y configurar bases de datos MySQL dentro de contenedores Docker. El tutorial incluye conceptos como la conexión a servidores MySQL, la ejecución de clientes MySQL para conectarse a contenedores, etc.
may 2024  · 12 min leer

MySQL es la herramienta de bases de datos relacionales más popular, con una cuota de mercado superior al 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 de pequeño tamaño a nivel empresarial.
  • Seguro: ofrece autenticación de usuarios, gestión de accesos y cifrado.
  • Alto rendimiento: conocido por su rapidez y eficacia en el tratamiento de consultas complejas y grandes volúmenes de datos.
  • Replicación y copia de seguridad: dispone de opciones de replicación de datos y copia de seguridad, lo que permite estrategias de recuperación en caso de catástrofe.

En cuanto al uso de MySQL dentro de contenedores Docker, bueno, eso es sólo un partido hecho en las nubes. Si ha trabajado con Docker antes, todos sus beneficios se aplican también a los contenedores Docker de MySQL:

  • Aislamiento y coherencia: La instancia de MySQL estará aislada de otros programas y dependencias, lo que evitará posibles conflictos.
  • Control de versiones: Docker le permite versionar toda su pila de software junto con MySQL. Esto significa que puede reproducir su entorno en cualquier momento, lo que facilita el desarrollo y las pruebas.
  • Escalabilidad y gestión de recursos: Con Docker, puede escalar su aplicación MySQL asignando fácilmente más recursos como memoria o CPU.
  • Gestión de la dependencia: Docker encapsula su instancia MySQL, lo que le permite gestionar diferentes versiones de la misma sin molestar a nada en su máquina local.

Lo más importante de todo es que su aplicación MySQL funcionará en cualquier lugar, no sólo en su ordenador.

Por lo tanto, hoy en día, usted aprenderá 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 MySQL Docker, 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 ejecución: deberías tener Docker Desktop ya instalado (instrucciones en nuestro tutorial Docker para Ciencia de Datos). Cuando esté plenamente operativo, en la parte inferior izquierda de la interfaz aparecerá una cría de ballena verde:

image2.png

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, la 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 sus conocimientos de SQL están un poco oxidados, puede repasar los temas más importantes de este curso de SQL...

Descarga de la imagen Docker oficial de MySQL

Comenzaremos 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. Con la palabra clave latest se descarga 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 diferentes propósitos.

image3.png

A continuación se indica cómo descargar la versión 8.2, a modo de ejemplo:

$ docker pull mysql:8.2

Una vez descargada la imagen, debería aparecer entre las imágenes Docker existentes:

image4.png

También es posible listar imágenes Docker a través del terminal:

$ docker images

image5.png

Acuérdate: Las imágenes Docker son planos para construir contenedores. Al igual que un plano 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 tiene experiencia en programación orientada a objetos, piense en las imágenes Docker como clases. Al igual que la creación de una única clase permite crear múltiples objetos, las imágenes Docker permiten crear múltiples contenedores a partir de ellas.

Ejecución y gestión de un contenedor de servidor MySQL

Ahora, vamos a crear nuestro primer contenedor a partir de la imagen mysql. Este es el comando que utilizaremos:

$ docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=strong_password -d mysql
  • runcrea 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 es test-mysql.
  • -e ENV_VARIABLE=valuela etiqueta -e crea una variable de entorno que será accesible dentro del contenedor. Es crucial configurar MYSQL_ROOT_PASSWORD para que podamos ejecutar comandos SQL más tarde 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 elimina 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 es mysql.

Si el comando devuelve una larga cadena de galimatías (el ID del contenedor), significa que el contenedor se ha iniciado. Puede comprobar su estado con docker ps:

image6.png

Recuerda: un contenedor Docker es un potente emulador de un sistema operativo. Aparte de ejecutar MySQL, puedes hacer cualquier tarea que normalmente harías con el terminal de tu ordenador desde dentro del contenedor.

Para acceder al terminal dentro de su contenedor, puede utilizar el siguiente comando:

$ docker exec -it container_name bash

Esto iniciará una sesión bash.

Conexión local 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 es sólo un nombre elegante para el comando de terminal mysql. Vamos a utilizarlo dentro de test-mysql's terminal:

1. Abra el terminal bash de test-mysql:

$ docker exec -it test-mysql bash

2. Conéctese 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 solicite.

image1.gif

También es posible conectarse al servidor MySQL fuera del contenedor. Por ejemplo, para conectarse desde su máquina anfitriona, puede instalar el cliente MySQL manualmente en su sistema.

Para instalar MySQL y su cliente en Windows, puede seguir las instrucciones de la guía oficial de instalación de MySQL.

Para Mac, puedes usar Homebrew:

$ brew install mysql

Para Linux o WSL2 (mi elección), puede utilizar sudo:

$ sudo apt update
$ sudo apt install mysql-client

Tras la instalación, si está ejecutando el contenedor, deténgalo y elimínelo:

$ 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 su puerto local 3307. Esto significa que cualquier tráfico enviado a su puerto local 3307 será reenviado al puerto 3306 del contenedor y su 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 "test-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 produzca 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 su máquina local, puede conectarse 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…

Configuración del contenedor MySQL

Puede configurar los contenedores MySQL para tantos ajustes utilizando 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 y la extensión estándar de 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. Este es el caso de nuestro contenedor test-mysql:

$ ls /etc/mysql/conf.d/ # Returns no output

En situaciones como ésta, debemos tomar las siguientes medidas de precaución:

1. Deténgase y retire el contenedor:

$ docker stop test-mysql; docker rm test-mysql

2. Cree un archivo de configuración vacío localmente (en su 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. Reinicie el contenedor enlazando los dos archivos vacíos .cnf:

$ 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 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.

Después de este paso, ¿qué tipo de configuraciones podemos cambiar? La respuesta depende de su caso de uso. A continuación nos ocuparemos de ellos.

¿Qué opciones debe configurar?

Mientras que la configuración por defecto para los contenedores Docker MySQL funciona para muchos escenarios comunes, debe 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 parámetro 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 parámetro 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 para consultas repetitivas, pero también consume más memoria y puede no ser eficaz para consultas dinámicas.
  • thread_pool_size: Este parámetro determina el número máximo de conexiones simultáneas que puede gestionar el servidor. Ajustar este valor en función de la 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 escuchar sólo en interfaces de red específicas, 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 parámetro controla el número máximo de conexiones simultáneas permitidas. El ajuste de 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 grupo de búferes y las operaciones de disco.

Otras modificaciones habituales

  • character_set_server: Esta opción establece el juego de caracteres por defecto para el servidor, garantizando la coherencia en la codificación y el tratamiento de los datos.
  • servidor_de_cotejo: 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, puede ejecutar el siguiente comando:

$ docker run -it --rm mysql:tag --verbose --help

Puede editar el archivo .cnf con cualquier editor de texto. Esta 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

La persistencia de los datos almacenados en sus contenedores MySQL es crucial por muchas razones:

  • Persistencia de datos: Cuando detienes o eliminas un contenedor, se pierden todos los datos, incluida tu base de datos. Desacoplar los datos del contenedor hace que estén siempre accesibles.
  • Compartir datos entre contenedores: Separar los datos del contenedor permite que varios contenedores tengan acceso a ellos. De este modo, puede evitar la duplicación de datos y simplificar la sincronización entre proyectos que utilizan 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, lo que ofrece una forma fiable de recuperarlos en caso de pérdida 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, puede mejorar el rendimiento de su aplicación en comparación con la dependencia de 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 se almacenan 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 su sistema de archivos local para el volumen. Una vez montado el volumen, todos los datos del contenedor se vincularán a él.

2. Reinicie 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 como se especifica en los documentos de imagen de MySQL.

Así, ahora, cualquier base de datos o tabla creada dentro de test-mysql se mantendrá 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 variaciones en un comando maestro final. Hay que parar y volver a sacar 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í que, aquí está 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 así como crea un nuevo volumen llamado final-mysql-data y lo monta.

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 cómo descargar y configurar imágenes MySQL, iniciar servidores MySQL dentro de contenedores, cómo modificar esos contenedores y añadir volúmenes para configuración personalizada y persistencia de datos.

Para saber más sobre el tema, recomiendo los siguientes recursos:

Gracias por leerme.

Temas

Comience hoy mismo su viaje de aprendizaje

Course

Introduction to SQL

2 hr
661.7K
Learn how to create and query relational databases using SQL in just two hours.
See DetailsRight Arrow
Start Course
Ver másRight Arrow
Relacionado

blog

SQL Server, PostgreSQL, MySQL... ¿cuál es la diferencia? ¿Por dónde empiezo?

En este tutorial, aprenderás algunas de las diferencias básicas entre los dialectos SQL y por dónde deberías empezar.
Mona Khalil's photo

Mona Khalil

5 min

blog

Tutorial: cómo instalar Python en macOS y Windows

Aprende a instalar Python en tu equipo personal con este tutorial paso a paso. Tanto si eres usuario de Windows como de macOS, descubre varios métodos para iniciarte en Python en tu equipo.
Richie Cotton's photo

Richie Cotton

14 min

tutorial

Tutorial de SQLAlchemy con ejemplos

Aprende a acceder y ejecutar consultas SQL en todo tipo de bases de datos relacionales utilizando objetos Python.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Ejemplos y tutoriales de consultas SQL

Si quiere iniciarse en SQL, nosotros le ayudamos. En este tutorial de SQL, le presentaremos las consultas SQL, una potente herramienta que nos permite trabajar con los datos almacenados en una base de datos. Verá cómo escribir consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

21 min

tutorial

Tutorial sobre cómo ejecutar consultas SQL en Python y R

Aprenda formas fáciles y eficaces de ejecutar consultas SQL en Python y R para el análisis de datos y la gestión de bases de datos.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Tutorial sobre cómo instalar R en Windows, Mac OS X y Ubuntu

Esta es una guía para principiantes diseñada para ahorrarte dolores de cabeza y un tiempo valioso si decides instalar R tú mismo.
Francisco Javier Carrera Arias's photo

Francisco Javier Carrera Arias

6 min

See MoreSee More