You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## 🤖 Docker Model Runner: IA y modelos de lenguaje en contenedores
3
+
4
+
En los últimos tiempos Docker se ha volcado en integrar capacidades de inteligencia artificial directamente en su ecosistema. Por lo que además de poder crear y gestionar contenedores tradicionales, ahora es posible trabajar con modelos de IA y grandes modelos de lenguaje (LLMs) de forma nativa. Para ello ha creado una herramienta llamada **Docker Model Runner**, la cual te permite descargar imágenes que lo que contienen son modelos de IA listos para usar.
-**🌐 APIs compatibles con OpenAI**: Sirve modelos con endpoints familiares para fácil integración
10
+
-**📦 Empaquetado OCI**: Convierte archivos GGUF en artefactos OCI y publícalos en cualquier registro
11
+
-**💻 Interfaz dual**: Interactúa desde línea de comandos o la GUI de Docker Desktop
12
+
-**📊 Gestión local**: Administra modelos locales y visualiza logs de ejecución
13
+
14
+
### 🚀 **Cómo funciona**
15
+
16
+
Los modelos se descargan desde Docker Hub la primera vez que se usan y se almacenan localmente. Se cargan en memoria solo cuando se solicita y se descargan cuando no están en uso para optimizar recursos. Después de la descarga inicial, quedan en caché para acceso rápido.
17
+
18
+
### 🛠️ **Comandos esenciales**
19
+
20
+
```bash
21
+
# Habilitar Docker Model Runner (desde Docker Desktop settings)
22
+
# Beta features > Enable Docker Model Runner
23
+
24
+
# Verificar instalación
25
+
docker model version
26
+
27
+
# Ejecutar un modelo
28
+
docker model run ai/gemma3
29
+
30
+
# Listar modelos locales
31
+
docker model ls
32
+
```
33
+
34
+
### 🔗 **Modelos disponibles**
35
+
36
+
Todos los modelos están disponibles en el [namespace público de Docker Hub](https://hub.docker.com/u/ai).
37
+
38
+
### 💡 **Casos de uso típicos**
39
+
40
+
-**Desarrollo de aplicaciones GenAI**: Integra IA en tus apps sin configuración compleja
41
+
-**Prototipado rápido**: Prueba diferentes modelos localmente antes del despliegue
42
+
-**Pipelines CI/CD**: Incluye capacidades de IA en tus flujos de trabajo automatizados
43
+
-**Experimentación ML**: Testa modelos sin depender de servicios externos
¡Hola lemoncoder 👋🏻! En esta sesión aprenderemos a dominar las imágenes Docker, desde su gestión básica hasta una introducción a la creación de imágenes personalizadas con Dockerfile. Veremos cómo buscar, descargar y crear imágenes a partir de otras, así como optimizar nuestro entorno Docker.
5
+
¡Hola lemoncoder 👋🏻! En esta sesión aprenderemos a dominar las imágenes Docker, desde su gestión básica hasta una introducción a la creación de imágenes personalizadas con Dockerfile. Veremos algunas imágenes interesantes que nos demuestren lo fácil que es usar contenedores para todo, así como crear nuestras primeras imágenes básicas con unas pocas instrucciones.
6
6
7
7
## 🎬 Vídeos de la introducción en el campus
8
8
9
9
Se asume que has visto los siguientes vídeos para comenzar con este módulo:
10
10
11
11
| # | Tema | Contenido Clave |
12
12
|---|------|-----------------|
13
-
| 1 | 📘 Teoría | Conceptos fundamentales de imágenes, capas, registros y nomenclatura |
13
+
| 1 | 📘 Teoría | Conceptos fundamentales de imágenes, capas, pulling, registros y nomenclatura |
14
14
| 2 | 🛠️ Demo: Analizar una imagen desde Docker Desktop | Inspeccionar imágenes, ver capas, explorar la estructura interna |
15
15
| 3 | 🏷️ Demo: Etiquetas y digest | Entender tags, versiones y digests SHA256 |
16
16
| 4 | 🌐 Demo: Un vistazo por la web de Docker Hub | Navegar por Docker Hub, buscar imágenes, entender documentación |
@@ -22,9 +22,7 @@ Antes de avanzar, recuerda que en la clase anterior aprendimos parámetros impor
22
22
23
23
-**`--name`**: Asignar un nombre personalizado al contenedor
24
24
-**`-d` o `--detach`**: Ejecutar contenedor en background (sin bloquear el terminal)
25
-
-**`-p` o `--publish`**: Mapear puertos del contenedor al host
26
-
-**`--rm`**: Eliminar el contenedor automáticamente al parar (útil para pruebas)
27
-
-**`-it`**: Modo interactivo con terminal (solo para comandos que lo necesitan)
25
+
-**`-it`**: Modo interactivo con terminal
28
26
-**`--restart`**: Políticas de reinicio del contenedor
29
27
-**`docker ps`**: Listar contenedores en ejecución
30
28
-**`docker ps -a`**: Listar todos los contenedores (incluidos los detenidos)
@@ -90,12 +88,6 @@ También podemos filtrar el resultado usando --filter
Piensa que estas imágenes cuando se descargan se hacen de una forma incremental, es decir, si dos imágenes comparten capas estas solo se descargarán una vez. Por ejemplo, si tienes la imagen de `nginx` y la de `nginx:alpine` la segunda solo descargará las capas que no tenga ya descargadas de la primera. También puede diferir el tamaño que ocupa la imagen dependiendo de la arquitectura para la que esté construida (amd64, arm64, etc.), ya que en realidad son imágenes diferentes.
|**Usa versiones específicas**| Evita cambios inesperados |`mysql:8.0.35` en lugar de `mysql:latest`|
133
125
|**Evita usar `latest`**| Tag `latest` puede cambiar sin aviso | Especifica versión de lanzamiento (`8.0`, `v2.1.0`) |
134
126
|**Verifica el digest**| Garantiza que descargaste exactamente lo que esperas |`docker images --digests`|
135
-
|**Usa imágenes oficiales**| Mejor mantenimiento y seguridad |`library/nginx` en lugar de `some-user/nginx`|
127
+
|**Usa imágenes oficiales**| Mejor mantenimiento y seguridad |`nginx` en lugar de `some-user/nginx`|
136
128
|**Revisa la documentación**| Entiende variables de entorno y configuración necesaria | Lee el README en Docker Hub |
137
129
|**Descarga cuando tengas conexión lenta**| Evita interrupciones durante creación de contenedores | Usa `docker pull` con anticipación |
138
130
@@ -148,16 +140,7 @@ Si bien es cierto que antes funcionaba este comando sin problemas ahora mismo de
148
140
149
141
## 🌍 Variables de entorno para las imágenes
150
142
151
-
Las variables de entorno permiten configurar los contenedores sin tener que modificar la imagen. Muchas imágenes populares permiten configurar aspectos clave de la aplicación a través de variables de entorno.
152
-
153
-
Cuando ejecutas un contenedor, puedes pasar variables de entorno usando la opción `-e` o `--env` seguida del nombre y valor de la variable. Por ejemplo:
154
-
155
-
**🔍 Variables más comunes:**
156
-
-`TZ`: Zona horaria (America/New_York, Europe/London, etc.)
157
-
-`PUID/PGID`: IDs de usuario/grupo para manejo de permisos.
158
-
-`PASSWORD/USER`: Credenciales de acceso
159
-
-`DB_*`: Configuración de base de datos
160
-
-`APP_*`: Configuraciones específicas de la aplicación
143
+
Ya comentamos en la clase anterior que es posible utilizar variables de entorno para configurar los contenedores que ejecutamos a partir de una imagen. Esto es muy útil, ya que muchas imágenes utilizan variables de entorno para configurar aspectos importantes como usuarios, contraseñas, puertos, etc.
161
144
162
145
También puedes pasar un archivo con múltiples variables usando `--env-file`:
163
146
@@ -168,11 +151,14 @@ docker run --name pihole -d \
168
151
pihole/pihole:latest
169
152
```
170
153
171
-
Y con esto tendrás Pi-hole corriendo en `http://localhost:9091` con las variables de entorno definidas en el archivo `pihole.env`.
172
-
173
154
174
155
Si tienes muchas variables de entorno, usar un archivo `.env` es más limpio y manejable que pasarlas todas en la línea de comandos.
175
156
157
+
Y con esto tendrás Pi-hole corriendo en `http://localhost:9091` con las variables de entorno definidas en el archivo `pihole.env`.
158
+
159
+
>[!INFORMATION]
160
+
>Pihole es una herramienta fantástica para bloquear anuncios y rastreadores a nivel de red. Puedes configurarlo como tu servidor DNS y disfrutar de una navegación más limpia y rápida en todos tus dispositivos conectados a la red.
161
+
176
162
177
163
## 🌟 Algunas imágenes interesantes
178
164
@@ -199,19 +185,6 @@ docker run \
199
185
linuxserver/plex
200
186
```
201
187
202
-
**💻 VS Code Server** (Visual Studio Code en un contenedor)
203
-
204
-
```bash
205
-
docker run -d \
206
-
--name=code-server \
207
-
-e PUID=1000 `# ID de usuario para permisos` \
208
-
-e PGID=1000 `# ID de grupo para permisos` \
209
-
-e TZ=Etc/UTC `# Zona horaria` \
210
-
-e PASSWORD=lemoncode `# Variable para configurar contraseña` \
211
-
-p 8443:8443 \
212
-
lscr.io/linuxserver/code-server:latest
213
-
```
214
-
215
188
🎨 Blender (software de modelado 3D)
216
189
217
190
```bash
@@ -392,138 +365,9 @@ docker run -p 8080:8080 gcr.io/google-samples/hello-app:1.0
392
365
docker run mcr.microsoft.com/mcr/hello-world
393
366
```
394
367
395
-
## 🧩 Docker Extensions: Extiende Docker Desktop
396
-
397
-
Otra cosa que podemos descargar de Docker Hub son las **Docker Extensions**. Este es un ecosistema de complementos que extienden la funcionalidad de Docker Desktop, permitiéndote agregar herramientas e integraciones adicionales directamente desde la interfaz gráfica. Las extensiones te permiten trabajar de manera más eficiente al integrar herramientas populares sin abandonar Docker Desktop.
398
-
399
-
400
-
### ✨ **¿Qué son Docker Extensions?**
401
-
402
-
Docker Extensions son aplicaciones pequeñas que se ejecutan como contenedores y añaden funcionalidades a Docker Desktop. Actúan como un puente entre Docker y otras herramientas de desarrollo, permitiendo:
403
-
404
-
-**Integración con herramientas populares**: Kubernetes, Snyk, Portainer, LazyDocker, etc.
405
-
-**Interfaz visual mejorada**: Alternativas a la CLI para tareas comunes
406
-
-**Automatización**: Scripts y workflows para tareas repetitivas
407
-
-**Monitoreo avanzado**: Análisis de contenedores, imágenes y recursos
408
-
-**Seguridad**: Escaneo de vulnerabilidades y análisis de seguridad
409
-
410
-
### 🚀 **Cómo instalar Docker Extensions**
411
-
412
-
#### **Paso 1: Acceder a la tienda de extensiones**
413
-
414
-
1. Abre **Docker Desktop**
415
-
2. Haz clic en el icono de **"Extensions"** en la barra lateral (icono de piezas de puzzle)
416
-
3. Se abrirá la tienda de extensiones de Docker
417
-
418
-
#### **Paso 2: Buscar e instalar una extensión**
419
-
420
-
Por ejemplo, para instalar **Portainer** (gestor visual de contenedores):
421
-
422
-
1. En la barra de búsqueda, escribe "Portainer"
423
-
2. Haz clic en el resultado de Portainer
424
-
3. Haz clic en el botón **"Install"**
425
-
4. Espera a que se descargue e instale (normalmente tarda unos segundos)
426
-
427
-
#### **Paso 3: Usar la extensión**
428
-
429
-
Una vez instalada, aparecerá en la barra lateral de Docker Desktop y podrás acceder a ella haciendo clic.
430
-
431
-

432
-
433
-
434
-
### ⚙️ **Crear tus propias extensiones (Avanzado)**
435
-
436
-
Si eres desarrollador, puedes crear tus propias extensiones usando:
437
-
-**React** para la interfaz de usuario
438
-
-**Docker SDK** para interactuar con el engine
439
-
-**Docker Compose** para empaquetar la extensión
440
-
441
-
Para más información sobre desarrollo de extensiones, consulta la [documentación oficial de Docker Extensions](https://docs.docker.com/desktop/extensions/dev/).
442
-
443
-
## 🤖 Docker Model Runner: IA y modelos de lenguaje en contenedores
444
-
445
-
En los últimos tiempos Docker se ha volcado en integrar capacidades de inteligencia artificial directamente en su ecosistema. Por lo que además de poder crear y gestionar contenedores tradicionales, ahora es posible trabajar con modelos de IA y grandes modelos de lenguaje (LLMs) de forma nativa. Para ello ha creado una herramienta llamada **Docker Model Runner**, la cual te permite descargar imágenes que lo que contienen son modelos de IA listos para usar.
-**🌐 APIs compatibles con OpenAI**: Sirve modelos con endpoints familiares para fácil integración
451
-
-**📦 Empaquetado OCI**: Convierte archivos GGUF en artefactos OCI y publícalos en cualquier registro
452
-
-**💻 Interfaz dual**: Interactúa desde línea de comandos o la GUI de Docker Desktop
453
-
-**📊 Gestión local**: Administra modelos locales y visualiza logs de ejecución
454
-
455
-
### 🚀 **Cómo funciona**
456
-
457
-
Los modelos se descargan desde Docker Hub la primera vez que se usan y se almacenan localmente. Se cargan en memoria solo cuando se solicita y se descargan cuando no están en uso para optimizar recursos. Después de la descarga inicial, quedan en caché para acceso rápido.
458
-
459
-
### 🛠️ **Comandos esenciales**
460
-
461
-
```bash
462
-
# Habilitar Docker Model Runner (desde Docker Desktop settings)
463
-
# Beta features > Enable Docker Model Runner
464
-
465
-
# Verificar instalación
466
-
docker model version
467
-
468
-
# Ejecutar un modelo
469
-
docker model run ai/gemma3
470
-
471
-
# Listar modelos locales
472
-
docker model ls
473
-
```
474
-
475
-
### 🔗 **Modelos disponibles**
476
-
477
-
Todos los modelos están disponibles en el [namespace público de Docker Hub](https://hub.docker.com/u/ai).
478
-
479
-
### 💡 **Casos de uso típicos**
480
-
481
-
-**Desarrollo de aplicaciones GenAI**: Integra IA en tus apps sin configuración compleja
482
-
-**Prototipado rápido**: Prueba diferentes modelos localmente antes del despliegue
483
-
-**Pipelines CI/CD**: Incluye capacidades de IA en tus flujos de trabajo automatizados
484
-
-**Experimentación ML**: Testa modelos sin depender de servicios externos
485
-
486
-
487
-
## 🛠️ Crear tu propia imagen a partir de una imagen existente
488
-
489
-
Vale, yo creo que ya hemos jugado bastante con las imágenes que ya existen. Ahora lo que te quiero mostrar es cómo podemos crear nuestra propia imagen a partir de otra imagen existente.
490
-
491
-
Vamos a tomar por ejemplo la imagen llamada nginx y vamos a crear una imagen propia a partir de ella utilizando un contenedor el cual vamos a utilizar para modificar el contenido.
492
-
493
-
```bash
494
-
docker run -d --name nginx-container -p 8080:80 nginx
495
-
```
496
-
497
-
Ahora lo que vamos a hacer es utilizar el contenido del directorio llamado `web` para modificar lo que hay en el directorio `/usr/share/nginx/html` del contenedor.
Ahora que ya hemos modificado la imagen vamos a crear una nueva imagen a partir de ella. Para ello vamos a hacer un `commit` de la imagen.
504
-
505
-
```bash
506
-
docker commit nginx-container whale-nginx:v1
507
-
```
508
-
509
-
Si ahora haces un `docker images` verás que tienes una nueva imagen llamada `whale-nginx` con la etiqueta `v1`.
510
-
511
-
```bash
512
-
docker images
513
-
```
514
-
515
-
Y ahora vamos a crear un nuevo contenedor a partir de esta imagen:
516
-
517
-
```bash
518
-
docker run -d --name whale-nginx -p 8081:80 whale-nginx:v1
519
-
```
520
-
521
-
Si ahora accedes a `http://localhost:8081` verás que tienes el contenido que hemos copiado en el contenedor original.
522
-
523
-
524
368
## 📋 Introducción a Dockerfile: Construyendo tu primera imagen
525
369
526
-
Si bien es cierto que con `docker commit` se pueden crear imágenes a partir de contenedores modificados, esta no es la mejor práctica en el mundo real. La forma correcta y reproducible de crear imágenes es usando un `Dockerfile`.
370
+
Después de haber visto varias imágenes de otros, quizás ya te pique el gusanillo de saber cómo crear las tuyas propias. La forma recomendada de crear imágenes Docker es utilizando un archivo llamado `Dockerfile`, el cual contiene una serie de instrucciones que Docker interpreta para construir la imagen paso a paso.
527
371
528
372
### 🎯 **¿Por qué Dockerfile es mejor que docker commit?**
529
373
@@ -534,7 +378,7 @@ Si bien es cierto que con `docker commit` se pueden crear imágenes a partir de
Vamos a crear una imagen personalizada usando el contenido del directorio `web` que hemos estado usando:
381
+
Vamos a crear una imagen personalizada usando el contenido del directorio `web`, el cuál contiene un simple sitio web estático. Usaremos `nginx` como servidor web base.
538
382
539
383
**Paso 1**: Crear un archivo llamado `Dockerfile` en el directorio `01-contenedores/contenedores-ii/`:
540
384
@@ -551,50 +395,49 @@ EXPOSE 80
551
395
# nginx se ejecuta automáticamente al iniciar el contenedor
552
396
```
553
397
398
+
Vale, y ahora que tenemos el Dockerfile, ¿cómo construimos la imagen?
399
+
554
400
**Paso 2**: Construir la imagen desde el directorio que contiene el Dockerfile:
555
401
402
+
Para construir la imagen necesitamos usar el comando `docker build`y la forma más sencilla (con menos parámetros) de hacerlo es posicionandonos en el mismo directorio donde está el Dockerfile:
403
+
556
404
```bash
557
405
cd 01-contenedores/contenedores-ii/
406
+
```
407
+
y ejecutamos:
408
+
409
+
```bash
410
+
558
411
docker build -t mi-nginx-personalizado:v1 .
559
412
```
560
413
561
-
**Paso 3**: Ejecutar un contenedor de nuestra imagen personalizada:
414
+
Y voilà! Después de unos segundos tendrás tu imagen personalizada creada. Para comprobar que la tienes puedes hacer:
562
415
563
416
```bash
564
-
docker run -d --name mi-web -p 8080:80 mi-nginx-personalizado:v1
417
+
docker images
565
418
```
566
419
567
-
### 🔍 **Comparación: docker commit vs Dockerfile**
420
+
y ahí estará `mi-nginx-personalizado` con la etiqueta `v1`.
568
421
569
-
| Método | Reproducibilidad | Mantenibilidad | Uso en producción |
|`Dockerfile`| ✅ Alta | ✅ Fácil | ✅ Best practice |
422
+
¿Y cómo ejecuto un contenedor a partir de esta imagen?
573
423
574
-
### 🎓 **Lo que aprenderás en el próximo módulo**
575
424
576
-
-**Sintaxis completa** de Dockerfile
577
-
-**Mejores prácticas** para optimizar imágenes
578
-
-**Multi-stage builds** para imágenes más pequeñas
579
-
-**Gestión de capas** para builds eficientes
580
-
-**Variables y argumentos** para imágenes flexibles
581
-
-**Seguridad** en la construcción de imágenes
425
+
**Paso 3**: Ejecutar un contenedor de nuestra imagen personalizada:
582
426
583
-
> 💡 **Consejo**: El ejemplo que acabamos de ver es básico. En el próximo módulo aprenderás a crear Dockerfiles mucho más sofisticados y optimizados para aplicaciones reales.
427
+
Para ejecutarlo es básicamente de la misma forma que ejecutamos cualquier otra imagen que descarguemos de cualquier registro:
584
428
585
-
## 🎉 ¡Felicidades!
429
+
```bash
430
+
docker run -d --name mi-web -p 8080:80 mi-nginx-personalizado:v1
431
+
```
586
432
587
-
En esta segunda clase has aprendido a:
433
+
## Bonus ✨
588
434
589
-
- Gestionar imágenes Docker: buscar, descargar y listar
590
-
- Usar variables de entorno para configurar contenedores
- Introducción a Dockerfile para construir imágenes reproducibles
435
+
Al finalizar la clase, te mostré brevemente una nueva característica de Docker, la cual nos va a permitir depurar estos Dockerfile de la misma forma que lo hacemos con el código de nuestras aplicaciones. [Puedes leer más información en este artículo](https://www.linkedin.com/posts/docker_debug-docker-builds-with-visual-studio-code-activity-7386119752697466881-OA-0/) o echar un vistazo a este vídeo del canal de return(GiS) (COMING SOON!);
436
+
437
+
## 🎉 ¡Felicidades!
594
438
595
-
### 🎯 Lo más importante
439
+
Ya has llegado al final de este módulo que, junto con los vídeos introductorios y la clase online en directo, te ha permitido conocer los conceptos fundamentales de las imágenes Docker, desde su gestión básica hasta la creación de imágenes personalizadas con Dockerfile.
596
440
597
-
**La progresión es clara:** Hemos pasado de simplemente _ejecutar_ contenedores (Día 1) a _dominar_ las imágenes, sus fuentes, cómo crearlas y cómo optimizar nuestro flujo de trabajo. Ahora tienes las herramientas para trabajar profesionalmente con Docker.
0 commit comments