Skip to content

Commit c0fca99

Browse files
committed
Enhance README.md with practical examples for bind mounts and volumes, including live development scenarios, backup and restore procedures, and data migration techniques.
1 parent 74ac1e0 commit c0fca99

File tree

1 file changed

+248
-0
lines changed

1 file changed

+248
-0
lines changed

01-contenedores/contenedores-iv/README.md

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,28 @@ docker run -d --name halloween-web-v -v "$(pwd)"/web-content:/usr/share/nginx/ht
6767

6868
🔄 Si cambias el contenido de la carpeta `web-content` en tu máquina local, también cambiará en la carpeta `/usr/share/nginx/html/` en tu contenedor.
6969

70+
### 🚀 Ejemplo práctico: Desarrollo en vivo
71+
72+
Vamos a ver el poder de los bind mounts para desarrollo. Con el contenedor corriendo, edita el archivo `web-content/index.html`:
73+
74+
```bash
75+
# Edita el archivo (puedes usar cualquier editor)
76+
echo "<h1>¡Cambio en vivo!</h1><p>Hora actual: $(date)</p>" > web-content/index.html
77+
78+
# Recarga la página en http://localhost:8081 y verás el cambio inmediatamente
79+
```
80+
81+
**🎯 Casos de uso reales para bind mounts:**
82+
- **Desarrollo web**: Cambios instantáneos sin rebuild
83+
- **Configuración**: Archivos de config externos al contenedor
84+
- **Logs**: Acceder a logs desde el host
85+
- **Scripts**: Ejecutar scripts del host en contenedor
86+
87+
⚠️ **Limitaciones en producción:**
88+
- Dependencia del filesystem del host
89+
- Problemas de permisos entre sistemas
90+
- No funciona bien en clusters distribuidos
91+
7092
#### Usar el bind mount como read-only
7193

7294
También puedes montar un bind mount como read-only. Esto significa que desde tu máquina podrás cambiar el contenido sin problemas pero desde dentro del contenedor no se podrá. 🔒 Para hacerlo, añade la opción `readonly` al comando `--mount`. Por ejemplo:
@@ -176,6 +198,56 @@ docker volume rm halloween-data
176198
docker volume prune -f
177199
```
178200

201+
### 📦 Backup y restore de volúmenes
202+
203+
Los volúmenes son críticos para la persistencia de datos. Aquí te mostramos cómo hacer backup y restore:
204+
205+
#### Crear un backup de un volumen
206+
207+
```bash
208+
# Crear un contenedor temporal para hacer backup
209+
docker run --rm -v halloween-data:/data -v $(pwd):/backup alpine \
210+
tar czf /backup/halloween-data-backup.tar.gz -C /data .
211+
212+
# Verificar que el backup se creó
213+
ls -la halloween-data-backup.tar.gz
214+
```
215+
216+
#### Restaurar desde un backup
217+
218+
```bash
219+
# Crear un nuevo volumen
220+
docker volume create halloween-data-restored
221+
222+
# Restaurar los datos
223+
docker run --rm -v halloween-data-restored:/data -v $(pwd):/backup alpine \
224+
tar xzf /backup/halloween-data-backup.tar.gz -C /data
225+
226+
# Verificar la restauración
227+
docker run --rm -v halloween-data-restored:/data alpine ls -la /data
228+
```
229+
230+
### 🔄 Migración de datos entre volúmenes
231+
232+
A veces necesitas mover datos de un volumen a otro:
233+
234+
```bash
235+
# Copiar datos de un volumen a otro
236+
docker run --rm -v halloween-data:/source -v new-volume:/destination alpine \
237+
sh -c "cp -r /source/* /destination/"
238+
```
239+
240+
### 💡 Comparación: Bind mounts vs Volúmenes
241+
242+
| Característica | Bind Mounts | Volúmenes |
243+
|---------------|-------------|-----------|
244+
| **Portabilidad** | ❌ Depende del host | ✅ Gestionado por Docker |
245+
| **Desarrollo** | ✅ Ideal | ⚠️ Menos directo |
246+
| **Producción** | ⚠️ Problemático | ✅ Recomendado |
247+
| **Backup** | 🤷 Manual | ✅ Herramientas Docker |
248+
| **Permisos** | ⚠️ Complejos | ✅ Gestionados |
249+
| **Rendimiento** | ✅ Directo | ✅ Optimizado |
250+
179251
## 🧠 Tmpfs mount
180252

181253
La última forma de almacenar datos en Docker es utilizando un tmpfs mount. Un tmpfs mount es un sistema de archivos temporal que se almacena en la memoria RAM de tu host. ⚡ Esto significa que si apagas tu máquina, perderás todos los datos que hayas almacenado en tu contenedor.
@@ -195,6 +267,30 @@ docker run -dit --name tmptest2 --tmpfs /app nginx:latest
195267
docker container inspect tmptest2 | grep "Tmpfs" -A 2
196268
```
197269

270+
### 🎯 Casos de uso para tmpfs
271+
272+
**¿Cuándo usar tmpfs mount?**
273+
- **Datos temporales**: Cachés, archivos temporales
274+
- **Información sensible**: Passwords, tokens (se borran al apagar)
275+
- **Alto rendimiento**: Operaciones que requieren I/O muy rápido
276+
- **Testing**: Datos que no necesitas persistir
277+
278+
**Ejemplo práctico con cache:**
279+
280+
```bash
281+
# Contenedor con cache en memoria
282+
docker run -dit --name redis-cache \
283+
--tmpfs /data \
284+
-p 6379:6379 \
285+
redis:alpine redis-server --dir /data
286+
287+
# Verificar que funciona
288+
docker exec redis-cache redis-cli ping
289+
```
290+
291+
> [!WARNING]
292+
> ⚠️ **Importante**: Todo en tmpfs se pierde al reiniciar el contenedor. Úsalo solo para datos que puedes permitirte perder.
293+
198294

199295
## 📊 Monitorización
200296

@@ -262,6 +358,158 @@ Aunque ya lo vimos en alguna clase anterior, es importante recordar que para ver
262358
docker logs ping-service
263359
```
264360

361+
### 📊 Logs avanzados: Filtros y formatos
362+
363+
Docker logs tiene opciones muy útiles para analizar problemas:
364+
365+
```bash
366+
# Ver solo las últimas 10 líneas
367+
docker logs --tail 10 ping-service
368+
369+
# Seguir logs en tiempo real (como tail -f)
370+
docker logs -f ping-service
371+
372+
# Ver logs con timestamps
373+
docker logs -t ping-service
374+
375+
# Filtrar logs por tiempo
376+
docker logs --since="2024-01-01T00:00:00" ping-service
377+
docker logs --until="2024-12-31T23:59:59" ping-service
378+
379+
# Combinar opciones
380+
docker logs -f --tail 20 -t ping-service
381+
```
382+
383+
### 🚨 Troubleshooting con logs
384+
385+
**Buscar errores comunes:**
386+
387+
```bash
388+
# Buscar errores en logs
389+
docker logs ping-service 2>&1 | grep -i error
390+
391+
# Ver logs de contenedor que falló
392+
docker logs --details container-that-failed
393+
394+
# Analizar logs de múltiples contenedores
395+
docker logs $(docker ps -q) 2>&1 | grep -i "warning\|error"
396+
```
397+
398+
### 🔧 Limpieza inteligente del sistema
399+
400+
Además de `docker system df`, puedes hacer limpieza selectiva:
401+
402+
```bash
403+
# Limpiar todo lo no utilizado (¡cuidado!)
404+
docker system prune -a
405+
406+
# Limpiar solo imágenes sin usar
407+
docker image prune
408+
409+
# Limpiar solo contenedores parados
410+
docker container prune
411+
412+
# Limpiar solo volúmenes no utilizados
413+
docker volume prune
414+
415+
# Ver qué se eliminaría sin hacerlo
416+
docker system prune --dry-run
417+
```
418+
419+
### 📈 Monitorización avanzada
420+
421+
**Monitoring de múltiples contenedores:**
422+
423+
```bash
424+
# Stats de todos los contenedores
425+
docker stats
426+
427+
# Stats con formato personalizado
428+
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
429+
430+
# Solo un contenedor específico cada 2 segundos
431+
docker stats --no-stream ping-service
432+
```
433+
434+
**Alertas básicas con scripts:**
435+
436+
```bash
437+
# Script simple para alertar si CPU > 80%
438+
#!/bin/bash
439+
CPU_USAGE=$(docker stats --no-stream --format "{{.CPUPerc}}" ping-service | sed 's/%//')
440+
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
441+
echo "⚠️ ALERTA: CPU al ${CPU_USAGE}%"
442+
fi
443+
```
444+
265445
## 🔌 Docker extensions
266446

267447
Existen varias extensiones de Docker que nos permiten monitorizar nuestros contenedores de una forma más visual. 🎨 Puedes encontrarlas en el apartado de extensiones de Docker Desktop o a través del marketplace: https://hub.docker.com/search?q=&type=extension&sort=pull_count&order=desc
448+
449+
### 🌟 Extensiones recomendadas
450+
451+
**Para monitorización:**
452+
- **Disk usage**: Visualiza el uso de espacio de Docker
453+
- **Logs Explorer**: Interfaz avanzada para análisis de logs
454+
- **Resource Usage**: Gráficos de CPU, memoria y red
455+
456+
**Para desarrollo:**
457+
- **Volumes Backup & Share**: Backup y compartir volúmenes fácilmente
458+
- **Docker Scout**: Análisis de vulnerabilidades en imágenes
459+
460+
### 🎯 Ejercicios prácticos para consolidar
461+
462+
**Ejercicio 1: Setup de desarrollo completo**
463+
```bash
464+
# 1. Crear un bind mount para desarrollo web
465+
# 2. Editar archivos en vivo y ver cambios
466+
# 3. Configurar logs en tiempo real
467+
# 4. Monitorizar recursos mientras desarrollas
468+
```
469+
470+
**Ejercicio 2: Gestión de datos empresarial**
471+
```bash
472+
# 1. Crear volúmenes para datos persistentes
473+
# 2. Hacer backup de volúmenes
474+
# 3. Simular fallo y recuperación
475+
# 4. Compartir datos entre múltiples servicios
476+
```
477+
478+
**Ejercicio 3: Optimización y monitorización**
479+
```bash
480+
# 1. Usar tmpfs para cachés temporales
481+
# 2. Monitorizar uso de recursos
482+
# 3. Analizar logs para troubleshooting
483+
# 4. Limpiar sistema manteniendo lo esencial
484+
```
485+
486+
> [!TIP]
487+
> 💡 **Consejo final**: En producción, siempre usa volúmenes para datos críticos, bind mounts solo para desarrollo, y tmpfs para datos temporales que requieren alto rendimiento.
488+
489+
<!--
490+
## ⏱️ Distribución temporal sugerida (3 horas)
491+
492+
**Primera hora (60 min):**
493+
- 🔗 Bind mounts completo (45 min)
494+
- Explicación conceptual (10 min)
495+
- Práctica con --mount (15 min)
496+
- Práctica con -v (10 min)
497+
- Read-only bind mount (10 min)
498+
- ☕ Mini break (15 min)
499+
500+
**Segunda hora (60 min):**
501+
- 💾 Volúmenes - Parte 1 (60 min)
502+
- Crear y usar volúmenes básicos (30 min)
503+
- Volúmenes automáticos (15 min)
504+
- Compartir entre contenedores (15 min)
505+
506+
**Tercera hora (60 min):**
507+
- 💾 Volúmenes - Parte 2 (20 min)
508+
- Inspección y limpieza
509+
- 🧠 Tmpfs mount (15 min)
510+
- 📊 Monitorización (20 min)
511+
- Sesión práctica con docker events, stats, logs
512+
- 🔌 Docker extensions + tiempo libre (5 min)
513+
514+
**Tiempo de buffer: ~30 minutos** - Perfecto para experimentación extra
515+
-->

0 commit comments

Comments
 (0)