MySQL en Docker: datos persistentes y acceso local
Para ejecutar MySQL en Docker necesitas una imagen compatible, un volumen y credenciales propias. El siguiente laboratorio utiliza MySQL 8.4 y publica el servicio únicamente en 127.0.0.1, con un puerto diferente del habitual del host para reducir conflictos.
La demostración es local. Si una aplicación también corre en Docker, normalmente puede conectarse por una red interna sin publicar la base en el host.
Crea archivos de credenciales
mkdir -p mysql-lab/secrets
cd mysql-lab
umask 077
openssl rand -base64 32 > secrets/root.txt
openssl rand -base64 32 > secrets/app.txt
printf 'secrets/\n*.sql\n' > .gitignore
docker volume create mysql_lab_data
Los archivos son privados y no deben entrar al repositorio. La imagen oficial admite variables terminadas en _FILE para determinadas credenciales; revisa sus opciones al cambiar de imagen.
Inicia la base de datos
docker run -d --name mysql-lab \
-p 127.0.0.1:3307:3306 \
-v mysql_lab_data:/var/lib/mysql \
--mount type=bind,src="$PWD/secrets",dst=/run/secrets,readonly \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/root.txt \
-e MYSQL_DATABASE=demo \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD_FILE=/run/secrets/app.txt \
mysql:8.4
docker logs --tail 50 mysql-lab
El primer arranque inicializa el directorio de datos y puede tardar. La cuenta app se crea para la base demo; úsala para practicar operaciones de aplicación, en lugar de utilizar root en todos los casos.
Las variables de inicialización no vuelven a configurar un volumen que ya contiene una base. Si cambias el archivo de contraseña después, debes rotarla mediante el procedimiento de MySQL; no elimines el volumen para “arreglar” una credencial sin respaldar.
Comprueba con SQL
Con un cliente MySQL instalado en el host, conecta y escribe la contraseña cuando se solicite:
mysql -h 127.0.0.1 -P 3307 -u app -p demo
Dentro del cliente, crea datos ficticios:
CREATE TABLE notas (
id INT PRIMARY KEY AUTO_INCREMENT,
texto VARCHAR(200) NOT NULL
);
INSERT INTO notas (texto) VALUES ('Prueba de persistencia');
SELECT id, texto FROM notas;
No escribas SQL directamente en la shell: el intérprete y el cliente de base de datos son contextos distintos. Si aparece acceso denegado, comprueba usuario, host de conexión y credenciales antes de otorgar permisos globales.
Verifica persistencia y respaldo
Reinicia el contenedor y vuelve a consultar la tabla. Los datos permanecen porque el volumen guarda el directorio de MySQL. Esa comprobación no sustituye un respaldo.
Para una copia lógica del laboratorio puedes usar el cliente correspondiente, con una cuenta que tenga los permisos necesarios:
mysqldump -h 127.0.0.1 -P 3307 -u app -p \
--single-transaction --no-tablespaces --set-gtid-purged=OFF \
demo > demo.sql
Revisa el código de salida y protege el archivo, que contiene datos. La consistencia y los permisos necesarios dependen de las tablas y opciones usadas. Comprueba la restauración en una base de prueba antes de considerar la copia utilizable.
Actualizar sin perder el control
No cambies de versión mayor reutilizando el mismo volumen sin consultar compatibilidad. Conserva respaldo, versión original y una copia de prueba. Una recreación correcta del contenedor no demuestra que todas las aplicaciones sigan siendo compatibles.
Para retirar el laboratorio, detén y elimina primero el contenedor. El volumen se conserva hasta que decidas expresamente eliminarlo y hayas revisado su contenido.
Preguntas frecuentes
¿Por qué MySQL no acepta conexiones inmediatamente?
La inicialización y la recuperación pueden tardar. Revisa logs y estado antes de cambiar puertos o credenciales; estar listado en docker ps no equivale a estar listo para consultas.
¿Puedo compartir root con mi aplicación?
No es una buena práctica. Utiliza una cuenta con permisos limitados a la base y operaciones que necesita la aplicación.
¿Eliminar el contenedor borra la base?
En este ejemplo los datos están en un volumen independiente. Eliminar también ese volumen puede destruirlos; revisa cada comando de limpieza.
En pocas palabras
MySQL en Docker requiere almacenamiento persistente y credenciales que no dependan de valores de ejemplo. La base debe exponerse solo donde se necesite y sus respaldos deben poder restaurarse.
Conclusión
Guarda datos de prueba, reinicia el contenedor y verifica que continúen allí. Después ensaya backup y restauración en otra instancia antes de utilizar el entorno con información importante.
Para continuar, revisa Docker: qué es y cómo usarlo para ejecutar contenedores y Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso.
