Cómo crear un servicio MySQL con Docker. Parte 1.

Anteriormente habíamos visto cómo podíamos usar Docker para crear un tunel SSH a una base de datos RDS de AWS y usar docker compose para unir ese servicio con nuestra aplicación Rest.

Hoy vamos a ver cómo podemos crearnos nuestra base de datos MySQL con Docker en lugar de usar una base de datos de AWS.

Podemos lanzar desde nuestra consola un servicio MySQL utilizando el siguiente comando, sin necesidad de usar un fichero Dockerfile:

$ docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=password mysql

Vemos varias opciones que no habíamos visto hasta ahora. Vamos a comentarlas:

  • La opción -d (Deatached mode) sirve para ejecutar el contenedor en segundo plano.
  • La opción –name sirve para darle un nombre a la imagen. Si no indicamos ninguno, docker asigna un nombre a cada contenedor. Este nombre nos va a servir para hacer referencia después al contenedor.
  • La opción -e sirve para indicar variables de entorno. En este caso, hemos utilizado la variable de entorno MYSQL_ROOT_PASSWORD para indicarle a la imagen mysql cual va a ser la contraseña del usuario root.

Veamos los procesos de docker en ejecución (he ejecutado otro contenedor sin la opción –name para ver la diferencia):

Como podemos ver, tenemos dos contenedores mysql corriendo. En el primero, el nombre «interesting_goldwasser» ha sido asignado por docker al no indicarle nosotros ningún nombre con la opción –name. El segundo contenedor es al que le hemos dado un nombre.

Podemos ahora conectarnos al contenedor haciendo referencia al nombre (la opción -it es para conectarnos interactivamente (i) simulando una terminal tty (t) al contenedor):

$ docker exec -it interesting_goldwasser mysql -p

También podemos entrar dentro de la máquina ejecutando un terminal /bin/bash.

En la imagen anterior, vemos que hemos entrado en el contenedor y que somos usuario root (más adelante veremos cómo añadir seguridad y no utilizar el usuario root en nuestros contenedores).

Para poder borrar un contenedor en ejecución, lo haremos con la opción rm -f (forzando el borrado o si está parado simplemente con rm) e indicando el nombre del contenedor (si lo que queremos es pararlo, usamos la opción stop; y start para volver a arrancarlo):

$ docker rm -f interesting_goldwasser

Con esto ya hemos visto cómo podríamos crear un contenedor MySQL, pero esta forma tiene varias desventajas: por un lado, tenemos que ir indicando todas las opciones al ejecutar el contenedor y tenemos que recordarlas todas; por otro lado, cada vez que paramos el contenedor, perdemos todo lo que hemos hecho, ya que cuando un contenedor se destruye, los datos almacenados en él también se destruyen (por el principio de inmutabilidad de los contenedores).

Los volúmenes son la opción más recomendada en la mayoría de los casos para la persistencia de datos.

Al igual que con las imágenes, docker nos proporciona herramientas para trabajar con volúmenes. Por ejemplo, para crear un volumen, podemos hacerlo con el comando:

$ docker volume create myvolume

Podemos ver la información del volumen mediante ejecutando lo siguiente:

$ docker volume inspect myvolume

Ahora, si quisiéramos conectar nuestro contenedor MySQL con nuestro volumen, podemos hacerlo con el siguiente comando:

$ docker run -d -p 3306:3306 --name mysql-db  -e MYSQL_ROOT_PASSWORD=password -v myvolume:/var/lib/mysql mysql

La opción -v (- -volume o –mount), que es para indicar que queremos montar un volumen. El primer parámetro indica el nombre del volumen (si no existe lo crea en /var/lib/docker/volumes/{nombre_volumen}/_data, ruta a la que solo con permisos de root se puede acceder; si existe utiliza ese volumen) y el segundo es el destino del volumen en el contenedor, es decir, dónde montar ese volumen. En este caso es /var/lib/mysql que es donde mysql guarda los datos.

También podemos indicar una ruta distinta donde queramos que monte el volumen en nuestro host. Por ejemplo, el siguiente comando montaría el volumen en /home/samir/volumes/mysql:

$ docker run -d -p 3306:3306 --name mysql-db  -e MYSQL_ROOT_PASSWORD=password -v /home/samir/volumes/mysql:/var/lib/mysql mysql

En caso de no indicar ninguna fuente del volumen, docker creará un nuevo volumen de forma automática:

$ docker run -d -p 3306:3306 --name mysql-db  -e MYSQL_ROOT_PASSWORD=password -v /var/lib/mysql mysql

Podemos ver qué volumen se ha creado y asociado con el siguiente comando (–format «{{.Mounts}}» nos sirve para filtrar la información que queremos mostrar):

$ docker inspect mysql-db --format "{{.Mounts}}"

Categorías