Configuración docker-compose para base de datos

Nota previa sobre funcionamiento Windows vs Ubuntu

Este archivo funcionará en ambos sistemas (usando docker-compose -f SGBD.yml up -d). Sin embargo, en Ubuntu, a veces los contenedores (especialmente Postgres y SQL Server) fallan al arrancar porque no tienen permisos de escritura en las carpetas de datos locales (./[servicio]/data/), por lo tanto es necesario dar permisos a esas carpetas creadas, por ejemplo: sudo chmod -R 777 ./sqlserver/data o asignar el propietario correcto (chown). En Docker Desktop para Windows, esto se gestiona automáticamente y no suele dar problemas.

docker-compose -f SGBD.yml up -d # cargar el archivo (contenedores) con todos los servicios
docker-compose -f SGBD.yml up -d postgresql # cargar un solo servicio

docker-compose -f SGBD.yml down # apagar los servicios

sudo chmod -R 777 ./sqlserver/data # dar permisos de lectura/escritura

docker-compose up
docker-compose down
docker-compose down -v # eliminar los archivos de datos
docker inspect <container id> | grep "IPAddress" # obtener la ip de un servicio

Los contenedores solo se enciendan cuando tú o tus alumnos ejecuten el comando docker-compose up -d (o directamente desde la interfaz de Docker Desktop). Esto es ideal para que los recursos de la máquina no se vean afectados inmediatamente al prender la computadora.

Documentacion:

Archivo docker

version: '3.8'

services:
  # -----------------------------------------------------------
  # 1. MySQL
  # -----------------------------------------------------------
  mysql:
    image: mysql:latest
    container_name: mysql_container
    restart: "no"
    environment:
      # La imagen oficial de MySQL no permite cambiar el nombre 
      # del superusuario raíz mediante variables de entorno; siempre es 'root'.
      MYSQL_ROOT_PASSWORD: "M@1uU$312-DB"
      TZ: "America/Mexico_City"
    volumes:
      - ./mysql/data/:/var/lib/mysql/
      - ./mysql/shared/:/shared/
    networks:
      db_net:
        ipv4_address: 10.10.0.2
    ports:
      - "3306:3306"
    deploy:
      resources:
        limits:
          memory: 1G

  # -----------------------------------------------------------
  # 2. SQL Server
  # -----------------------------------------------------------
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: sqlserver_container
    restart: "no"
    environment:
      # El usuario administrador predeterminado en SQL Server 
      # siempre es 'sa' (System Administrator). No se puede renombrar aquí.
      ACCEPT_EULA: "Y"
      MSSQL_SA_PASSWORD: "M@1uU$312-DB"
      MSSQL_PID: "Developer"
      # Variables de DBA: Separación física de datos, logs y respaldos
      MSSQL_DATA_DIR: "/var/opt/sqlserver/data"
      MSSQL_LOG_DIR: "/var/opt/sqlserver/log"
      MSSQL_BACKUP_DIR: "/var/opt/sqlserver/backup"
    volumes:
      # Usamos rutas relativas (./) para garantizar portabilidad Windows/Ubuntu
      - ./sqlserver/data/:/var/opt/sqlserver/data/
      - ./sqlserver/log/:/var/opt/sqlserver/log/
      - ./sqlserver/backup/:/var/opt/sqlserver/backup/
      # Volumen para configuraciones generales o de sistema que SQL Server guarda en su raíz
      - ./sqlserver/mssql-system/:/var/opt/mssql/
      # Carpeta compartida estandarizada para todos los contenedores
      - ./sqlserver/shared/:/shared/
    networks:
      db_net:
        ipv4_address: 10.10.0.3
    ports:
      - "1433:1433"
    deploy:
      resources:
        limits:
          # SQL Server requiere estrictamente un mínimo de 2GB para arrancar.
          memory: 2G

  # -----------------------------------------------------------
  # 3. PostgreSQL
  # -----------------------------------------------------------
  postgresql:
    image: postgres:latest
    container_name: postgresql_container
    restart: "no"
    environment:
      # Soportado: Permite definir un superusuario personalizado
      POSTGRES_USER: "USUARIOPRINCIPAL"
      POSTGRES_PASSWORD: "M@1uU$312-DB"
      TZ: "America/Mexico_City"
      POSTGRES_DB=dbejemplo
    volumes:
      - ./postgresql/data/:/var/lib/postgresql/data/
      - ./postgresql/shared/:/shared/
    networks:
      db_net:
        ipv4_address: 10.10.0.4
    ports:
      - "5432:5432"
    deploy:
      resources:
        limits:
          memory: 1G

  # -----------------------------------------------------------
  # 4. MongoDB
  # -----------------------------------------------------------
  mongodb:
    image: mongo:latest
    container_name: mongodb_container
    restart: "no"
    environment:
      # Soportado: Permite definir el usuario raíz administrativo
      MONGO_INITDB_ROOT_USERNAME: "USUARIOPRINCIPAL"
      MONGO_INITDB_ROOT_PASSWORD: "M@1uU$312-DB"
    volumes:
      - ./mongodb/data/:/data/db/
      - ./mongodb/shared/:/shared/
    networks:
      db_net:
        ipv4_address: 10.10.0.5
    ports:
      - "27017:27017"
    deploy:
      resources:
        limits:
          memory: 1G

  # -----------------------------------------------------------
  # 5. Cassandra
  # -----------------------------------------------------------
  cassandra:
    image: cassandra:latest
    container_name: cassandra_container
    restart: "no"
    environment:
      # La imagen de Cassandra inicializa con el usuario 'cassandra' 
      # y contraseña 'cassandra' por defecto. El cambio de credenciales administrativas 
      # debe realizarse post-instalación mediante comandos CQL (cqlsh).
      CASSANDRA_CLUSTER_NAME: "Clase_SGBD"
    volumes:
      - ./cassandra/data/:/var/lib/cassandra/
      - ./cassandra/shared/:/shared/
    networks:
      db_net:
        ipv4_address: 10.10.0.6
    ports:
      - "9042:9042"
    deploy:
      resources:
        limits:
          # Cassandra es pesada con Java, pero 1GB es suficiente para consultas básicas.
          memory: 1G

# =============================================================
# Configuración de la Red Personalizada
# =============================================================
networks:
  db_net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.10.0.0/24
          gateway: 10.10.0.1

Notas adicionales

  • Si en algún momento Docker Compose arroja un error de validación de sintaxis relacionado con el bloque deploy al intentar levantar los servicios, se debe a que podría tener una versión muy antigua de Docker instalada. La solución rápida para ellos es agregar la bandera de compatibilidad: docker-compose --compatibility -f SGBD.yml up -d.
  • Al limitar la memoria de Cassandra y MongoDB a 1 GB, el arranque inicial (cuando crean las bases de datos del sistema y asignan espacio en disco) puede tardar un poco más de lo normal. Es recomendable tener paciencia durante los primeros 60 segundos tras encenderlos.

Administración de los contenedores docker

1. ¿Cómo entrar a los contenedores? (Modo Interactivo)

Para ejecutar comandos directamente “dentro” de la base de datos (por ejemplo, para usar mysql -u root -p o psql), es necesario abrir una terminal interactiva dentro del contenedor.

El comando clave es docker exec -it [nombre_del_contenedor] :

Para MySQL, PostgreSQL, SQL Server y MongoDB:

docker exec -it mysql_container bash

(Nota: -it significa “interactivo” y “tty” (terminal). bash es la consola de comandos de Linux que se abrirá dentro del contenedor).

Para Cassandra (y a veces MongoDB en ciertas imágenes mínimas): Si bash no funciona, debe emplearse sh:

docker exec -it cassandra_container sh

Tip de salida: Para salir del contenedor y volver a la consola de la computadora física, simplemente se debe escribir exit y presionar Enter.

2. ¿Cómo eliminar los contenedores?

  • Opción A: Destrucción elegante (Recomendada): Si ya terminaste de trabajar y quieres borrar los contenedores y la red que se creó (pero conservando los datos en sus carpetas físicas):
docker-compose -f SGBD.yml down

Advertencia: Si ejecutas docker-compose -f SGBD.yml down -v, el -v eliminará también los volúmenes administrados por Docker. En este caso, los datos sobrevivirán porque usamos “bind mounts” (carpetas locales), pero es una buena advertencia de seguridad.

  • Opción B: Eliminar un contenedor específico: Si un contenedor falló y quieres borrarlo para volver a crearlo:
docker rm -f mysql_container 

(El -f fuerza la eliminación incluso si el contenedor está encendido).

3. ¿Cómo administrarlos en general? (Comandos de uso diario)

Estos son los comandos de monitoreo y gestión que todo DBA debería dominar:

Ver qué está encendido: Muestra los contenedores activos, sus IPs, los puertos expuestos y cuánto tiempo llevan encendidos.

docker ps

Ver TODOS los contenedores (incluso los apagados):

docker ps -a

Encender o apagar sin destruir:En lugar de usar up o down, puedes simplemente pausar su ejecución:

docker stop postgresql_container 
docker start postgresql_container

Inspeccionar errores (Logs):Si un contenedor (como SQL Server) no enciende, este comando es el mejor amigo del DBA para saber qué falló:

docker logs sqlserver_container

Monitoreo de Recursos: Con este comando verás en tiempo real cuánta memoria RAM y CPU está consumiendo cada base de datos:

docker stats

(Presionar Ctrl + C para salir del monitoreo).