Instalar MySQL de la forma tradicional significa descargar un instalador, configurar un servicio del sistema, lidiar con conflictos de versiones si ya tienes otra base de datos instalada y esperar que el proceso de desinstalación realmente quede limpio cuando termines. Ejecutar MySQL con Docker se salta todo eso. Un solo comando descarga un servidor MySQL listo para usar en un contenedor aislado, y cuando terminas de experimentar, otro comando más lo elimina por completo: sin archivos sobrantes, sin servicios huérfanos, sin entradas en el registro.
Esta guía cubre todo lo que un principiante necesita para empezar a ejecutar bases de datos MySQL en contenedores: descargar e iniciar la imagen oficial de MySQL, establecer las variables de entorno que la configuran, conservar tus datos con volúmenes para que sobrevivan a un reinicio del contenedor, conectarte desde un cliente o una aplicación y administrar todo con Docker Compose. Al terminar, te sentirás cómodo levantando una instancia desechable de MySQL para desarrollo local en menos de un minuto.
¿Por Qué Ejecutar MySQL en Docker?
Poner tu base de datos en un contenedor aporta varias ventajas concretas frente a una instalación local tradicional:
- Aislamiento: tu contenedor de MySQL no toca el sistema de archivos de tu máquina anfitriona ni entra en conflicto con otras versiones de bases de datos que tengas instaladas.
- Desechabilidad: ¿hiciste un desastre experimentando con un esquema? Elimina el contenedor y empieza con uno nuevo en segundos, sin asistentes de desinstalación.
- Consistencia: exactamente la misma versión y configuración de MySQL funciona en tu laptop, en la máquina de un compañero y en tu pipeline de CI.
- Varias versiones lado a lado: ¿necesitas MySQL 5.7 para un proyecto y MySQL 8 para otro? Ejecuta ambas a la vez en puertos distintos sin que una instalación interfiera con la otra.
- Limpieza sencilla:
docker rmelimina el contenedor; eliminar el volumen asociado elimina los datos. Nada queda en tu sistema después.
Antes de Empezar
Necesitarás Docker instalado y en ejecución en tu máquina (Docker Desktop en Windows/Mac, o Docker Engine en Linux). Confirma que funciona con:
docker --version
No necesitas instalar MySQL en absoluto: el contenedor trae su propio servidor MySQL completo, así que no hay nada más que configurar de antemano.
Ejecutar Tu Primer Contenedor de MySQL
La imagen oficial de MySQL se mantiene en Docker Hub y es el punto de partida de casi toda configuración de MySQL en Docker. Inicia un contenedor con:
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=change-me \
-p 3306:3306 \
-d mysql:8.0
Desglose de cada opción:
--name my-mysql: le da al contenedor un nombre amigable para que puedas referirte a él después en lugar de usar un ID aleatorio.-e MYSQL_ROOT_PASSWORD=change-me: obligatorio. La imagen oficial se niega a iniciar sin una contraseña de root (o sin una opción explícita para omitirla), así que esta es la única variable de entorno que no puedes saltarte.-p 3306:3306: asocia el puerto 3306 de tu equipo con el puerto 3306 dentro del contenedor, el puerto predeterminado de MySQL, para que las herramientas cliente de tu máquina puedan alcanzarlo.-d: ejecuta el contenedor en modo desacoplado, en segundo plano, para que tu terminal quede libre.mysql:8.0: la imagen y su etiqueta. Fijar una versión específica (8.0) en lugar delatestsignifica que tu configuración no cambiará en silencio cuando salga una nueva versión mayor de MySQL.
Comprueba que se inició correctamente:
docker ps
docker logs my-mysql
Los registros mostrarán la secuencia de inicio de MySQL y terminarán con una línea como ready for connections cuando esté en marcha.
Variables de Entorno Útiles
Además de la contraseña de root obligatoria, la imagen oficial acepta varias otras variables de entorno que configuran la base de datos en el primer arranque:
MYSQL_DATABASE: crea automáticamente una base de datos con este nombre en la primera ejecución.MYSQL_USER/MYSQL_PASSWORD: crea un usuario que no es root con acceso a la base de datos indicada enMYSQL_DATABASE.MYSQL_ALLOW_EMPTY_PASSWORD: permite iniciar sin ninguna contraseña de root. Es cómodo para un contenedor desechable rápido, pero nunca es apropiado para nada que consideres “real”.
Una primera ejecución más completa para un proyecto local típico:
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=change-me \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=app_password \
-p 3306:3306 \
-d mysql:8.0
Esto te da una base de datos app_db lista para usar y una cuenta app_user limitada a ella, sin tener que tocar nunca la cuenta de root desde tu aplicación.
Conservar Tus Datos con Volúmenes
Este es el detalle que hace tropezar a casi todos los que empiezan con MySQL en Docker: por defecto, el sistema de archivos de un contenedor es efímero. Si detienes y eliminas el contenedor, cada tabla, fila y esquema que creaste desaparece con él. Para conservar tus datos, monta un volumen en el directorio de datos de MySQL, /var/lib/mysql.
Volumen con nombre (recomendado para la mayoría de los casos):
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=change-me \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
-d mysql:8.0
Docker crea y administra el volumen mysql-data por ti. Persiste aunque elimines el contenedor, y puedes volver a conectarlo a un contenedor nuevo más adelante con la misma opción -v.
Bind mount (cuando quieres los archivos de datos en tu equipo para respaldarlos o inspeccionarlos fácilmente):
docker run --name my-mysql \
-e MYSQL_ROOT_PASSWORD=change-me \
-v ~/mysql-data:/var/lib/mysql \
-p 3306:3306 \
-d mysql:8.0
Esto escribe los archivos de datos reales de MySQL en ~/mysql-data de tu máquina anfitriona. Es más fácil de respaldar con una simple copia de archivos, pero ata el contenedor a esa ruta específica del equipo.
De cualquier forma, la regla que debes recordar es simple: si /var/lib/mysql no está montado en un volumen, tus datos no sobrevivirán a un docker rm.
Conectarte a Tu Contenedor de MySQL
Desde dentro del contenedor, usando el cliente de MySQL que viene incluido con la imagen:
docker exec -it my-mysql mysql -u root -p
Se te pedirá la contraseña de root y luego aparecerás en un prompt normal mysql>.
Desde tu máquina anfitriona, usando cualquier cliente de MySQL que ya tengas instalado (MySQL Workbench, DBeaver, la CLI mysql o un controlador de MySQL de algún lenguaje de programación), conéctate a:
- Host:
127.0.0.1(olocalhost) - Puerto:
3306(o el puerto del equipo que hayas asociado con-p) - Usuario/contraseña: lo que hayas establecido con
MYSQL_USER/MYSQL_PASSWORD, orootconMYSQL_ROOT_PASSWORD
Desde otro contenedor en la misma red de Docker, haz referencia al contenedor de MySQL por su --name como nombre de host en lugar de 127.0.0.1: el DNS interno de Docker resuelve automáticamente los nombres de contenedor para los que comparten una red.
Usar Docker Compose para MySQL
Escribir comandos docker run largos se vuelve tedioso rápido, y la mayoría de los proyectos reales combinan MySQL con un contenedor de aplicación de todos modos. Docker Compose te permite definir toda la configuración en un solo archivo.
docker-compose.yml:
services:
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: change-me
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: app_password
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Inícialo con:
docker compose up -d
Deténlo (sin eliminar el volumen) con:
docker compose down
Observa que down elimina el contenedor pero deja intacto el volumen con nombre mysql-data, así que tus datos te estarán esperando la próxima vez que ejecutes docker compose up -d. Agrega -v a docker compose down solo cuando quieras borrar también los datos de forma explícita.
Mejores Prácticas para Ejecutar MySQL en Docker
- Fija una etiqueta de versión. Usa
mysql:8.0en lugar demysql:latest, para que undocker pullsin relación no te actualice de pronto a una nueva versión mayor a mitad de proyecto. - Monta siempre un volumen. Considera un
/var/lib/mysqlsin montar como una garantía de que eventualmente perderás datos. - Mantén los secretos fuera del control de versiones. Pasa las contraseñas mediante un archivo
.env(excluido de Git) o con Docker secrets en lugar de escribirlas directamente en undocker-compose.ymlque se sube al repositorio. - No expongas el puerto 3306 públicamente en un servidor con IP pública, a menos que tengas una razón específica y una regla de firewall que restrinja quién puede alcanzarlo. En la mayoría de las configuraciones, solo tu contenedor de aplicación necesita acceso, a través de la red interna de Docker.
- Respalda el volumen, no solo el contenedor. Ejecutar un
mysqldumpprogramado y enviarlo a un archivo fuera del contenedor es suficiente para la mayoría de los proyectos pequeños. - Asigna límites reales de recursos al contenedor (
--memory,--cpus) si se ejecuta junto con otros servicios en un host compartido, para que una consulta descontrolada no deje sin recursos a todo lo demás.
Errores Comunes que Debes Evitar
- Olvidar el volumen y luego sorprenderte de que los datos desaparecieron. Este es, por mucho, el error más común con MySQL en Docker: el contenedor “funcionaba bien” justo hasta que se recreó.
- Reutilizar el mismo nombre de contenedor sin eliminar antes el anterior.
docker run --name my-mysql ...falla con un error de “name already in use” si un contenedor detenido todavía tiene ese nombre; elimínalo primero condocker rm my-mysql. - Conectarte al puerto equivocado tras reasignarlo. Si asocias
-p 3307:3306, tus clientes del lado del equipo deben conectarse al3307, no al3306: el lado izquierdo de la asociación siempre es el puerto del equipo anfitrión. - Ejecutar la aplicación y la base de datos con una red mal configurada, como un contenedor de aplicación que intenta alcanzar MySQL en
127.0.0.1en lugar del nombre de servicio del contenedor de la base de datos: dentro de un contenedor,127.0.0.1se refiere a ese mismo contenedor, no al anfitrión ni a otro contenedor hermano.
Reflexiones Finales: Tu Base de Datos, Totalmente Desechable
Ejecutar MySQL en Docker convierte una configuración local antes complicada en un solo comando que puedes derribar y reconstruir cuando quieras. Las dos ideas que conviene tener presentes son las que los principiantes olvidan con más frecuencia: la variable de entorno -e MYSQL_ROOT_PASSWORD es obligatoria para poner en marcha un contenedor, y un volumen montado en /var/lib/mysql es lo que separa una base de datos en la que puedes confiar con datos reales de una que está a un docker rm de perderlo todo.
Empieza poco a poco: descarga la imagen, ejecuta un contenedor con un volumen con nombre y conéctate con un cliente que ya conozcas. Cuando eso te resulte natural, mueve la configuración a un docker-compose.yml junto con tu contenedor de aplicación y tendrás un entorno de base de datos local totalmente reproducible que inicia y se detiene con un solo comando, siempre.
