Creando un servidor de MySQL local con Docker

Docker es un software de manejo de contenedores que permite exportar tu código junto con la configuración del entorno en donde se encuentra de manera sencilla y liviana sin preocuparse por los cambios que puedan haber en el sistema operativo, mientras que MySQL es la base de datos relacional Open Source más popular.

El objetivo de este POST es explicar el paso a paso de la creación de un contenedor de MySQL de manera local que se pueda acceder desde otras aplicaciones instaladas en la misma máquina. Se usa un computador con Ubuntu 18.04 LTS para el tutorial.

Requerimientos

  • Docker Instalado

Descargando la Imagen desde Docker

El tener la imagen del servidor de MySQL en nuestro computador nos permitirá crear todos los contenedores que queramos de MySQL en nuestra máquina. Podríamos llegar a tener uno por cada proyecto que estemos desarrollando para no mezclar las bases de datos, para tener un orden lógico, o simplemente para que cada una de ellas no sea muy pesada.

Para obtener la imagen simplemente hacemos pull desde el repositorio oficial.

$ sudo docker pull mysql/mysql-server:latest

En este caso estaré trabajando con la última versión de MySQL, sin embargo se puede especificar la versión que deseas utilizar en vez de latest, por ejemplo  5.7, 5.7.24, 5.7.24-1.1.8 .

Ejecutando el contenedor a partir de la imagen

Ya teniendo la imagen estamos listos para ejecutarla. En este caso como queremos que además se pueda ejecutar desde fuera de los contenedores, y posiblemente desde Internet, debemos hacer un forward del puerto para poder acceder.

sudo docker run --name=MyMySQLServer -d -p 6603:3306 mysql/mysql-server:latest

En este caso llamamos al servidor MyMySQLServer en modo daemon (-d hace que se ejecute en el background), y este es el nombre que usaremos de ahora en adelante. En este caso además de ejecutarlo le instruimos a docker que haga un forward del puerto 6603 al 3306 de dentro de docker, por lo que si queremos acceder desde fuera del contenedor lo haremos en el puerto 6603 de la máquina host. 

Si bien el Servidor MySQL ya está corriendo, no sabemos cual es la clave de ROOT de MySQL, como este contenedor la genera de manera automática, simplemente debemos revisar los logs para ver cual es la clave de administrador.

sudo docker logs MyMySQLServer | grep GENERATED

Con docker logs obtenemos los logs de inicio del contenedor con MySQL, mientras que con grep filtramos el contenido para poder ver cual fue la clave de root generada al inicio. En este caso :

[Entrypoint] GENERATED ROOT PASSWORD: IMWop4h#0J0Bk@hLAk@n1uKuSUs

Ahora solo nos falta modificar la clave y permitir conexiones desde fuera del contenedor.

Modificando el servidor MySQL.

Si bien no podemos acceder aún al servidor MySQL desde afuera, si podemos hacerlo desde el mismo contenedor.

sudo docker exec -it MyMySQLServer mysql -uroot -p

Al ejecutar el comando nos preguntará la clave de root que es la que obtuvimos en el punto anterior. Simplemente copia y pega la clave obtenida anteriormente.

Ahora estamos dentro del servidor MySQL del contenedor.

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 119
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>

Antes que todo, cambiaremos la clave por una más fácil de recordar.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

Recomiendo no usar la clave password :P.

Ahora especificaremos al servidor que el usuario root puede acceder desde cualquier lado. Insisto, en mi caso es un servidor de desarrollo local, no recomiendo hacer esto en producción.

mysql> UPDATE mysql.user set host="%" where user="root";

En este momento tenemos todo para poder acceder desde fuera del contenedor a nuestra base de datos MySQL, lo único que debemos hacer es reiniciar el servicio. Siéntete libre de cerrar la ventana o simplemente escribir exit.

Reiniciando el contenedor.

Si bien podríamos acceder con bash directamente a la máquina, reiniciar el servicio utilizando docker es mucho más sencillo.

sudo docker restart MyMySQLServer

Ahora, para probar si todo está bien, puedes usar tu cliente mysql preferido para poder acceder al servidor. En este caso usaremos la línea de comandos para hacerlo más sencillo.

 mysql -u root -ppassword -h 127.0.0.1 -P 6603

Si realizamos todo de manera correcta podemos acceder al servidor MySQL de manera local en el puerto 6603 usuando el usuario root y password password.

Conclusión

Tener uno o más servidores MySQL de manera  local es bastante sencillo, y lo mejor es que no consumen recursos mientras no se estén ejecutando. Esto es perfecto para los que tenemos un laptop para desarrollar y queremos que la batería dure lo más posible, además de tener un orden lógico y poder diferenciar las bases de datos por proyectos.

 

 

 

 

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

Crear un túnel SSH para acceder a un servidor MYSQL Remoto

Mysql Remoto a Través de Túnel SSH

Un túnel SSH consiste en una conexión segura creada a partir de una conexión SSH. En general puede asegurar cualquier transferencia o protocolo inseguro. Por ejemplo podríamos hacer una transferencia a través de FTP segura usando este tipo de túneles.

En este caso nuestro foco no será solo encriptar la comunicación con la base de datos, si no que será darle acceso a un computador, por ejemplo de escritorio, al servidor de base de datos a través de un servidor que tenga acceso a ella.

¿ Por que haremos esto ?

Si bien podríamos dar el acceso directamente a nuestro computador a través de nuestra dirección IP esto podría transformarse en una brecha de seguridad. En especial si compartimos la red con más personas en nuestras oficinas o en nuestro trabajo. En mi caso en este momento estoy trabajando en un apart hotel, por lo que agregar la dirección IP del apart hotel no es una opción para mi. ( Ojo, si se puede a costa de seguridad ).

Read more

Base de datos de las instituciones financieras de Chile basada en la información del SBIF

Instituciones Financieras Chile – Base de datos de las instituciones financieras de Chile basada en la información del SBIF en SQL, CSV, PHP y JSON

Origen: GitHub – ctala/InstitucionesFinancierasChile: Base de datos de las instituciones financieras de Chile basada en la información del SBIF

Casi todas las cosas que comparto son debido a que no me gusta hacer el mismo trabajo más de una vez. En este caso estoy haciendo un modulo financiero para nuestro sistema ERP para conciliación bancaria, por lo que encontré que era buena idea tener la información de las instituciones bancarias de Chile.

Read more

Cómo Tener la misma zona horaria en Mysql y PHP

Tener las hora del servidor MySQL y de PHP sincronizadas permite que no tengamos problemas en el análisis de los datos de nuestras aplicaciones y/o sistemas, en especial si uno de los factores de medición dependen de la diferencia de estos tiempos. Acá veremos como tener la misma zona horaria para ambos servicios.

Suele suceder que cuando usamos funciones de Mysql que retornan la hora y además otras por parte de PHP, la hora en ambas no es la misma. Esto es debido a que las configuraciones de ambas no son la misma.

Ambas horas vienen desde la configuración del servidor, pero por defecto ambas están en la zona horaria UTC, así que no importa la hora que tengamos en el servidor, la hora de estos servicios será distinta si no las configuramos de manera adecuada.

A continuación como configurar ambas.

Configurando la zona horaria en el servidor MySQL

Si bien podemos editar directamente el archivo de configuración de MySQL, lo que haremos es crear un archivo distinto que solo posea la definición de la zona horaria. De esta manera evitamos perder esta información por alguna actualización.

  1. Creamos el archivo de configuración en la carpeta conf.d de mysql. Todos los archivos con extensión .conf serán cargados desde aquí.
  2. Definimos el timezone del archivo. Acá puedes usar diferencias horarias, o zonas horarias. Las diferencias horarias son contra UTC que es el : +00:00 .
  3. Reiniciamos el servidor de mysql para actualizar la información.

Si bien puedes usar el editor que quieras, yo usaré  VIM por costumbre.

#vim /etc/mysql/conf.d/date.conf

y en el contenido definimos nuestra zona horaria. En mi caso además de “America/Santiago” podría haber puesto “-03:00”.

default_time_zone='America/Santiago'

Ahora reiniciamos el servicio y debería estar funcionando.

# service mysql restart

Para corroborarlo, podemos loguearnos a mysql y ejecutar :

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-10 12:03:35 |
+---------------------+
1 row in set (0.00 sec)

Configurando la zona horaria en PHP

En este caso si editaremos directamente el archivo php.ini que se encarga de la configuración de php para apache. Si tienes otro servidor simplemente lo haces donde corresponda.

# vim /etc/php5/apache2/php.ini

Buscamos y editamos el siguiente contenido según corresponda :

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "America/Santiago"

Y en este caso reiniciamos el servidor de apache.

# sudo service apache2 restart

Eso sería todo, ahora tu BdD y aplicación web tienen la misma hora :).

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

MySQL con regiones, provincias y comunas de Chile

SQL Con la información de las regiones, provincias y comunas de Chile según Decreto Exento Nº 817

Origen: ctala/Regiones-Provincias-y-Comunas-de-Chile. · GitHub

Regiones, provincias y comunas de Chile

Al fin comencé con el desarrollo del nuevo sistema de Shipping / Envíos unificado, por lo que antes tenía que estandarizar las tablas con la información de las regiones, provincias y comunas en Chile.

Si bien encontré muchos códigos con esta información, ninguno era “Estándar”. Buscando en Internet encontré un link de la “Subsecretaría de Desarrollo Regional y Administrativo” el cual incluía la información necesaria para mantener un orden en la información a utilizar. El código en GITHUB compartido incluye las regiones y provincias con sus respectivos números según el documento mensionado.

¿ Ok, como obtengo el código ?

Directamente en GitHub

Si sigues el link en GitHub : https://github.com/ctala/Regiones-Provincias-y-Comunas-de-Chile. Puedes acceder directamente al código SQL.

Clonando el Repositorio

Al clonar el repositorio te quedas con una copia local, que luego puedes utilizar para ingresarla a la BdD.

git clone https://github.com/ctala/Regiones-Provincias-y-Comunas-de-Chile..git

Usando Composer.

Recomiendo esto cuando harás una integración usando el código. Por ejemplo en el plugin que estoy desarrollando usaré composer para incluirlo como librería.

composer require ctala/regiones-provincias-y-comunas-de-chile

Instalando el Código en la BdD

Una vez obtenido el código simplemente lo ingresamos a la BdD.

$ mysql -u MIUSUARIO -pMICLAVE MIBDD < sql/MysqlDUMP.sql

Y eso es todo :). Espero que a más de alguien le sirva y ayude a estandarizar el uso de las regiones, provincias y comunas en Chile.

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

¡MANTENGÁMONOS EN CONTACTO!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

Share to...