Publicidad

Un contenedor docker MySql para todos los proyectos web


Por Alex el 30/04/2024, Comentar el artículo

Comparte este artículo:      




Es bastante normal tener diferentes proyectos web que utilizan diferentes contenedores de docker y a su vez cada uno pueda tener su propio MySql incorporado … pero … podemos configurar un MySql para todos los proyectos web.


En lugar de que cada vez que creamos una aplicación web crear un entorno completo, podemos, muy fácilmente, centralizar el servidor de base de datos en un docker externo y utilizarlo desde cualquier proyecto, siendo accesible no solo desde otros contenedores sino desde entornos en Vagrant o desde el propio host.

Por ejemplo, Laravel sail crea por defecto un entorno completo PHP + MySql o cuando creamos un fichero docker-compose es muy normal añadir el contenedor de MySql.

Para separar el contenedor de base de datos, en el artículo nos centramos en MySql, pero la misma filosofía podríamos utilizar para postgreSQL o mongoDB, vamos a crear un proyecto solo para el MySql.

El proyecto tendrá la siguiente estructura:

Estructura proyecto docker compose

  • Backup, directorio para poner los backups de las bases de datos
  • Config, directorio donde pongo el fichero de configuración de MySql o ficheros de creación de bases de datos al arrancar los contenedores.
  • Data, es el directorio donde se guardan las base de datos de MySql y se puede poner donde queráis, yo lo dejo en el proyecto por comodidad.
  • docker-compose.yml, el fichero de docker con la siguiente configuración
    
    services:
      mysql:
        image: 'mysql:8.0'
        container_name: 'mysql_dev'
        ports:
          - '3306:3306'
        environment:
          MYSQL_ROOT_PASSWORD: 'root'
          MYSQL_ROOT_HOST: '%'
          MYSQL_PASSWORD: 'root'
        volumes:
          - './Data:/var/lib/mysql'
        networks:
          - net_mysql
    
        command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
    
    networks:
      net_mysql:
          driver: bridge
    
    
  • Makefile, este es un fichero bash para crear comandos y poder ejecutarlos con un alias
    
    #!/bin/bash
    
    U_ID = $(shell id -u)
    
    up: ## start containers
    	@echo 'Iniciando containers: UserUID=${U_ID} docker-compose up -d'
    	UserUID=${U_ID} docker-compose up -d 
    
    stop:
    	@echo 'Parando containers:  docker-compose stop'
    	UserUID=${U_ID}  docker-compose stop
    
    down:
    	@echo 'Parando containers:  docker-compose down'
    	UserUID=${U_ID}  docker-compose down
    
    mysql:
    	UserUID=${U_ID} docker exec -it --user ${U_ID} mysql_dev mysql -u root -proot
      
    shell:
    	UserUID=${U_ID} docker exec -it --user ${U_ID} mysql_dev bash
    
    build:
    	@echo 'Reiniciando containers: UserUID=${U_ID} docker-compose build'
    	UserUID=${U_ID} docker-compose build
    
Así con:

  • make up se crea el contenedor de MySql
  • make stop, se paran
  • make down, se paran y se borran
  • make mysql, entramos en la consola de MySql
  • make shell, entramos en el servidor de MySql
  • make build, reconstruir el contenedor

Para utilizar make tenemos que estar en el directorio del proyecto.

Y ahora solo queda probar y arrancarlo.

Podéis descargar el código desde github:
https://github.com/depruebas/docker-compose-mysql
br> Arracamos el container

make up

Ahora vamos a obtener la IP del contenedor de MySql para saber donde tenemos que conectarnos desde otros contenedores.

docker inspect 7c1391d6e988 | grep IPAddress

Este numero 7c1391d6e988 es el id del contenedor que lo obtenemos con la instrucción docker ps

Obtener la IP de un contenedor

Ahora hay que probar si podemos conectarnos al MySql de docker.

Para administrarlo y porbar si funciona se puede utilizar MySql Workbench. Servidor 172.27.0.2:3306 y el usuario y password definido en la creación del contenedor, 172.27.0.2 es la IP que hemos obtenido del contenedor.

Desde la línea de comando podemos hacer lo siguiente:

docker inspect 7c1391d6e988 | grep IPAddress

Acceso a MySql desde consola

Por último vamos a conectar otro proyecto creado con docker-compose con el docker de MySql existente.

Para conectar el servidor de MySql recien creado en un docker tenemos que modificar el fichero docker-compose.yml de nuestros proyectos de docker y en el apartado network asignarle la red que crear el docker de MySql, ¿y como veo la red? con

docker network ls

Buscando la red creada por MySql

¿Y como se que red es? pues porque tiene el nombre de directorio donde esta el proyecto más el nombre del proyecto, en el ejemplo: docker-compose-mysql_net_mysql y este nombre es el que tenemos que asignar en el apartado networks del docker-compose.yml de la siguiente forma:

networks:
  default:
    external: true
    name: docker-compose-mysql_net_mysql

Para poder probar la conexión desde otro contenedor docker he creado un proyecto de ejemplo, tambien esta en github.
https://github.com/depruebas/proyecto-mysql-docker el proyecto de pruebas es test-mysql-php, este proyecto crea un servidor web con Ubuntu y podeis ver como en el docker-compose asigno la red creada como indico arriba.

Para probarlo también hay un fichero Makefile para interacturar con los dockers.

Recordar que primero siempre se tiene que arrancar el proyecto de MySql, ver que IP nos ha asignado, aunque lo normal es que siempre tenga la misma, y utilizar esa IP desde otros entornos ya sea otros dockers o desde el propio host.

Y esto es todo, feliz programming
Saludos
Alex
/

Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.