El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Infraestructura

Cómo containerizar tu servidor de MU Online con Docker

Empaqueta MySQL, GameServer, ConnectServer, JoinServer y DataServer en contenedores Docker aislados, con docker-compose, volúmenes persistentes y red interna, facilitando el despliegue, el backup y la migración del servidor de MU Online.

BR Bruno · Actualizado el 31 mar 2026 · ⏱ 17 min de lectura
Respuesta rápida

Correr un servidor de MU Online directamente en el sistema operativo funciona, pero crea un problema recurrente: las dependencias de MySQL, del .NET/VC++ redistributable y de los binarios del emulador quedan dispersas y son difíciles de reproducir en otra máquina. Containerizar el servidor con Docke

Correr un servidor de MU Online directamente en el sistema operativo funciona, pero crea un problema recurrente: las dependencias de MySQL, del .NET/VC++ redistributable y de los binarios del emulador quedan dispersas y son difíciles de reproducir en otra máquina. Containerizar el servidor con Docker resuelve esto — cada componente (base de datos, ConnectServer, JoinServer, GameServer, DataServer) corre aislado, con sus propias dependencias, y todo el entorno puede recrearse en minutos con un único comando. Este tutorial muestra cómo estructurar un docker-compose completo para un servidor de MU, desde los Dockerfiles individuales hasta la persistencia de datos y la red interna entre los servicios.

Por qué containerizar un servidor de MU Online

Un servidor de MU tradicional (basado en emuladores como MuEmu o IGCN) está compuesto por varios procesos que necesitan correr simultáneamente y comunicarse entre sí: MySQL, DataServer, JoinServer, ConnectServer y GameServer. Sin contenedores, migrar ese conjunto a otra máquina significa reinstalar manualmente cada dependencia, reconfigurar rutas y esperar que las versiones coincidan. Con Docker, cada pieza se convierte en una imagen versionada, con sus dependencias declaradas en un Dockerfile — el entorno entero queda reproducible, probable en una máquina de desarrollo y migrable a un servidor nuevo con docker-compose up.

Requisitos previos

  • Docker Engine y Docker Compose instalados (Linux nativo, o Docker Desktop con WSL2 en Windows).
  • Binarios del emulador de MU (GameServer, ConnectServer, JoinServer, DataServer) ya funcionando fuera de contenedor, para servir de base a los Dockerfiles.
  • Backup completo de la base de datos actual antes de migrar al entorno containerizado.
  • Conocimiento básico de red Docker (bridge networks, exposición de puertos).

Visión general de la arquitectura en contenedores

ServicioImagen basePuertos expuestosVolumen persistente
mu-mysqlmysql:5.7 o mariadb:10.63306mu-db-data
mu-dataservermcr.microsoft.com/windows/servercore o Wine/Linux55757 (interna)mu-data-files
mu-joinserverWindows/Wine44405
mu-connectserverWindows/Wine44405 (cliente)
mu-gameserverWindows/Wine55901+mu-game-logs

Todos los servicios comparten una red Docker interna (mu-network), lo que permite que se comuniquen por nombre de servicio en vez de por IP fijo — esencial para la portabilidad entre entornos de desarrollo y producción.

Estructurando el docker-compose.yml

version: "3.8"

services:
  mu-mysql:
    image: mysql:5.7
    container_name: mu-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: "senha_forte_aqui"
      MYSQL_DATABASE: "MuOnline"
    volumes:
      - mu-db-data:/var/lib/mysql
      - ./sql/init:/docker-entrypoint-initdb.d
    networks:
      - mu-network
    ports:
      - "3306:3306"

  mu-gameserver:
    build: ./gameserver
    container_name: mu-gameserver
    restart: unless-stopped
    depends_on:
      - mu-mysql
    environment:
      DB_HOST: mu-mysql
      DB_USER: root
      DB_PASS: "senha_forte_aqui"
    volumes:
      - mu-game-logs:/app/logs
    networks:
      - mu-network
    ports:
      - "55901:55901"

networks:
  mu-network:
    driver: bridge

volumes:
  mu-db-data:
  mu-game-logs:
  mu-data-files:

Este archivo es el punto central: describe todos los servicios, sus dependencias (depends_on), variables de entorno y la red compartida.

Escribiendo el Dockerfile del GameServer

FROM mcr.microsoft.com/windows/servercore:ltsc2022

WORKDIR /app
COPY ./bin/GameServer.exe .
COPY ./bin/Data/ ./Data/
COPY ./bin/Config/ ./Config/

EXPOSE 55901

CMD ["GameServer.exe"]

Para emuladores compilados en C++/Delphi para Windows, esta es la ruta más sencilla: usar una imagen base Windows Server Core y copiar los binarios ya compilados. En entornos Linux, muchos administradores optan por correr los binarios Windows bajo Wine dentro de un contenedor Linux, lo que reduce el consumo de recursos comparado con una imagen Windows completa.

Persistencia de datos con volúmenes

Nunca dejes la base de datos ni los archivos de configuración dentro del sistema de archivos "efímero" del contenedor. Un docker-compose down sin volúmenes nombrados borra todo el progreso de los jugadores. Declara siempre volúmenes nombrados (mu-db-data, mu-game-logs) y, si es posible, monta carpetas del host directamente para los archivos de configuración que editas con frecuencia:

volumes:
  - ./config/GameServerInfo.dat:/app/Config/GameServerInfo.dat

Esto permite editar la configuración en el host, sin necesidad de reconstruir la imagen en cada ajuste pequeño.

Configurando la red interna entre los servicios

Dentro de la red mu-network, cada contenedor ve a los demás por el nombre del servicio definido en el Compose. Esto significa que, en la cadena de conexión del GameServer con la base de datos, en vez de 127.0.0.1 usas mu-mysql:

[Database]
Host = mu-mysql
Port = 3306
User = root
Password = senha_forte_aqui

Este es el ajuste más común al migrar una configuración existente a Docker: cualquier referencia a localhost en la base de datos debe convertirse en el nombre del servicio correspondiente.

Backup y restauración de la base de datos containerizada

# Backup
docker exec mu-mysql mysqldump -u root -psenha_forte_aqui MuOnline > backup_$(date +%F).sql

# Restauración
docker exec -i mu-mysql mysql -u root -psenha_forte_aqui MuOnline < backup_2026-07-30.sql

Automatiza este comando con un cron job en el host, guardando los archivos .sql fuera del contenedor — así, aunque destruyas y recrees el contenedor de MySQL, el backup permanece seguro en el host.

Logs y monitoreo de los contenedores

Usa docker logs -f mu-gameserver para seguir el comportamiento del GameServer en tiempo real, y docker stats para monitorear el consumo de CPU/memoria de cada servicio. Para producción, vale la pena integrar una stack de observabilidad (Prometheus + Grafana) recolectando métricas de los contenedores, especialmente el uso de CPU del GameServer en horarios pico, que suele ser el cuello de botella en servidores con muchos jugadores simultáneos.

Actualizando el servidor sin downtime largo

Al lanzar una nueva versión del emulador o una corrección de configuración, el flujo recomendado es: reconstruir solo la imagen del servicio modificado (docker-compose build mu-gameserver), luego recrear solo ese contenedor (docker-compose up -d --no-deps mu-gameserver), manteniendo el MySQL y los demás servicios activos. Esto reduce el tiempo de indisponibilidad a segundos, en vez de tumbar toda la stack por un ajuste puntual.

Errores comunes y soluciones

SíntomaCausa probableSolución
El GameServer no conecta a la base de datosLa cadena de conexión aún apunta a localhostCámbiala al nombre del servicio Docker (mu-mysql)
Los datos desaparecen tras docker-compose downVolumen no declarado o eliminado con -vUsa volúmenes nombrados y evita down -v en producción
El contenedor reinicia en bucleConfiguración inválida o dependencia no listaAgrega depends_on con healthcheck en MySQL
Rendimiento pobre en contenedores WindowsOverhead de imagen Windows Server Core completaEvalúa Wine en contenedor Linux para reducir consumo
Puertos no accesibles externamenteFalta de mapeo de puertos en el composeConfirma ports: mapeando el puerto del host al contenedor

Lista de verificación de containerización

  • Docker y Docker Compose instalados y probados.
  • Dockerfiles creados para cada servicio (MySQL, GameServer, ConnectServer, JoinServer).
  • docker-compose.yml con red interna y volúmenes nombrados definidos.
  • Cadenas de conexión actualizadas a nombres de servicio.
  • Rutina de backup de la base de datos automatizada y probada.
  • Logs y métricas de cada contenedor siendo monitoreados.
  • Proceso de actualización sin downtime documentado y probado.

Con el servidor corriendo en contenedores, el siguiente paso natural es estandarizar ese entorno como base para nuevos despliegues — incluso para quien está montando el proyecto desde cero. Consulta el tutorial de creación de servidor de MU Online para alinear esta infraestructura containerizada con los fundamentos del emulador.

Preguntas frecuentes

¿Docker en Windows funciona bien para MuServer, que normalmente corre en Windows Server?

Sí, mediante Docker Desktop con contenedores Windows, pero es bastante menos común y más pesado que los contenedores Linux. El enfoque más usado en la comunidad es correr MySQL en un contenedor Linux y mantener los binarios de GameServer/ConnectServer (que dependen de Windows) corriendo de forma nativa o en una VM Windows, containerizando solo la parte que soporta Linux.

¿Containerizar el servidor lo vuelve más lento?

El overhead de un contenedor Docker es mínimo comparado con correr directamente en el host, generalmente por debajo del 5% de diferencia. La ganancia en portabilidad, aislamiento y facilidad de despliegue compensa ampliamente esa pérdida marginal de rendimiento para la mayoría de los servidores privados de MU.

¿Cómo hago backup de la base de datos cuando está en un contenedor?

Usa un volumen Docker nombrado para el directorio de datos de MySQL, y ejecuta docker exec con mysqldump apuntando la salida a un archivo en el host, fuera del contenedor. Esto garantiza que el backup sobreviva incluso si el contenedor se recrea o se destruye.

¿Necesito reescribir la configuración de MuServer para correr en Docker?

No reescribirla, pero sí ajustar las cadenas de conexión. En vez de apuntar el GameServer a localhost en la base de datos, apuntas al nombre del servicio definido en el docker-compose (por ejemplo, mu-mysql), ya que los contenedores se comunican por nombre de servicio en la red interna de Compose.

¿Docker Compose reemplaza a un servidor de producción de verdad?

Para producción con muchos jugadores simultáneos, lo ideal es evolucionar hacia una orquestación más robusta (Docker Swarm, Kubernetes) o al menos un monitoreo y reinicio automático bien configurados. Docker Compose por sí solo es excelente para desarrollo, pruebas y servidores pequeños/medianos, pero la producción seria requiere capas extra de resiliencia.

BR
Editor de eventos, mapas e ítems

Bruno es especialista en eventos, mapas, bosses y economía de ítems de MU Online. Documenta cada detalle basándose en el juego real.

Sigue leyendo

Artículos relacionados