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:
- Cassanda: https://cassandra.apache.org/doc/latest/cassandra/getting-started/index.html
- MongoDB: https://www.mongodb.com/docs/manual/
- MySQL: https://dev.mysql.com/doc/refman/8.4/en/
- SQL-Server: https://learn.microsoft.com/en-us/sql/?view=sql-server-ver17 y https://learn.microsoft.com/en-us/sql/t-sql/language-reference?view=sql-server-ver17
- PostgreSQL: https://www.postgresql.org/docs/current/index.html
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
deployal 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).