CONTENEDOR -IMAGEN
Te explico el flujo completo:
🔄 Tu Flujo es Correcto:
Dockerfile → IMAGEN → CONTENEDOR (en ejecución)
Dockerfile → IMAGEN → CONTENEDOR (en ejecución)
Paso a paso lo que sucede:
Dockerfile → Es la "receta" para construir la imagen
docker build → Toma el Dockerfile y crea una IMAGEN
docker run → Toma la imagen y crea/ejecuta un CONTENEDOR
Dockerfile → Es la "receta" para construir la imagen
docker build → Toma el Dockerfile y crea una IMAGEN
docker run → Toma la imagen y crea/ejecuta un CONTENEDOR
🛠 Ejemplo Práctico:
1. Tienes un Dockerfile:
FROM ubuntu:latest
RUN apt update && apt install -y python3
COPY mi_script.py /app/
WORKDIR /app
CMD ["python3", "mi_script.py"]
FROM ubuntu:latest RUN apt update && apt install -y python3 COPY mi_script.py /app/ WORKDIR /app CMD ["python3", "mi_script.py"]
2. Construyes la IMAGEN:
docker build -t mi-aplicacion:1.0 .
✅ Resultado: Tienes una imagen llamada mi-aplicacion:1.0 en tu sistema
docker build -t mi-aplicacion:1.0 .
mi-aplicacion:1.0 en tu sistema3. Ejecutas la IMAGEN creando un CONTENEDOR:
docker run mi-aplicacion:1.0✅ Lo que ves: El contenedor ejecutando tu script Python
docker run mi-aplicacion:1.0❓ ¿Qué estás viendo realmente?
Cuando haces docker run, estás viendo:
La SALIDA del proceso que definiste en el CMD/ENTRYPOINT del Dockerfile
El CONTENEDOR en estado de ejecución
La IMAGEN está siendo usada como base para ese contenedor
docker run, estás viendo:La SALIDA del proceso que definiste en el CMD/ENTRYPOINT del Dockerfile
El CONTENEDOR en estado de ejecución
La IMAGEN está siendo usada como base para ese contenedor
🔍 Casos Comunes:
Caso A: Aplicación que corre en foreground
CMD ["python3", "app.py"]
# Cuando haces docker run, ves la salida de tu aplicación
docker run mi-app
# [Output]: * Running on http://0.0.0.0:5000
CMD ["python3", "app.py"]
# Cuando haces docker run, ves la salida de tu aplicación docker run mi-app # [Output]: * Running on http://0.0.0.0:5000
Caso B: Aplicación que corre en background
# Si quieres ingresar a un contenedor que ya está corriendo
docker exec -it nombre-contenedor /bin/bash
# Si quieres ingresar a un contenedor que ya está corriendo docker exec -it nombre-contenedor /bin/bash
Caso C: Contenedor temporal para explorar
# Sobrescribe el CMD original para obtener un shell
docker run -it mi-aplicacion:1.0 /bin/bash
# Sobrescribe el CMD original para obtener un shell docker run -it mi-aplicacion:1.0 /bin/bash
🎯 Respuesta Directa a Tu Pregunta:
SÍ, cuando haces docker run estás:
✅ Ejecutando la IMAGEN (como base)
✅ Viendo el CONTENEDOR en acción
✅ Viendo la salida del proceso definido en tu Dockerfile
docker run estás:✅ Ejecutando la IMAGEN (como base)
✅ Viendo el CONTENEDOR en acción
✅ Viendo la salida del proceso definido en tu Dockerfile
📝 Ejemplo Visual:
# Construir imagen desde Dockerfile
docker build -t mi-web .
# Ver imágenes disponibles (la plantilla)
docker images
# REPOSITORY TAG IMAGE ID
# mi-web latest abc123...
# Ejecutar la imagen (crear contenedor)
docker run -d -p 80:80 mi-web
# Ver contenedores ejecutándose (la instancia viva)
docker ps
# CONTAINER ID IMAGE COMMAND
# def456 mi-web "nginx -g 'daemon off;'"
# Construir imagen desde Dockerfile docker build -t mi-web . # Ver imágenes disponibles (la plantilla) docker images # REPOSITORY TAG IMAGE ID # mi-web latest abc123... # Ejecutar la imagen (crear contenedor) docker run -d -p 80:80 mi-web # Ver contenedores ejecutándose (la instancia viva) docker ps # CONTAINER ID IMAGE COMMAND # def456 mi-web "nginx -g 'daemon off;'"
❓ Pregunta de seguimiento:
¿Qué tipo de aplicación estás ejecutando en tu contenedor? ¿Es un servidor web, un script, una base de datos? Dependiendo del caso, hay mejores prácticas para ver los logs y monitorear la ejecución.
¡Tu entendimiento es correcto! El Dockerfile define la imagen, y cuando la ejecutas, ves el contenedor trabajando
La Analogía: Programa vs. Aplicación Ejecutándose
Imagina un programa de software, por ejemplo, un videojuego o Microsoft Word.
El CD o el archivo de instalación (.exe, .dmg) que contiene todo el código, las librerías y los recursos necesarios para que el programa funcione es la IMAGEN.
Cuando ejecutas el programa (haces doble clic en el icono), el sistema operativo carga ese "CD" en la memoria RAM y lo pone en marcha. Esa instancia en ejecución del programa es el CONTENEDOR.
Ahora, profundicemos en cada uno.
El CD o el archivo de instalación (.exe, .dmg) que contiene todo el código, las librerías y los recursos necesarios para que el programa funcione es la IMAGEN.
Cuando ejecutas el programa (haces doble clic en el icono), el sistema operativo carga ese "CD" en la memoria RAM y lo pone en marcha. Esa instancia en ejecución del programa es el CONTENEDOR.
1. IMAGEN (The Blueprint / La Plantilla)
La imagen es un paquete estático, inmutable y de solo lectura que incluye todo lo necesario para ejecutar una aplicación.
Pensalo como la "receta" o el "molde" para crear contenedores.
¿Qué contiene una imagen?
Un sistema de archivos: Usualmente una versión mínima de un sistema operativo (como Alpine Linux, Ubuntu, etc.).
El código de tu aplicación: Los archivos .js, .py, .java, etc.
Las dependencias: Las librerías y frameworks que tu aplicación necesita (como Node.js, Python, las librerías de Pandas, etc.).
Las variables de entorno: Configuraciones que la aplicación usa al iniciarse.
El comando por defecto para ejecutar: Qué proceso debe lanzarse cuando se inicia el contenedor.
Características clave de una Imagen:
No cambia: Es un binario estático. Si modificas tu código, debes construir una nueva imagen.
Se construye en capas: Cada instrucción en el archivo de creación (Dockerfile) crea una capa. Esto las hace eficientes y permite reutilizar capas entre diferentes imágenes.
Se almacena en un registro: Como Docker Hub, Google Container Registry, o un registro privado. Desde ahí, se puede "bajar" (pull) para ejecutarla en cualquier lugar.
Ejemplo: nginx:latest, python:3.9-slim, node:18-alpine son nombres de imágenes populares.
Un sistema de archivos: Usualmente una versión mínima de un sistema operativo (como Alpine Linux, Ubuntu, etc.).
El código de tu aplicación: Los archivos .js, .py, .java, etc.
Las dependencias: Las librerías y frameworks que tu aplicación necesita (como Node.js, Python, las librerías de Pandas, etc.).
Las variables de entorno: Configuraciones que la aplicación usa al iniciarse.
El comando por defecto para ejecutar: Qué proceso debe lanzarse cuando se inicia el contenedor.
No cambia: Es un binario estático. Si modificas tu código, debes construir una nueva imagen.
Se construye en capas: Cada instrucción en el archivo de creación (Dockerfile) crea una capa. Esto las hace eficientes y permite reutilizar capas entre diferentes imágenes.
Se almacena en un registro: Como Docker Hub, Google Container Registry, o un registro privado. Desde ahí, se puede "bajar" (pull) para ejecutarla en cualquier lugar.
nginx:latest, python:3.9-slim, node:18-alpine son nombres de imágenes populares.2. CONTENEDOR (The Running Process / La Instancia)
Un contenedor es una instancia en ejecución de una imagen.
Pensalo como el "proceso vivo" creado a partir de ese molde. Es la imagen puesta en acción.
¿Qué hace un contenedor?
Se crea a partir de una imagen: El comando docker run <nombre-imagen> toma la imagen y crea un contenedor a partir de ella.
Es efímero y aislado: Tiene su propio sistema de archivos, su propia red y su propio espacio de procesos, aislado del sistema anfitrión y de otros contenedores.
Tiene una capa de escritura: Sobre la imagen de solo lectura, el contenedor añade una capa extra donde puede escribir datos (logs, archivos temporales, etc.). Cuando el contenedor se elimina, esta capa se pierde (a menos que uses volúmenes para persistir los datos).
Ejecuta un proceso: Corre el comando específico definido en la imagen (por ejemplo, iniciar el servidor web Nginx).
Características clave de un Contenedor:
Dinámico: Está vivo, consume recursos (CPU, memoria) y puede ser iniciado, parado, reiniciado o eliminado.
Efímero: Por defecto, todo lo que se escribe dentro de un contenedor se pierde al eliminarlo. La persistencia se logra con volúmenes.
Puede tener múltiples instancias: Puedes ejecutar muchos contenedores a partir de una misma imagen. Por ejemplo, ejecutar 5 contenedores de tu aplicación para manejar más tráfico, todos usando la misma imagen.
Se crea a partir de una imagen: El comando docker run <nombre-imagen> toma la imagen y crea un contenedor a partir de ella.
Es efímero y aislado: Tiene su propio sistema de archivos, su propia red y su propio espacio de procesos, aislado del sistema anfitrión y de otros contenedores.
Tiene una capa de escritura: Sobre la imagen de solo lectura, el contenedor añade una capa extra donde puede escribir datos (logs, archivos temporales, etc.). Cuando el contenedor se elimina, esta capa se pierde (a menos que uses volúmenes para persistir los datos).
Ejecuta un proceso: Corre el comando específico definido en la imagen (por ejemplo, iniciar el servidor web Nginx).
Dinámico: Está vivo, consume recursos (CPU, memoria) y puede ser iniciado, parado, reiniciado o eliminado.
Efímero: Por defecto, todo lo que se escribe dentro de un contenedor se pierde al eliminarlo. La persistencia se logra con volúmenes.
Puede tener múltiples instancias: Puedes ejecutar muchos contenedores a partir de una misma imagen. Por ejemplo, ejecutar 5 contenedores de tu aplicación para manejar más tráfico, todos usando la misma imagen.
Resumen de las Diferencias Clave
Característica IMAGEN CONTENEDOR Naturaleza Estática (como un .exe) Dinámica (un proceso ejecutándose) Estado Inmutable, de solo lectura De lectura y escritura (en su capa) Persistencia Se almacena en disco de forma permanente Es efímero, se destruye y se recrea Propósito Ser la plantilla o el "molde" Ser la instancia de trabajo de la aplicación Cuantos Una imagen se puede usar muchas veces Puedes tener muchos contenedores de una imagen
| Característica | IMAGEN | CONTENEDOR |
|---|---|---|
| Naturaleza | Estática (como un .exe) | Dinámica (un proceso ejecutándose) |
| Estado | Inmutable, de solo lectura | De lectura y escritura (en su capa) |
| Persistencia | Se almacena en disco de forma permanente | Es efímero, se destruye y se recrea |
| Propósito | Ser la plantilla o el "molde" | Ser la instancia de trabajo de la aplicación |
| Cuantos | Una imagen se puede usar muchas veces | Puedes tener muchos contenedores de una imagen |
Flujo de Trabajo Práctico
Desarrollas tu aplicación y creas un Dockerfile.
Construyes una IMAGEN a partir de ese Dockerfile (docker build).
Subes la imagen a un registro (docker push).
En otro servidor (Producción), bajas la imagen (docker pull).
Ejecutas la imagen para crear y iniciar un CONTENEDOR (docker run).
Si necesitas actualizar la aplicación, vuelves al paso 1, construyes una nueva imagen (v1.1) y creas nuevos contenedores a partir de ella.
En conclusión: La Imagen es el paquete que contiene tu aplicación y sus dependencias, y el Contenedor es la instancia en tiempo de ejecución de esa imagen. Sin imagen, no puede existir un contenedor.
Desarrollas tu aplicación y creas un Dockerfile.
Construyes una IMAGEN a partir de ese Dockerfile (docker build).
Subes la imagen a un registro (docker push).
En otro servidor (Producción), bajas la imagen (docker pull).
Ejecutas la imagen para crear y iniciar un CONTENEDOR (docker run).
Si necesitas actualizar la aplicación, vuelves al paso 1, construyes una nueva imagen (v1.1) y creas nuevos contenedores a partir de ella.
IMAGEN = CLASE (en POO)
CONTENEDOR = OBJETO/INSTANCIA (en POO)
👨💻 Analogía correcta con POO
CLASE ↔ IMAGEN
OBJETO ↔ CONTENEDOR
📊 Tabla comparativa POO ↔ Docker
🔧 Ejemplo técnico
💡 Características que confirman la analogía
La CLASE/IMAGEN:
El OBJETO/CONTENEDOR:
❌ Por qué NO es al revés:
Comandos Esenciales de Docker
📋 GESTIONAR IMÁGENES
Listar imágenes
Descargar imágenes
Eliminar imágenes
🐳 GESTIONAR CONTENEDORES
Listar contenedores
Crear contenedores desde imágenes
Ejecutar comandos en contenedores
Gestionar estado de contenedores
Eliminar contenedores
🔍 INSPECCIONAR Y MONITOREAR
Ver logs
Inspeccionar
🎯 EJEMPLOS PRÁCTICOS COMPLETOS
Flujo completo: Nginx
Flujo completo: MySQL
💡 TIPS IMPORTANTES
GESTIONAR IMÁGENES
Listar imágenes
# Ver todas las imágenes descargadas
docker images
# Ver imágenes con más detalles
docker image ls
# Ver sólo los IDs de las imágenes
docker images -qDescargar imágenes
# Descargar imagen desde Docker Hub
docker pull nginx:latest
docker pull python:3.9-alpine
docker pull mysql:8.0Eliminar imágenes
# Eliminar una imagen específica
docker rmi nginx:latest
# Eliminar por ID
docker rmi a1b2c3d4e5f6
# Eliminar todas las imágenes no usadas
docker image prune
# Eliminar forzadamente (si está en uso)
docker rmi -f nginx:latest🐳 GESTIONAR CONTENEDORES
Listar contenedores
# Ver contenedores en ejecución
docker ps
# Ver TODOS los contenedores (incluyendo detenidos)
docker ps -a
# Ver los últimos contenedores creados
docker ps -l
# Ver sólo IDs de contenedores
docker ps -qCrear contenedores desde imágenes
# Crear y ejecutar contenedor básico
docker run nginx:latest
# Crear en segundo plano (detached)
docker run -d nginx:latest
# Crear con nombre personalizado
docker run -d --name mi-nginx nginx:latest
# Crear mapeando puertos
docker run -d -p 8080:80 --name web nginx:latest
# Crear con variables de entorno
docker run -d -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0Ejecutar comandos en contenedores
# Ejecutar comando en contenedor running
docker exec mi-nginx ls /etc/nginx
# Abrir terminal interactiva
docker exec -it mi-nginx bash
docker exec -it mi-nginx shGestionar estado de contenedores
# Detener contenedor
docker stop mi-nginx
# Iniciar contenedor detenido
docker start mi-nginx
# Reiniciar contenedor
docker restart mi-nginx
# Pausar contenedor
docker pause mi-nginx
# Reanudar contenedor pausado
docker unpause mi-nginxEliminar contenedores
# Eliminar contenedor detenido
docker rm mi-nginx
# Eliminar contenedor aunque esté running
docker rm -f mi-nginx
# Eliminar todos los contenedores detenidos
docker container prune
# Eliminar contenedor automáticamente al detenerse
docker run -d --rm --name temporal nginx:latest🔍 INSPECCIONAR Y MONITOREAR
Ver logs
# Ver logs de contenedor
docker logs mi-nginx
# Seguir logs en tiempo real
docker logs -f mi-nginx
# Ver últimos N líneas
docker logs --tail 50 mi-nginxInspeccionar
# Ver información detallada del contenedor
docker inspect mi-nginx
# Ver información de la imagen
docker image inspect nginx:latest
# Ver procesos ejecutándose en el contenedor
docker top mi-nginx
# Ver estadísticas de uso de recursos
docker stats mi-nginx🎯 EJEMPLOS PRÁCTICOS COMPLETOS
Flujo completo: Nginx
# 1. Descargar imagen
docker pull nginx:latest
# 2. Crear contenedor
docker run -d -p 8080:80 --name mi-sitio-web nginx:latest
# 3. Verificar que está corriendo
docker ps
# 4. Ver logs
docker logs mi-sitio-web
# 5. Acceder al contenedor
docker exec -it mi-sitio-web bash
# 6. Detener contenedor
docker stop mi-sitio-web
# 7. Eliminar contenedor
docker rm mi-sitio-webFlujo completo: MySQL
# 1. Crear contenedor MySQL con variables de entorno
docker run -d \
--name mi-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=mi_app \
-p 3306:3306 \
mysql:8.0
# 2. Conectarse a MySQL
docker exec -it mi-mysql mysql -u root -p
# 3. Limpiar todo
docker stop mi-mysql && docker rm mi-mysql💡 TIPS IMPORTANTES
# Ver ayuda de cualquier comando
docker --help
docker run --help
docker ps --help
# Limpiar sistema Docker (elimina contenedores, imágenes, redes no usadas)
docker system prune
# Ver espacio usado por Docker
docker system dfdocker ps muestra CONTENEDORES, no imágenes
Lo que VERÍAS con docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp mi-web-serverFíjate en las columnas:
CONTAINER ID→ ID del contenedorIMAGE→ Imagen base que usó para crearseNAMES→ Nombre del contenedor
📊 Diferencia práctica:
docker images → Muestra IMÁGENES (recetas)
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest abc123... 2 weeks ago 133MB
python 3.9 def456... 3 weeks ago 912MBdocker ps → Muestra CONTENEDORES (instancias ejecutándose)
docker psCONTAINER ID IMAGE COMMAND STATUS NAMES
a1b2c3d4e5f6 nginx:latest "nginx..." Up 2 hours mi-web🔍 Analogía con POO:
# IMAGEN = Clase
docker images
# Clases disponibles: Persona, Animal, Vehiculo
# CONTENEDOR = Objeto/Instancia
docker ps
# Objetos ejecutándose: persona1, animal5, vehiculo3🚀 Ejemplo práctico para entender:
# 1. Tengo IMÁGENES (clases)
docker images
# nginx:latest, mysql:8.0, python:3.9
# 2. Creo CONTENEDORES (objetos) desde esas imágenes
docker run -d --name web-1 nginx:latest
docker run -d --name web-2 nginx:latest
docker run -d --name db-1 mysql:8.0
# 3. Ver CONTENEDORES ejecutándose
docker ps
# web-1 (de nginx:latest), web-2 (de nginx:latest), db-1 (de mysql:8.0)
# 4. Ver IMÁGENES disponibles
docker images
# nginx:latest, mysql:8.0, python:3.9 (LAS MISMAS, no aumentaron)💡 Puntos clave:
Una IMAGEN puede tener múltiples CONTENEDORES ejecutándose
docker psmuestra instancias vivas (contenedores)docker imagesmuestra plantillas (imágenes)La columna
IMAGEendocker pssolo indica de qué imagen se creó el contenedor
¿Ves la diferencia ahora? docker ps te dice "qué instancias están corriendo" y docker images te
h
Comentarios
Publicar un comentario