Saltar a contenido

Despliegue de Múltiples Aplicaciones con Docker Compose.

Tarea a realizar

  1. Crear 3 docker-compose.yml distintos.
  2. Cada uno con:
    • una aplicación
    • una base de datos diferente:
      • MySQL
      • PostgreSQL
      • MongoDB
  3. Comprobar:
    • acceso a la BBDD con DBeaver
    • acceso a la app en navegador
  4. Desplegar una app (Wordpress) donde primero despliegue un MySQL y después el Wordpress.

Estructura 🏗

Algo importante que hay que realizar es una visualización de la estructura que va a tener nuestro "proyecto".

compose-practica/
├── mysql-app/
│   └── docker-compose.yml
├── postgres-app/
│   └── docker-compose.yml
├── mongo-app/
│   └── docker-compose.yml
└── wordpress/
    └── docker-compose.yml

1. Configurar los .

Enlace de ayuda para contenerizar. Samples

Aquí está la configuración de los 3 archivos:

###################################################################
################# PhpMyAdmin con MySQL ############################
###################################################################

#Versión del formato Docker Compose
version: '3.8'

services:
db: # Servicio de base de datos MySQL
    image: mysql:latest
    restart: always # Reinicia el contenedor automáticamente si se detiene

    environment:
        # Contraseña del usuario root
        MYSQL_ROOT_PASSWORD: root
        # Nombre de la base de datos que se crea automáticamente al iniciar el contenedor
        MYSQL_DATABASE: testdb
        # Usuario normal para acceder a la base de datos (no es necesario pero es buena práctica)
        MYSQL_USER: user
        # Contraseña del usuario normal
        MYSQL_PASSWORD: password

    volumes:
        # Guarda los datos para no perderlos al reiniciar el contenedor
        - mysql_data:/var/lib/mysql

    ports:
        # Puerto de MySQL (para DBeaver u otras apps)
        - "3306:3306"

phpmyadmin: # Interfaz web para gestionar MySQL
    image: phpmyadmin/phpmyadmin
    restart: always

    ports:
        # Acceso desde el navegador (http://localhost:8081)
        - "8081:80"

    environment:
        # Indica donde está la base de datos (nombre del servicio: db)
        PMA_HOST: db
        # Contraseña del root (para login)
        MYSQL_ROOT_PASSWORD: root

    depends_on:
        # Espera a que arranque MySQL antes de iniciar phpMyAdmin
        - db

volumes:
    # Volumen para persistencia de datos de MySQL
    mysql_data:
########################################################################
################# NextCloud con base de datos PostgreSQL ###############
########################################################################

version: '3.8'

services:
    db: # Base de datos PostgreSQL
        image: postgres:13 # Imagen oficial de PostgreSQL (versión 13)
        restart: always # Reinicia el contenedor automáticamente si se detiene

        environment:
            # Usuario de la base de datos
            POSTGRES_USER: nextcloud
            #Contraseña del usuario
            POSTGRES_PASSWORD: nextcloud
            #Nombre de la base de datos que se crea automáticamente al iniciar el contenedor
            POSTGRES_DB: nextcloud

        volumes:
            # Guarda los datos para no perderlos al reiniciar el contenedor
            - postgres_data:/var/lib/postgresql/data

        #(opcional) No hace falta exponerlo pero al querer usar DBeaver si nos hará falta
        ports:
            - "5432:5432"

    web: # Aplicación NextCloud
        image: nextcloud # Imagen oficial de :contentReference[oaicite:0]{index=0}
        restart: always # Reinicia el contenedor automáticamente si se detiene

        ports:
            # Puerto web -> para acceder desde el navegador (http://localhost:8080)
            - 8080:80 

        environment:
            # Dirección de la base de datos (nombre del servicio: db)
            POSTGRES_HOST: db
            # Usuario de la base de datos
            POSTGRES_USER: nextcloud
            # Contraseña del usuario de la base de datos
            POSTGRES_PASSWORD: nextcloud
            # Nombre de la base de datos
            POSTGRES_DB: nextcloud

        depends_on:
            # Hace que primero arranque PostgreSQL
            - db

    volumes:
        # Volumen para persistencia de datos de PostgreSQL
        postgres_data: 
######################################################################################
####################### MongoDB + Mongo Express ######################################
######################################################################################

# Versión del formato Docker Compose
version: '3.8'

services:
    db: # Servicio de base de datos MongoDB
    image: mongo:latest # Imagen oficial de MongoDB (en su última versión)
    restart: always # Reinicia el contenedor automáticamente si se detiene

    environment:
        # Usuario administrador de MongoDB
        MONGO_INITDB_ROOT_USERNAME: root
        # Contraseña del usuario root
        MONGO_INITDB_ROOT_PASSWORD: password

    volumes:
        # Guarda los datos en el host para no perderlos al reiniciar el contenedor
        - mongo_data:/data/db

    ports:
        # Expone el puerto de MongoDB al exterior (para DBeaver, etc...)
        - "27017:27017"

mongo-express:  # Interfaz web para gestionar MongoDB
    image: mongo-express # Imagen oficial de Mongo Express
    restart: always # Reinicia el contenedor automáticamente si se detiene

    ports:
        # Puerto web -> para acceder desde el navegador (http://localhost:8083)
        - "8083:8081"

    environment:
        # Indica donde está la base de datos (nombre del servicio: db)
        ME_CONFIG_MONGODB_SERVER: db
        # Usuario de MongoDB para acceder desde Mongo Express
        ME_CONFIG_MONGODB_ADMINUSERNAME: root
        # Contraseña del usuario root para Mongo Express
        ME_CONFIG_MONGODB_ADMINPASSWORD: password

        #SIN ESTA CONFIGURACIÓN de usuario y pass no nos va a dejar acceder
        ME_CONFIG_BASICAUTH_USERNAME: admin # Usuario para acceder a Mongo Express
        ME_CONFIG_BASICAUTH_PASSWORD: admin # Contraseña para acceder a Mongo Express 

    depends_on:
        # Hace que este servicio espere a que arranque la base de datos
        - db

volumes:
    # Define el volumen para persistencia de datos
    mongo_data:

2. Lanzar los contenedores.

Iremos uno por uno, primero haremos cd a la carpeta donde se encuentran y luego lanzarmos:

docker compose up -d
Imágenes

mysql

mysql web

postgres

postgres web

mongo

mongo web

docker desktop


3. Crear conexión con DBeaver .

DBeaver es una herramienta de administración y cliente SQL universal de código abierto, nos permite gestionar múltiples bases de datos desde una sola interfaz gráfica.

Compatible con:

| Windows

| Linux

| Mac

Descargamos DBeaver.

Para descargarla iremos a la página oficial de la versión gratuita, aquí dejo también la versión PRO que es de pago.

Descargamos el .deb correspondiente a nuestro sistema operativo y ejecutamos.

Creamos las conexiones.

En la app que abriremos seleccionamos: Database -> New Database conexion

conexión database

Ahora nos aparecerá para seleccionar la BD que vamos a utilizar, después añadimos la configuración correspondiente que hemos especificado en el fichero .

conexión mysql

conexión postgresql

Not available driver

No está disponible MongoDB en la versión community de DBeaver. Pero como hemos instalado 'MongoDB express' podemos acceder a la base de datos de esta forma.

Alternativamente podemos usar también 'Mongo Compass' o 'Studio 3T' que son herramientas como MongoDB express, para gestionar consultar y visualizar bases de datos MongoDB.

Sí está disponible en la versión DBeaver PRO

¿Por qué no está disponible?

Porque DBeaver principalmente trabaja con lenguaje SQL y Mongo DB es una base de datos NoSQL.

Está oriendada a documentos que almacenan la información en formato similar a JSON. A diferencia de las bases de datos relacionales, no utiliza tablas ni esquemas fijos, lo que le proporciona mayor flexibilidad. Es muy utilizada en aplicaciones modernas por su escalabilidad y facilidad para manejar datos complejos (ej. redes sociales)

mongo web

Comprobación DBeaver

Haremos doble clic sobre las bases de datos y aceptaremos descargar los drivers.

Public Key Retrieval is not allowed

fallo

En caso de tener este fallo, debemos:

Hacer clic derecho sobre la BD que nos da el problema y seleccionamos

---> 'Edit connection' -> 'Driver properties' -> allowPublicKeyRetrieval -> true

error public key

bases de datos DBeaver


4. Desplegar Wordpress con MySQL .

Muy importante establecer volúmenes para que la información persista, porque en wordpress es totalmente necesario para que funcione correctamente.

Creamos el .
        ###################################################################
        ############ WordPress con base de datos MySQL ####################
        ###################################################################

        # Versión de Docker Compose
        version: '3.8'

        services:
            db: # Base de datos MySQL
                image: mysql:latest # Imagen oficial de MySQL (última versión)
                restart: always # Reinicia el contenedor automáticamente si se detiene

                environment:
                    # Contraseña del usuario root (requerida por MySQL)
                    MYSQL_ROOT_PASSWORD: root

                    # Usuario de la base de datos
                    MYSQL_USER: wpuser

                    # Contraseña del usuario
                    MYSQL_PASSWORD: wppass

                    # Nombre de la base de datos que se crea automáticamente al iniciar el contenedor
                    MYSQL_DATABASE: wordpress

                volumes:
                    # Guarda los datos para no perderlos al reiniciar el contenedor
                    - db_data:/var/lib/mysql

            wordpress: # Aplicación WordPress
                image: wordpress
                restart: always # Reinicia el contenedor automáticamente si se detiene

                ports:
                    # Puerto web -> para acceder desde el navegador (http://localhost:8084)
                    - 8084:80

                environment:
                    # Dirección de la base de datos (nombre del servicio: db)
                    WORDPRESS_DB_HOST: db

                    # Usuario de la base de datos
                    WORDPRESS_DB_USER: wpuser
                    # Contraseña del usuario de la base de datos
                    WORDPRESS_DB_PASSWORD: wppass
                    # Nombre de la base de datos
                    WORDPRESS_DB_NAME: wordpress

            depends_on:
                # Hace que primero arranque MySQL
                - db

        volumes:
            # Volumen para persistencia de datos de MySQL
            db_data:

Despliegue de wordpress
$ cd wordpress/
$ docker compose up -d
Imágenes

compose wordpress

panel wordpress


Ingresamos en Wordpress y haremos modificaciones para ver que los cambios persisten al cambiar eliminar el docker compose.

pagina modificada


Ahora apagamos el servicio y lo volvemos a iniciar para comprobar que hay persistencia

Dentro de la carpeta del proyecto 'wordpress/'
$ docker compose down # Apagamos el servicio
$ docker compose up -d # Iniciamos otra vez el servicio
Imagen

apagado y encendido

Volvemos a entrar al wordpress a través de la web http://localhost:8084

Para ver que hemos hecho esto bien, debe aparecernos el usuario y los cambios que hicimos en la página.

⚠ Si ves el instalador otra vez, entonces los datos NO se han guardado.


En caso de querer eliminar el volumen también podríamos hacer este comando que elimina el volumen y de esta forma no quedaría ningun dato guardado.

docker compose down -v