Imágenes de Docker - Cómo Utilizarlas
Imágenes, Dockerfile y Docker Hub
📋 Introducción a Docker
¿Qué es una Imagen Docker?
Una imagen Docker es una plantilla de sólo lectura utilizada para crear contenedores. Incluye todo lo necesario para ejecutar una aplicación:
Código de la aplicación
Bibliotecas y dependencias
Herramientas del sistema
Configuraciones
Características principales:
✅ Inmutable (no se modifica después de crearse)
✅ Reutilizable
✅ Portable (funciona en cualquier sistema con Docker)
✅ Eficiente (usa capas para optimizar el almacenamiento)
🏗️ Dockerfile: Creando Imágenes Personalizadas
¿Qué es un Dockerfile?
Un Dockerfile es un archivo de texto que contiene instrucciones paso a paso para construir una imagen Docker.
Estructura básica de un Dockerfile:
# Imagen base
FROM ubuntu:20.04
# Metadatos
LABEL maintainer="tu@email.com"
# Actualizar e instalar paquetes
RUN apt-get update && apt-get install -y python3
# Copiar archivos de la aplicación
COPY app.py /app/
# Establecer directorio de trabajo
WORKDIR /app
# Comando por defecto al ejecutar el contenedor
CMD ["python3", "app.py"]Instrucciones más comunes del Dockerfile:
| Instrucción | Propósito |
|---|---|
FROM | Especifica la imagen base |
RUN | Ejecuta comandos durante la construcción |
COPY | Copia archivos del host al contenedor |
ADD | Similar a COPY pero con funcionalidades adicionales |
WORKDIR | Establece el directorio de trabajo |
EXPOSE | Indica los puertos que expone el contenedor |
CMD | Comando por defecto al ejecutar el contenedor |
ENTRYPOINT | Punto de entrada del contenedor |
ENV | Define variables de entorno |
🛠️ Comandos Esenciales de Docker
Gestión de Imágenes
# Descargar una imagen desde Docker Hub
docker pull nginx
# Ver todas las imágenes disponibles localmente
docker images
# Eliminar una imagen específica
docker rmi <ID_IMAGEN o NOMBRE>
# Eliminar todas las imágenes no utilizadas
docker image prune -a
# Ver el historial de una imagen
docker history <NOMBRE_IMAGEN>Construcción de Imágenes
# Construir una imagen desde un Dockerfile
docker build -t mi-aplicacion:1.0 .
# Construir con un Dockerfile específico
docker build -f Dockerfile.dev -t mi-app:dev .
# Construir sin cache
docker build --no-cache -t mi-app:latest .Ejemplo práctico completo:
Crear un proyecto simple:
mkdir mi-proyecto-docker
cd mi-proyecto-dockerCrear un archivo app.py:
#!/usr/bin/env python3
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "¡Hola desde Docker! 🐳"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)Crear requirements.txt:
Flask==2.3.3Crear Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]Construir la imagen:
docker build -t mi-app-flask:1.0 .Ejecutar el contenedor:
docker run -d -p 5000:5000 --name mi-contenedor mi-app-flask:1.0🌐 Docker Hub: Repositorio de Imágenes
¿Qué es Docker Hub?
Docker Hub es un registro público donde puedes:
📥 Descargar imágenes preconstruidas
📤 Almacenar tus propias imágenes
🔄 Compartir imágenes con otros desarrolladores
🏷️ Gestionar versiones con tags
Comandos para trabajar con Docker Hub:
# Iniciar sesión en Docker Hub
docker login
# Subir una imagen a Docker Hub
docker tag mi-app-flask:1.0 tu-usuario/mi-app-flask:1.0
docker push tu-usuario/mi-app-flask:1.0
# Descargar una imagen específica
docker pull tu-usuario/mi-app-flask:1.0
# Buscar imágenes en Docker Hub
docker search nginx🎯 Mejores Prácticas
1. Optimización del Dockerfile
# ✅ USAR imágenes oficiales y específicas
FROM python:3.9-slim
# ✅ MINIMIZAR el número de capas
RUN apt-get update && apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
# ✅ USAR .dockerignore para excluir archivos innecesarios
COPY . .
# ✅ ESPECIFICAR usuario no root
USER 1001
# ✅ USAR variables de entorno para configuraciones
ENV PORT=80802. Crear archivo .dockerignore
.git
.gitignore
README.md
Dockerfile
.dockerignore
node_modules
*.log
.env3. Gestión de tags
# Usar tags semánticos
docker build -t mi-app:1.0.0 .
docker build -t mi-app:latest .
# Mantener múltiples versiones
docker tag mi-app:1.0.0 mi-registry.com/mi-app:1.0.0🔍 Comandos de Diagnóstico
# Inspeccionar una imagen
docker image inspect mi-app:1.0
# Ver el tamaño de las imágenes
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# Ver imágenes intermedias
docker images -a
# Ver uso de disco
docker system df📝 Resumen de Flujo de Trabajo
Escribir el Dockerfile
Construir la imagen:
docker build -t mi-app .Probar localmente:
docker run -p 3000:3000 mi-appEtiquetar para Docker Hub:
docker tag mi-app usuario/mi-app:1.0Subir a registro:
docker push usuario/mi-app:1.0Desplegar en producción
🚀 Próximos Pasos
Aprender sobre Docker Compose para aplicaciones multi-contenedor
Explorar registros privados como AWS ECR o Google Container Registry
Implementar escaneo de vulnerabilidades en imágenes
Estudiar optimización de tamaño de imágenes
¡Ahora estás listo para crear y gestionar tus propias imágenes Docker!
1. Conceptos Básicos
¿Qué es una imagen de Docker?
Es un paquete ejecutable que incluye todo lo necesario para ejecutar una aplicación
Contiene: código, runtime, dependencias, variables de entorno, configuraciones
Es inmutable (no cambia una vez creada)
2. Buscar y Descargar Imágenes
Buscar imágenes en Docker Hub
# Buscar imágenes
docker search nginx
docker search python
docker search mysql
# Ver detalles de una imagen específica
docker inspect nginxDescargar imágenes
# Descargar imagen latest (más reciente)
docker pull nginx
# Descargar versión específica
docker pull nginx:1.21
docker pull python:3.9-slim
docker pull mysql:8.0
# Descargar imagen Alpine (más ligera)
docker pull nginx:alpineVer imágenes descargadas
# Listar imágenes locales
docker images
# o
docker image ls
# Ver espacio usado por imágenes
docker system df3. Ejecutar Imágenes (Crear Contenedores)
Ejecución básica
# Ejecutar un contenedor en primer plano
docker run nginx
# Ejecutar en segundo plano (detached)
docker run -d nginx
# Ejecutar con nombre personalizado
docker run -d --name mi-nginx nginxEjecutar con puertos
# Mapear puerto host:contenedor
docker run -d -p 8080:80 nginx
docker run -d -p 3000:3000 node
# Mapear múltiples puertos
docker run -d -p 8080:80 -p 443:443 nginxEjecutar con variables de entorno
# MySQL con variables de entorno
docker run -d \
--name mi-mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=mi_app \
mysql:8.0
# Aplicación con variables
docker run -d \
-e DATABASE_URL=postgresql://user:pass@host/db \
-e DEBUG=true \
mi-aplicacionEjecutar con volúmenes
# Montar directorio local
docker run -d \
-v $(pwd)/data:/app/data \
mi-aplicacion
# Usar volúmenes con nombre
docker run -d \
-v mi_volumen:/app/data \
mi-aplicacion4. Gestión de Imágenes
Inspeccionar imágenes
# Ver detalles de una imagen
docker image inspect nginx
# Ver historial de construcción
docker history nginx
# Ver capas de la imagen
docker image inspect nginx --format='{{.RootFS.Layers}}'Etiquetar imágenes
# Etiquetar una imagen existente
docker tag nginx mi-empresa/nginx:v1.0
# Ver imágenes etiquetadas
docker images | grep mi-empresaEliminar imágenes
# Eliminar imagen específica
docker rmi nginx:1.21
# Eliminar por ID
docker rmi abc123def456
# Eliminar imágenes no usadas
docker image prune
# Eliminar todas las imágenes no usadas (incluyendo dangling)
docker image prune -a5. Ejemplos Prácticos Comunes
Ejemplo 1: Servidor Web Nginx
# Descargar y ejecutar Nginx
docker pull nginx
docker run -d --name web-server -p 80:80 nginx
# Verificar que funciona
curl http://localhost:80Ejemplo 2: Base de Datos MySQL
# Ejecutar MySQL
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=mysecretpassword \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0
# Conectarse a MySQL
docker exec -it mysql-db mysql -uroot -pEjemplo 3: Aplicación Python
# Ejecutar Python interactivo
docker run -it python:3.9 python
# Ejecutar script Python
docker run -v $(pwd):/app python:3.9 python /app/mi_script.pyEjemplo 4: Entorno Node.js
# Ejecutar aplicación Node.js
docker run -d \
--name mi-app \
-v $(pwd):/app \
-w /app \
-p 3000:3000 \
node:16 \
npm start6. Comandos Útiles para el Día a Día
Monitoreo y logs
# Ver logs de un contenedor
docker logs nombre-contenedor
# Ver logs en tiempo real
docker logs -f nombre-contenedor
# Ver recursos usados
docker stats
# Ver procesos dentro del contenedor
docker top nombre-contenedorEjecutar comandos en contenedores running
# Abrir terminal interactiva
docker exec -it nombre-contenedor bash
# Ejecutar comando específico
docker exec nombre-contenedor ls -la
# Ver variables de entorno
docker exec nombre-contenedor envBackup y restore
# Guardar imagen a archivo
docker save -o nginx-backup.tar nginx
# Cargar imagen desde archivo
docker load -i nginx-backup.tar7. Mejores Prácticas
1. Usar tags específicos
# ❌ Evitar
docker pull node
# ✅ Mejor
docker pull node:18-alpine2. Limpiar regularmente
# Limpiar contenedores detenidos
docker container prune
# Limpiar imágenes no usadas
docker image prune
# Limpiar todo el sistema
docker system prune3. Usar .dockerignore
# Crear archivo .dockerignore
echo "node_modules" >> .dockerignore
echo ".git" >> .dockerignore
echo "*.log" >> .dockerignore8. Flujo de Trabajo Típico
# 1. Buscar imagen
docker search postgres
# 2. Descargar imagen
docker pull postgres:13
# 3. Ejecutar contenedor
docker run -d --name db -e POSTGRES_PASSWORD=123 -p 5432:5432 postgres:13
# 4. Verificar
docker ps
docker logs db
# 5. Conectarse
docker exec -it db psql -U postgres
# 6. Detener cuando termine
docker stop db
# 7. Eliminar si ya no se necesita
docker rm db
Comentarios
Publicar un comentario