Práctica con Docker

 

Docker y Docker Compose: despliegue moderno de aplicaciones con Wekan y GitLab detrás de Nginx

Introducción

En la administración de sistemas moderna, la virtualización ligera mediante contenedores se ha convertido en un estándar. En este contexto, Docker permite empaquetar aplicaciones junto con sus dependencias, garantizando portabilidad y consistencia entre entornos.

Para orquestar múltiples contenedores de forma sencilla, se utiliza Docker Compose, que permite definir toda la infraestructura en un único archivo YAML.

En esta práctica vamos a montar:

  • Wekan (gestión de proyectos tipo Kanban)
  • GitLab (repositorios Git y CI/CD)
  • Nginx (proxy inverso)
  • Todo ejecutado en contenedores

🧱 Arquitectura del laboratorio

La arquitectura será la siguiente:

  • Nginx → punto de entrada (puerto 80/443)
  • Wekan → aplicación Kanban
  • GitLab → repositorios + CI/CD
  • MongoDB → base de datos de Wekan
  • PostgreSQL + Redis → backend de GitLab

📁 Estructura del proyecto

docker-lab/

├── docker-compose.yml
├── nginx/
│ └── default.conf
└── data/

⚙️ Paso 1: Instalación de Docker

En sistemas Linux:

sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker

Verificar:

docker --version
docker compose version

🧩 Paso 2: docker-compose.yml

Creamos el archivo principal:

version: "3.8"

services:

nginx:
image: nginx:latest
container_name: nginx-proxy
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- wekan
- gitlab

wekan:
image: wekanteam/wekan
container_name: wekan
restart: always
environment:
- MONGO_URL=mongodb://mongo:27017/wekan
- ROOT_URL=http://localhost
depends_on:
- mongo

mongo:
image: mongo:6
container_name: mongo
restart: always
volumes:
- mongo_data:/data/db

gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
hostname: gitlab.local
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://localhost'
ports:
- "8080:80"
- "8443:443"
- "2222:22"
volumes:
- gitlab_config:/etc/gitlab
- gitlab_logs:/var/log/gitlab
- gitlab_data:/var/opt/gitlab

volumes:
mongo_data:
gitlab_config:
gitlab_logs:
gitlab_data:

🌐 Paso 3: configuración de Nginx como proxy inverso

Archivo: nginx/default.conf

server {
listen 80;

server_name localhost;

location /wekan/ {
proxy_pass http://wekan:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location /gitlab/ {
proxy_pass http://gitlab:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

🚀 Paso 4: levantar el entorno

Ejecutar:

docker compose up -d

Verificar contenedores:

docker ps

🌍 Acceso a servicios

Una vez iniciado:

🧠 Cómo funciona esta arquitectura

🧩 Contenedores aislados

Cada servicio corre de forma independiente:

  • Wekan no depende del sistema operativo
  • GitLab tiene su propio stack interno
  • MongoDB y PostgreSQL están encapsulados

🔁 Comunicación interna

Docker Compose crea una red interna donde:

  • wekan habla con mongo
  • gitlab gestiona sus servicios internos
  • nginx actúa como punto de entrada

🌐 Nginx como reverse proxy

Nginx permite:

  • Un único punto de acceso
  • Redirección por rutas (/wekan, /gitlab)
  • Posibilidad de añadir HTTPS

📊 Ventajas de esta solución

🚀 Portabilidad

Funciona igual en cualquier servidor con Docker.

🧱 Modularidad

Cada servicio puede actualizarse de forma independiente.

⚡ Despliegue rápido

Toda la infraestructura se levanta con un solo comando.

🔒 Aislamiento

Cada aplicación está contenida y aislada.

⚠️ Limitaciones

  • GitLab consume muchos recursos (RAM alta recomendada)
  • En producción se recomienda separar servicios
  • HTTPS no está configurado en este ejemplo
  • Requiere ajustes de DNS para entorno real

🛠️ Mejoras recomendadas

  • Añadir SSL con Let’s Encrypt
  • Separar bases de datos en hosts dedicados
  • Usar Traefik en lugar de Nginx
  • Implementar backups automáticos
  • Añadir monitorización (Prometheus + Grafana)

🧾 Conclusión

El uso de Docker y Docker Compose permite construir entornos completos de desarrollo y producción de forma rápida, reproducible y escalable.

Esta práctica demuestra cómo montar un laboratorio funcional con:

  • Wekan para gestión de tareas
  • GitLab para repositorios y CI/CD
  • Nginx como punto de entrada

Todo ello sin necesidad de instalaciones tradicionales complejas, sino mediante contenedores aislados y portables.

Es una arquitectura ideal para laboratorios, entornos DevOps y aprendizaje de infraestructura moderna.

Comentarios