Skip to content

Commit c2de38e

Browse files
committed
Update README.md: enhance Docker volume management section with new examples and explanations; add images for better clarity
1 parent 2068feb commit c2de38e

7 files changed

+131
-79
lines changed

01-contenedores/contenedores-iv/README.md

Lines changed: 98 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ docker volume ls
127127
Si quisieramos utilizar este volumen en un contenedor, podríamos hacerlo de la siguiente manera:
128128

129129
```bash
130-
docker run -d --name halloween-with-volume --mount source=halloween-data,target=/usr/share/nginx/html/ -p 8083:80 nginx
130+
docker run -d --name halloween-with-volume \
131+
--mount source=halloween-data,target=/usr/share/nginx/html/ \
132+
-p 8083:80 nginx
131133
```
132134

133135
En este caso el volumen `halloween-data` se ha montado en la carpeta `/usr/share/nginx/html/` del contenedor `halloween-volume`.
@@ -143,7 +145,9 @@ docker cp web-content/. halloween-with-volume:/usr/share/nginx/html/
143145
También es posible crear un contenedor que a su vez cree un volumen. ✨
144146

145147
```bash
146-
docker run -d --name halloween-demo -v web-data:/usr/share/nginx/html/ -p 8084:80 nginx
148+
docker run -d --name halloween-demo \
149+
-v web-data:/usr/share/nginx/html/ \
150+
-p 8084:80 nginx
147151
```
148152

149153
En este caso, al ejecutarse el contenedor `halloween-demo` se creará un volumen llamado `web-data` que se montará en la carpeta `/usr/share/nginx/html/` del contenedor.
@@ -154,28 +158,76 @@ Y de nuevo, añadir los datos a nuestro volumen:
154158
docker cp web-content/. halloween-demo:/usr/share/nginx/html/
155159
```
156160

157-
### Asociar el volúmens a varios contenedores
161+
<!-- Contenido fuera de los vídeos de introducción -->
158162

159-
Puedes asociar varios contenedores al mismo volumen a la vez 🔄
163+
### Asociar el volumen a varios contenedores
164+
165+
Otro escenario en el que te puedes encontrar es que necesites asociar varios contenedores al mismo volumen a la vez 🔄
166+
167+
Esto es útil cuando tienes varios contenedores que necesitan acceder a los mismos datos. Un ejemplo típico es cuando tienes un contenedor que genera datos y otro que los consume, que puede ser algo tan sencillo como un contenedor que genera logs y otro que los analiza.
168+
169+
Por ejemplo vamos a crear un nuevo servidor nginx que almacene sus logs en un volumen con otro contenedor que lea esos logs:
160170

161171
```bash
162-
docker container run -dit --name second-halloween-web --mount source=halloween-data,target=/usr/share/nginx/html -p 8085:80 nginx
172+
173+
cd 01-contenedores/contenedores-iv
174+
175+
# Contenedor que genera logs
176+
docker run -d --name nginx-sharing-logs \
177+
--mount source=halloween-logs,target=/logs \
178+
-v "$PWD/nginx.conf":/etc/nginx/nginx.conf:ro \
179+
-p 8086:80 nginx sh -c "mkdir -p /logs && chown -R nginx:nginx /logs && exec nginx -g 'daemon off;'"
180+
181+
182+
183+
# Contenedor que lee los logs
184+
docker run --name container-reading-nginx-logs --rm -it \
185+
--mount source=halloween-logs,target=/logs,readonly \
186+
alpine sh -lc 'apk add --no-cache multitail >/dev/null && \
187+
multitail /logs/access.log -I /logs/error.log'
163188
```
164189

165190
Si quisieras comprobar a qué contenedores está asociado un volumen:
166191

167-
```bash
168-
docker ps --filter volume=halloween-data --format "table {{.Names}}\t{{.Mounts}}"
192+
```bash
193+
docker ps --filter volume=halloween-logs --format "table {{.Names}}\t{{.Mounts}}"
169194
```
170195

171196
### Inspeccionar el volumen
172197

173198
Al inspeccionar cualquiera de los volúmenes podemos ver cuál es la ruta donde se están almacenando: 🔍
174199

175200
```bash
176-
docker volume inspect halloween-data
201+
docker volume inspect halloween-logs
177202
```
178203

204+
### Ver el contenido de un volumen en Docker Desktop
205+
206+
También puedes ver el contenido de un volumen directamente desde Docker Desktop. Solo tienes que ir a la sección de Volúmenes, seleccionar el volumen que quieres y podrás ver el contenido del mismo
207+
208+
![Docker Desktop Volúmenes](imagenes/Explorar%20volumen%20en%20Docker%20Desktop.png)
209+
210+
### Ver el contenido de un volumen desde la línea de comandos
211+
212+
Si quieres ver el contenido de un volumen desde la línea de comandos, puedes crear un contenedor temporal que monte el volumen y te permita explorar su contenido. Por ejemplo:
213+
214+
```bash
215+
docker run --rm -it \
216+
--mount source=halloween-logs,target=/data \
217+
alpine sh
218+
```
219+
220+
Y dentro de este escribimos:
221+
222+
```bash
223+
ls -la /data
224+
```
225+
226+
### Ver el contenido de un volumen desde Visual Studio Code
227+
228+
Si tienes la extensión de Docker instalada en Visual Studio Code, puedes explorar el contenido de un volumen directamente desde el editor. Solo tienes que ir a la sección de Docker, seleccionar Volúmenes, hacer clic derecho sobre el volumen que quieres explorar y seleccionar "Explore Volume". Esto abrirá una nueva ventana del editor con el contenido del volumen.
229+
230+
179231
### Eliminar un volumen específico
180232

181233
Para eliminar un volumen específico, utiliza el comando `docker volume rm` seguido del nombre del volumen. Por ejemplo:
@@ -196,7 +248,7 @@ docker volume prune -f
196248

197249
### 📦 Backup y restore de volúmenes
198250

199-
Los volúmenes son críticos para la persistencia de datos. Aquí te mostramos cómo hacer backup y restore:
251+
Los volúmenes son críticos para la persistencia de datos, por lo que es importante saber cómo hacer backup y restaurar datos en caso de fallo. Aquí te muestro cómo hacerlo utilizando un contenedor temporal con la imagen `alpine` y el comando `tar`.
200252

201253
#### Crear un backup de un volumen
202254

@@ -233,6 +285,27 @@ docker run --rm -v halloween-data:/source -v new-volume:/destination alpine \
233285
sh -c "cp -r /source/* /destination/"
234286
```
235287

288+
### Exportar/Importar volumenes desde Docker Desktop
289+
290+
Ahora desde Docker Desktop también puedes exportar un volumen directamente desde la interfaz gráfica. Solo tienes que ir a la sección de Volúmenes, seleccionar el volumen que quieres exportar y tienes una nueva sección llamada **Exports**
291+
292+
![Docker Desktop Exportar Volumen](imagenes/Exportar%20volumenes%20desde%20la%20interfaz%20de%20Docker%20Desktop.png)
293+
294+
295+
La forma programada requiere una suscripción de pago pero el **Quick export** es gratuito. Si haces clic sobre el mismo verás que tienes diferentes opciones para exportar el volumen:
296+
297+
![Docker Desktop Quick Export Volumen](imagenes/Exportar%20los%20datos%20de%20un%20volumen%20en%20un%20tar.png)
298+
299+
y luego si creas o seleccionas un volumen puedes hacer importación o restauración de los datos:
300+
301+
![Docker Desktop Importar Volumen](imagenes/Boton%20import%20dentro%20de%20los%20volúmenes.png)
302+
303+
y si haces clic sobre el mismo podrás seleccionar el archivo `.tar` que has exportado previamente o incluso si lo has subido a tu Docker Hub puedes también indicarselo
304+
305+
![Opciones de importación dentro de un volumen](imagenes/Opciones%20de%20importación%20dentro%20de%20un%20volumen.png)
306+
307+
308+
236309
### 💡 Comparación: Bind mounts vs Volúmenes
237310

238311
| Característica | Bind Mounts | Volúmenes |
@@ -249,14 +322,18 @@ docker run --rm -v halloween-data:/source -v new-volume:/destination alpine \
249322
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.
250323

251324
```bash
252-
docker run -dit --name tmptest --mount type=tmpfs,destination=/usr/share/nginx/html/ -p 8086:80 nginx
325+
docker run -dit --name tmptest \
326+
--mount type=tmpfs,destination=/usr/share/nginx/html/ \
327+
-p 8086:80 nginx
328+
253329
docker container inspect tmptest
254330
```
255331

256332
También se puede usar el parámetro `--tmpfs`:
257333

258334
```bash
259-
docker run -dit --name tmptest2 --tmpfs /app nginx:latest
335+
docker run -dit --name tmptest2 \
336+
--tmpfs /app nginx:latest
260337
```
261338

262339
```bash
@@ -427,18 +504,6 @@ docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
427504
docker stats --no-stream ping-service
428505
```
429506

430-
**Alertas básicas con scripts:**
431-
432-
```bash
433-
# Script simple para alertar si CPU > 80%
434-
#!/bin/bash
435-
CPU_USAGE=$(docker stats --no-stream --format "{{.CPUPerc}}" ping-service | sed 's/%//')
436-
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
437-
echo "⚠️ ALERTA: CPU al ${CPU_USAGE}%"
438-
fi
439-
```
440-
441-
442507
## 💾 Limitar recursos: CPU y Memoria
443508

444509
Es importante limitar los recursos que puede usar un contenedor para evitar que consuma todos los recursos del host y afecte a otros contenedores o servicios.
@@ -466,7 +531,7 @@ docker run -d --memory="512m" --name web -p 8080:80 httpd
466531
Especifica cuántos núcleos de CPU puede usar el contenedor:
467532

468533
```bash
469-
docker run -d --cpus="1.5" --name web -p 8080:80 httpd
534+
docker run -d --cpus="1.5" --name web-limited -p 8090:80 httpd
470535
```
471536

472537
**Ejemplos de uso:**
@@ -481,10 +546,10 @@ docker run -d --cpus="1.5" --name web -p 8080:80 httpd
481546

482547
### 📋 Limitar CPU Priority (`--cpu-shares`)
483548

484-
Controla la prioridad de CPU en caso de contención:
549+
Cuando hay competición por CPU entre contenedores, este parámetro controla la prioridad de CPU en caso de contención:
485550

486551
```bash
487-
docker run -d --cpu-shares=1024 --name web -p 8080:80 httpd
552+
docker run -d --cpu-shares=1024 --name web-cpu-shares -p 8091:80 httpd
488553
```
489554

490555
**Por defecto:** Cada contenedor tiene 1024 shares
@@ -510,11 +575,13 @@ docker run -d \
510575
- ✅ Máximo 1.5 núcleos de CPU
511576
- ✅ Prioridad normal en caso de contención
512577

578+
Esto es útil para asegurar que tu servidor web no consuma todos los recursos del host y afecte a otros servicios. Y de la misma forma que si hay un contenedor que es más importante que otro, puedes ajustar los `--cpu-shares` para darle más prioridad.
579+
513580
### 📊 Ver uso de recursos en tiempo real
514581

515582
```bash
516583
# Ver estadísticas de un contenedor específico
517-
docker stats web
584+
docker stats web-limited
518585

519586
# Ver estadísticas de todos los contenedores
520587
docker stats
@@ -535,9 +602,9 @@ docker stats --no-stream
535602
**⚠️ Importante:**
536603
- Si no especificas límites, el contenedor puede consumir todos los recursos
537604
- Establecer límites muy bajos puede hacer que la aplicación vaya lenta
538-
- Monitorea siempre el uso real vs los límites establecidos
605+
- Monitoriza siempre el uso real vs los límites establecidos
539606

540-
**💡 Recomendación:** Para aplicaciones en producción, siempre establece límites de memoria y CPU para proteger la estabilidad del sistema.
607+
**💡 Recomendación:** Para aplicaciones en producción, siempre establece límites de memoria y CPU para proteger la estabilidad del sistema. Aunque es cierto que si estás en un entorno productivo posiblemente uses un clúster de contenedores, como Kubernetes o Docker Swarm.
541608

542609
## 🔌 Docker extensions
543610

@@ -554,59 +621,11 @@ Existen varias extensiones de Docker que nos permiten monitorizar nuestros conte
554621
- **Volumes Backup & Share**: Backup y compartir volúmenes fácilmente
555622
- **Docker Scout**: Análisis de vulnerabilidades en imágenes
556623

557-
### 🎯 Ejercicios prácticos para consolidar
624+
### 🎯 Ejercicios sugeridos
625+
558626

559-
**Ejercicio 1: Setup de desarrollo completo**
560-
```bash
561-
# 1. Crear un bind mount para desarrollo web
562-
# 2. Editar archivos en vivo y ver cambios
563-
# 3. Configurar logs en tiempo real
564-
# 4. Monitorizar recursos mientras desarrollas
565-
```
566627

567-
**Ejercicio 2: Gestión de datos empresarial**
568-
```bash
569-
# 1. Crear volúmenes para datos persistentes
570-
# 2. Hacer backup de volúmenes
571-
# 3. Simular fallo y recuperación
572-
# 4. Compartir datos entre múltiples servicios
573-
```
574628

575-
**Ejercicio 3: Optimización y monitorización**
576-
```bash
577-
# 1. Usar tmpfs para cachés temporales
578-
# 2. Monitorizar uso de recursos
579-
# 3. Analizar logs para troubleshooting
580-
# 4. Limpiar sistema manteniendo lo esencial
581-
```
582629

583630
> [!TIP]
584631
> 💡 **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.
585-
586-
<!--
587-
## ⏱️ Distribución temporal sugerida (3 horas)
588-
589-
**Primera hora (60 min):**
590-
- 🔗 Bind mounts completo (45 min)
591-
- Explicación conceptual (10 min)
592-
- Práctica con --mount (15 min)
593-
- Práctica con -v (10 min)
594-
- Read-only bind mount (10 min)
595-
- ☕ Mini break (15 min)
596-
597-
**Segunda hora (60 min):**
598-
- 💾 Volúmenes - Parte 1 (60 min)
599-
- Crear y usar volúmenes básicos (30 min)
600-
- Volúmenes automáticos (15 min)
601-
- Compartir entre contenedores (15 min)
602-
603-
**Tercera hora (60 min):**
604-
- 💾 Volúmenes - Parte 2 (20 min)
605-
- Inspección y limpieza
606-
- 🧠 Tmpfs mount (15 min)
607-
- 📊 Monitorización (20 min)
608-
- Sesión práctica con docker events, stats, logs
609-
- 🔌 Docker extensions + tiempo libre (5 min)
610-
611-
**Tiempo de buffer: ~30 minutos** - Perfecto para experimentación extra
612-
-->
3.53 MB
Loading
2.17 MB
Loading
3.56 MB
Loading
3.55 MB
Loading
3.57 MB
Loading
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
user nginx;
2+
worker_processes auto;
3+
4+
error_log /var/log/nginx/error.log;
5+
pid /var/run/nginx.pid;
6+
7+
events {
8+
worker_connections 1024;
9+
}
10+
11+
http {
12+
include /etc/nginx/mime.types;
13+
default_type application/octet-stream;
14+
15+
# 👇 Redirige los logs a archivos
16+
# access_log /var/log/nginx/access.log;
17+
# error_log /var/log/nginx/error.log;
18+
access_log /logs/access.log;
19+
error_log /logs/error.log;
20+
21+
sendfile on;
22+
keepalive_timeout 65;
23+
24+
server {
25+
listen 80;
26+
server_name localhost;
27+
28+
location / {
29+
root /usr/share/nginx/html;
30+
index index.html;
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)