Cómo crear un contenedor de Docker con MySQL
¿Necesitas tener una base de datos MySQL local? Aprende cómo utilizar docker y crear un fichero docker-compose.yml para facilitar el proceso.
Estos días me encuentro trabajando bastante con bases de datos MySQL, y necesito realizar algunas pruebas con consultas SQL en un entorno controlado.
Normalmente las aplicaciones ejecutan las consultas contra servidores destinados a ello y clasificados por entornos: desarrollo, producción, etc. Cuando necesitas hacer pruebas lo mejor es tener un entorno aislado para ti, lo que no siempre es posible. La siguiente mejor opción es levantar un MySQL local para hacer pruebas.
Una forma de tener un servidor de MySQL local es instalar el paquete de mysql con gestores de paquetes como apt
/ apk
en linux o brew
en MacOS. Si usamos docker tenemos algunas ventajas como la flexibilidad que ofrece para tener múltiples versiones, lo fácil que es eliminar dependencias o la posibilidad de ejecutarlo en cualquier hardware prácticamente.
En el post de hoy quiero enseñar cómo utilizar docker
y docker-compose
para gestionar contenedores con MySQL, así como su persistencia de datos y conexión.
Crear un contenedor de docker con MySQL
Para crear un contenedor de docker con mysql, es tan simple como ejecutar el siguiente comando:
docker run --name mysql --rm -d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysql_data:/var/lib/mysql mysql:8.0
Explicación del comando:
- docker run: crea y ejecuta un nuevo contenedor a partir de una imagen. Documentación.
- Opción -d: ejecuta el proceso en segundo plano.
- Opción --rm: elimina automáticamente el contenedor cuando se para.
- --name mysql: asingamos el nombre 'mysql' al contenedor.
- Opción -e: sirve para pasar variables de entorno. En este caso configuro la contraseña para el usuario root.
- Opción -p: enlaza el puerto de nuestra máquina con el del contenedor. En este caso es el usado por mysql, 3306.
- Opción -v: crea un volumen para persistir los datos de mysql, de forma que nuestras tablas existan tras reiniciar el contenedor.
- mysql:8.0: imagen de docker del contenedor. Puedes explorar otros tags de mysql en dockerhub.
Siéntete libre de modificar las opciones para adaptar el comando a tus necesidades.
Puedes ver los contenedores en ejecución el comando docker ps:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8b8aad81107 mysql:8.0 "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
Para parar el servidor, es tan sencillo como ejecutar el comando docker stop <id>
, pudiendo pasarle como id el nombre del contenedor, en este caso, mysql.
Conexión a la base de datos local
Nuestro contenedor de docker tiene el puerto 3306 abierto, y enlazado a nuestro host en el puerto 3306. Por tanto, nos podemos conectar a 127.0.0.1:3306 con el usuario/contraseña definidos (root/root para el ejemplo).
Puedes usar tu gestor de bases de datos favorito o el propio CLI:
mysql -h 127.0.0.1 --port 3306 -u root -proot
Utilizando docker-compose para facilitar el proceso
Suele ser más cómodo tener un fichero docker-compose.yml
que contenga las dependencias de nuestro proyecto, que esté incluido en el repositorio y cualquier persona pueda ejecutarlo sin tener que preocuparse (más allá de tener docker instalado).
Dejo como ejemplo un fichero de docker-compose, equivalente al comando de docker anterior para el mysql, y que además añade un cliente web de SQL llamado adminer y es accesible en http://localhost:8080 desde tu navegador.
Para crear los servicios ejecuta el siguiente comando:
docker-compose up -d
La opción -d ejecuta el comando en segundo plano. Si quieres ver los logs puedes acceder con docker-compose logs mysql o lanzarlo sin dicha opción.
Para parar los contenedores podemos usar docker-compose stop
y docker-compose down
para eliminarlos. Si además queremos eliminar los volúmenes, simplemente ejecuta docker-compose down -v
.
version: '3.3'
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
adminer:
image: adminer
ports:
- "8080:8080"
depends_on:
- mysql
links:
- mysql
volumes:
mysql_data:
Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.