miércoles, 16 de marzo de 2016

Docker: crear una base de datos (2/2)

Este post es la continuación de este otro. Ahora vamos a mejorar un poco el planteamiento a la vez que introducimos un concepto nuevo.

Como ya hemos dicho el contenedor no debe contener estado alguno que lo convierta en una elemento valioso e irremplazable con datos. Tenemos varios mecanismos para hacer esto, pero el que vamos a ver hoy en acción es el de los volúmenes de docker. Se trata de mapear un directorio del host anfitrión para que sea accesible dentro del contenedor. Lógicamente lo que dejemos ahí desde cualquier extremo (host o contenedor) es visible para el contrario.

Siguiendo con el tema de la base de datos, supongamos que tenemos la carpeta /home/usuario/db y que es donde vamos a ubicar los schemas de nuestra mysql.
Creamos el contenedor desde cero indicando este volumen. La novedad es el switch -v:

$ sudo docker run --name mimysql2 -p 13307:3306 \
         -v /home/usuario/db:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=mi-secreto -d mysql
ebe6d5b6c4854a86a781e48386c5d6107b05ec6e10b16654feb5282028254257
Nos conectamos a ella y alteramos el estado.

$ mysql --host=127.0.0.1 --port 13307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.11 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2015, 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> show schemas;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
 
mysql> create schema prueba;
Query OK, 1 row affected (0.00 sec)
 
mysql> use prueba
Database changed

mysql> create table tabla_datos(id int(4),  nota varchar(20));
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into tabla_datos values (1,'hola mundo');
Query OK, 1 row affected (0.01 sec)
 
mysql> select * from tabla_datos;
+------+------------+
| id   | nota       |
+------+------------+
|    1 | hola mundo |
+------+------------+
1 row in set (0.01 sec)


Eliminamos el contenedor “mimysql”

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS                     NAMES
ebe6d5b6c485        mysql:latest        "/entrypoint.sh mysq   About a minute ago   Up About a minute   0.0.0.0:13307->3306/tcp   mimysql             
89a8e4f3e3d4        mysql:latest        "/entrypoint.sh mysq   About an hour ago    Up 51 minutes       0.0.0.0:13306->3306/tcp   some-mysql          
$ sudo docker rm -f ebe6d5b6c485
ebe6d5b6c485


Volvemos a crear un nuevo contenedor y le montamos el volumen donde está la base de datos.
$ sudo docker run --name mimysql -p 13307:3306 \
         -v /home/usuario/db:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=mi-secreto -d mysql
83f848a88181a04f4c55b782bfe8bea988fa6d7a5c5b7936ae3f112db246f01a
Nos conectamos a la base de datos y vemos si existe el schema que creamos con el otro contenedor.
$ mysql --host=127.0.0.1 --port 13307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.11 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2015, 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> show schemas;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| prueba             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
 
mysql> use prueba;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tabla_datos;
+------+------------+
| id   | nota       |
+------+------------+
|    1 | hola mundo |
+------+------------+
1 row in set (0.00 sec)

Si te has quedado con ganas de mucho más, aquí tienes algunos enlaces interesantes:

No hay comentarios: