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:

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ónPropósito
FROMEspecifica la imagen base
RUNEjecuta comandos durante la construcción
COPYCopia archivos del host al contenedor
ADDSimilar a COPY pero con funcionalidades adicionales
WORKDIREstablece el directorio de trabajo
EXPOSEIndica los puertos que expone el contenedor
CMDComando por defecto al ejecutar el contenedor
ENTRYPOINTPunto de entrada del contenedor
ENVDefine variables de entorno

🛠️ Comandos Esenciales de Docker

Gestión de Imágenes

bash
# 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

bash
# 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:

  1. Crear un proyecto simple:

bash
mkdir mi-proyecto-docker
cd mi-proyecto-docker
  1. Crear un archivo app.py:

python
#!/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)
  1. Crear requirements.txt:

text
Flask==2.3.3
  1. Crear Dockerfile:

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"]
  1. Construir la imagen:

bash
docker build -t mi-app-flask:1.0 .
  1. Ejecutar el contenedor:

bash
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:

bash
# 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

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=8080

2. Crear archivo .dockerignore

text
.git
.gitignore
README.md
Dockerfile
.dockerignore
node_modules
*.log
.env

3. Gestión de tags

bash
# 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

bash
# 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

  1. Escribir el Dockerfile

  2. Construir la imagen: docker build -t mi-app .

  3. Probar localmente: docker run -p 3000:3000 mi-app

  4. Etiquetar para Docker Hub: docker tag mi-app usuario/mi-app:1.0

  5. Subir a registro: docker push usuario/mi-app:1.0

  6. Desplegar 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

bash
# Buscar imágenes
docker search nginx
docker search python
docker search mysql

# Ver detalles de una imagen específica
docker inspect nginx

Descargar imágenes

bash
# 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:alpine

Ver imágenes descargadas

bash
# Listar imágenes locales
docker images
# o
docker image ls

# Ver espacio usado por imágenes
docker system df

3. Ejecutar Imágenes (Crear Contenedores)

Ejecución básica

bash
# 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 nginx

Ejecutar con puertos

bash
# 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 nginx

Ejecutar con variables de entorno

bash
# 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-aplicacion

Ejecutar con volúmenes

bash
# 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-aplicacion

4. Gestión de Imágenes

Inspeccionar imágenes

bash
# 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

bash
# Etiquetar una imagen existente
docker tag nginx mi-empresa/nginx:v1.0

# Ver imágenes etiquetadas
docker images | grep mi-empresa

Eliminar imágenes

bash
# 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 -a

5. Ejemplos Prácticos Comunes

Ejemplo 1: Servidor Web Nginx

bash
# Descargar y ejecutar Nginx
docker pull nginx
docker run -d --name web-server -p 80:80 nginx

# Verificar que funciona
curl http://localhost:80

Ejemplo 2: Base de Datos MySQL

bash
# 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 -p

Ejemplo 3: Aplicación Python

bash
# 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.py

Ejemplo 4: Entorno Node.js

bash
# Ejecutar aplicación Node.js
docker run -d \
  --name mi-app \
  -v $(pwd):/app \
  -w /app \
  -p 3000:3000 \
  node:16 \
  npm start

6. Comandos Útiles para el Día a Día

Monitoreo y logs

bash
# 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-contenedor

Ejecutar comandos en contenedores running

bash
# 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 env

Backup y restore

bash
# Guardar imagen a archivo
docker save -o nginx-backup.tar nginx

# Cargar imagen desde archivo
docker load -i nginx-backup.tar

7. Mejores Prácticas

1. Usar tags específicos

bash
# ❌ Evitar
docker pull node

# ✅ Mejor
docker pull node:18-alpine

2. Limpiar regularmente

bash
# Limpiar contenedores detenidos
docker container prune

# Limpiar imágenes no usadas
docker image prune

# Limpiar todo el sistema
docker system prune

3. Usar .dockerignore

bash
# Crear archivo .dockerignore
echo "node_modules" >> .dockerignore
echo ".git" >> .dockerignore
echo "*.log" >> .dockerignore

8. Flujo de Trabajo Típico

bash
# 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

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux