Te han contado maravillas de Docker y no sabes por dónde empezar; en esta oacación vamos a crear un contenedor que contenga Mysql y persistir los datos, para que a la hora de detener el proceso del contenedor nos quedemos con la información generada.
No voy a decir que es Docker si hay muchos sitios que lo hacen mejor de lo que yo lo haria, el Get Started de documentación oficial seria un buen punto de partida.
Si aún no lo tienes solo descárgalo desde el sitio oficial Docker y no hay que configurar nada adicional(no en modo noob dev)
Para verificar la instalacion lo poedes hacer desde la terminal
$ docker --version
Docker version18.09.0, build 4d60db4
Lo primero que hay que hacer es descargar el contenedor de Mysql con el siguiente comando.
$ docker run -d -p 33060:3306 --name mysql-db -e MYSQL_ROOT_PASSWORD=secret mysql
Con esta tenemos nuestro contenedor escuchando
CONTAINER ID IMAGE CREATED STATUS PORTS NAMES
b62caa4104ed mysql 5 minutes ago Up 5 minutes 33060/tcp, 0.0.0.0:33060->3306/tcp mysql-db
Para entrar al contenedor usamos un modo interactivo para asignar un TTY(terminal) y un STDIN abierto
$ docker exec -it mysql-db mysql -p
Donde:
Una vez que se ejecuta la línea nos pedirá la contraseña que definimos en MYSQL_ROOT_PASSWORD y estamos dentro del contenedor y podemos lanzar comandos a MYSQl.
En la parte inferior podemos ver un ejemplo de cómo creamos una base de datos.
$ docker exec -it mysql-db mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database demo;
Query OK, 1 row affected (0.26 sec)
mysql> show databases;
+--------------------+| Database |
+--------------------+
| demo |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
Cuando levantamos el contenedor creamos una interfaz al puerto 33060:3306 donde el contenedor utiliza el puerto 3306 pero en el host 33060
De esta forma podemos conectar el host mediante el Workbench.
Hasta este punto no persistimos los datos que se realicen en nuestro contenedor lo que significa que cuando terminamos con el proceso los cambios se perderán, para eso Docker nos dice que hay que utilizar volúmenes que no es otra cosa que una parte del disco Host se reserve para los datos generados en el contenedor(no el contenedor).
Para eso seguimos los siguientes pasos:
Eliminamos el proceso que corre el contenedor creado.
$ docker rm -f mysql-db
Eliminamos todos los volúmenes ya que Docker crea volúmenes temporales sin pedirte permiso.
$ docker volume prune
Creamos un volumen
$ docker volumecreate mysql-db-data
Verificamos que se haya creado el volumen
$ docker volume ls
DRIVER VOLUME NAME
local mysql-db-data
Levantamos nuevamente el Docker y agregamos el volumen con la opcion --mount
$ docker run -d -p 33060:3306 --name mysql-db -e MYSQL_ROOT_PASSWORD=secret --mount src=mysql-db-data,dst=/var/lib/mysql mysql
Entramos al contenedor de forma interactiva o desde el Workbench y creamos una base de datos
$ docker exec -it mysql-db mysql -p
...
mysql> create database demo;
Query OK, 1 row affected (0.32 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| demo || information_schema || mysql || performance_schema || sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
Terminamos el proceso tal como en el paso 1
$ docker rm -f mysql-db
Lanzamos nuevamente el proceso como en el paso 5
$ docker run -d -p 33060:3306 --name mysql-db -e MYSQL_ROOT_PASSWORD=secret --mount src=mysql-db-data,dst=/var/lib/mysql mysql
Entramos nuevamente al contenedor de forma interactiva y podemos ver que la base de datos que creamos se encuentra
$ docker exec -it mysql-db mysql -p
...
mysql> create database demo;
Query OK, 1 row affected (0.32 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| demo || information_schema || mysql || performance_schema || sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
Y de esta forma ya estamos trabajando con volúmenes donde persistimos los datos el el Host de forma que si queremos utilizar la base de datos solo hay que montar el volumen.
Y de esta forma ya estamos trabajando con contenedores, como pudieron ver se instaló el Workbench para hacer una conexión vía HTTP y así como lo hacemos al 127.0.0.1:33060 lo podemos hacer a un contenedor remoto.
Yo haría una pequeña corrección en la parte que dice: “Descargamos una imagen”, creo que ese comando se refiere a correr un contenedor, que en este ejemplo al no tener la imagen la descarga, pero el comando como tal no es para crear una una imagen. Creo que para métodos de enseñanza es mejor especificar la descarga de una imagen con
docker pull
y la ejecución del contenedor condocker run
porque en contextos más complejos podría confundir quedocker run
es para descargar imágenes.Saludos y excelente aporte.
Hola. Excelente ayuda para este tema. Ciertamente estuve pensando sobre kubernetes el cual gestiona geupo de contenedores ( los arranca, levanta, replica, etc) y no me imagino que sea practico que eso le ocurra a un contenedor de base de datos, precisamente porque se perderían dichos datos por la dinamica de éste. Yo supongo que, para el caso de las bases de datos es preferible no usarlas bajo entornos docker, sino que por el contrario, se utilice servicios disponibles en la nube qie sea dedicados y garanticem la persistencia ( firestore para el caso de NoSql y por ejemplo servicios de RDS para el caso de Sql ).
Este caso es perfectamente aplicable para un entorno de desarrollo local pero no para uno en producción que lo ideal seria montar tus servicios en la nube como lo comentas.
¿Y no valdría con definir un volumen? Así consigues la persistencia de los datos incluso cuando se apaga o reinicia el contenedor de la base de datos.
Una consulta si en ese caso se usa un contenedor de linux para que alli se aloje la BD, si persisterian los datos?
Nice!
Muchas gracias, funciono perfecto!
Es posible crear mi base de datos en un contenedor y compartilo con algien mas para que al correrlo, pueda ver esa base de datos ya creada e incluso agregar tablas?
Oye, que genial este aporte, muchísimas gracias es de mucho valor.
Genial! Muchas gracias!
Yo tengo este problema:)
¿Cómo lo soluciono?
Yo tengo este problema:

¿Cómo lo soluciono?
Excelente aporte, me encanto y me sirvió para montar mi servidor de base de datos
Para conectarse a mysql por workbench usen de host 0.0.0.0