Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas
Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas

miércoles, 23 de marzo de 2016

Docker: acceso interactivo a consola


Un contenedor docker puede haber sido arrancado sin mapeo de puertos y sin sesión interactiva. En esos casos podemos albergar dudas sobre qué está ocurriendo en él. Otras veces queremos descubrir qué directorio interno debemos mapear con un volumen para conservar los cambios. Todo eso es posible de averiguar abriendo una sesión interactiva de shell con nuestro contenedor sin alterar su estado.

Cogemos de nuevo el post anterior y los contenedores que se crearon:
$ sudo docker ps -a
CONTAINER ID        IMAGE               [...]   NAMES
87a11363c32f        wordpress:latest    [...]   WPwordpress         
1eda9845dc71        mysql:latest        [...]   WPmysql             

Vamos a hacer una incursión con sesión interactiva para administrar algo de ambos.

Acceder por shell a un contenedor en ejecución

"docker attach" solo permite una conexión simultánea. Es incómodo y además attach detiene la ejecución del contenedor cuando salimos de la sesión interactiva. Usaremos la fórmula siguiente para abrir tantos shell como deseemos y no afectar al estado del contenedor.
$ sudo docker exec -i -t 87a11363c32f bash

Para salir simplemente "exit"
root@87a11363c32f:/var/www/html# exit

Gestionamos algo del contenedor Wordpress
Al entrar vemos donde están los contenidos estáticos y los PHP de Wordpress. Deberíamos hacer un mapeo a un volumen externo.
root@87a11363c32f:/var/www/html# ls
index.php    readme.html wp-admin wp-comments-post.php  wp-config.php  
wp-cron.php  wp-links-opml.php  wp-login.php  wp-settings.php  wp-trackback.php
license.txt  wp-activate.php  wp-blog-header.php  wp-config-sample.php  wp-content     
wp-includes  wp-load.php   wp-mail.php   wp-signup.php    xmlrpc.php


Conexión a una base de datos dentro del contenedor
Vamos a conectarnos a la base de datos con el cliente propio del contenedor:
root@goku:~# sudo docker exec -i -t 1eda9845dc71 bash
root@1eda9845dc71:/# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
root@1eda9845dc71:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 5.7.11 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, 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                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

Hemos podido acceder al contenido, previa entrada a la consola del contenedor.

martes, 22 de marzo de 2016

Wordpress con docker y mysql

Uniendo los conceptos de docker de entradas anteriores del blog voy a proponerte una forma sencilla de desplegar un wordpress con contenedores docker.

La receta es tan sencilla como los 2 comandos siguientes y el paso final:
1.- Creamos la base de datos.
Le hacemos un mapeo del puerto (-p) por si queremos entrar a administrar o curiosear algo. No será necesario.
$ sudo docker run --name WPmysql -p 13307:3306 \
         -v /home/volumenes/WPmysql:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=mi-secreto -d mysql

30160004622edb51ef290fca4cf232b61ca519a674994c26a98127e6c424abc7

2.- Creamos el contenedor wordpress
$ sudo docker run --name WPwordpress --link WPmysql:mysql \
      -v /home/volumenes/WPwordpress/html:/var/www/html \
      -p 10080:80 -d wordpress
626c5706de2c062ecaa3479bd4f6abbcf96703d7353151dd2111d4e063bf3bf6

Debemos tener algo así:
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
626c5706de2c        wordpress:latest    "/entrypoint.sh apac   5 seconds ago       Up 4 seconds        0.0.0.0:10080->80/tcp     WPwordpress         
30160004622e        mysql:latest        "/entrypoint.sh mysq   6 seconds ago       Up 5 seconds        0.0.0.0:13307->3306/tcp   WPmysql             
3.- Navegamos para terminar de configurar
Recupero un viejo clásico de la informática de administración. Se trata del comando "lynx" que muestra por consola su "best-effort" de la página en cuestión. Es un browser en consola de texto.
$ lynx http://localhost:10080
Lógicamente no tienes porqué usar "lynx". Puedes usar cualquier navegador o acceder desde tu escritorio si tienes accesible el anfitrión del contenedor por su IP y al puerto 10080.

Comentario final
Tal vez te hayas dado cuenta de que hay algo de magia en la poca configuración de Wordpress y sin embargo parece que llega a la base de datos. El secreto está en el switch "--link". Lo ampliaremos en otro post. De momento disfruta de tu wordpress reluciente.

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:

lunes, 14 de marzo de 2016

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

Vamos con un ejemplo concreto de uso de contenedores docker. En esta entrada vamos a crear una base de datos de usar y tirar sin necesidad de enturbiar nuestro sistema host.

Concretamente vamos a crear un contenedor docker que:
  • El contenedor se llamará "mimysql". Recuerda que el nombre es único. Si repites el experimento te toca eliminar cada vez el contenedor o usar otro nombre.
  • Si no tenemos ninguna imagen mysql ya descargada, la imagen es la del registry y la versión será la última disponible (no la hemos especificado).
  • El demonio mysqld escuchará internamente (en el contenedor) en el puerto 3306 interno pero se mapeará al puerto 13306 del localhost (externo).
  • La contraseña del root de mysql será "mi-secreto".


Creación del contenedor

$ sudo docker run --name mimysql -p 13306:3306 \
           -e MYSQL_ROOT_PASSWORD=mi-secreto -d mysql
89a8e4f3e3d4673a8fd1b34ace7ac9a60dd90265dea6b9f92fe5fcdcd355cc54



Comprobamos que se ha creado

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
89a8e4f3e3d4        mysql:latest        "/entrypoint.sh mysq   9 seconds ago       Up 8 seconds        0.0.0.0:13306->3306/tcp   mimysql


Conexión a la base de datos

$ mysql --host 127.0.0.1 --port=13306 -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.
Y vemos que es funcional
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> show schemas;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| prueba             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)



Como se puede ver hemos alterado el estado de la base de datos creando un schema y por tanto del contenedor. Después de pararla de forma abrupta (kill) y de arrancarla (start), el contenido de la base de datos se mantiene.

Aunque el ejemplo demuestra que es posible alterar el estado del contenedor, eso va contra la naturaleza de los mismos. Los contenedores tienen que ser reemplazables y por tanto no contener datos ni las modificaciones de los mismos. En un próximo post voy a mostrar como hacerlo, pero si lo que quieres es una base de datos de prueba o test donde importar un backup y que puedes borrar sin problemas tal vez este post te sirva tal cual.