AI SYNTHESIZED • 150 SHEETS
v1.0.0


🐳 Docker Cheatsheet Completo 🐳

Docker es una plataforma de código abierto que utiliza la contenerización para empaquetar una aplicación y todas sus dependencias en una unidad estándar para el desarrollo de software. Esto asegura que la aplicación se ejecute de manera rápida y confiable en cualquier entorno.


1. 🌟 Conceptos Clave

  • Contenedor (Container): Una unidad de software estandarizada que empaqueta código y todas sus dependencias para que la aplicación se ejecute de forma rápida y fiable de un entorno informático a otro. Es una instancia ejecutable de una imagen.
    • Beneficios: Aislamiento, portabilidad, consistencia, eficiencia.
  • Imagen (Image): Una plantilla ligera e independiente que incluye todo lo necesario para ejecutar una aplicación: el código, un tiempo de ejecución, bibliotecas, variables de entorno y archivos de configuración. Las imágenes son la “plantilla” de un contenedor.
  • Dockerfile: Un archivo de texto que contiene todas las instrucciones necesarias para construir una imagen de Docker. Es como una receta para crear una imagen.
  • Registro (Registry): Un repositorio centralizado para almacenar y distribuir imágenes de Docker. El más conocido es Docker Hub.
  • Volumen (Volume): Un mecanismo para almacenar datos generados por y usados por los contenedores Docker de forma persistente. Permite que los datos persistan incluso si el contenedor se elimina.
  • Red (Network): Permite la comunicación entre contenedores y entre contenedores y el host.
  • Docker Compose: Una herramienta para definir y ejecutar aplicaciones Docker de múltiples contenedores. Utiliza un archivo YAML para configurar los servicios de la aplicación.

2. 🛠 Configuración Inicial

  1. Instalar Docker Desktop (Windows/macOS): Descarga desde docker.com/products/docker-desktop.
  2. Instalar Docker Engine (Linux): Sigue las instrucciones específicas para tu distribución en la documentación oficial de Docker.
  3. Verificar la Instalación:
    docker --version     # Muestra la versión de Docker
    docker compose version # Muestra la versión de Docker Compose (si está integrada)
    docker run hello-world # Ejecuta un contenedor de prueba

3. 📄 Dockerfile (La Receta de la Imagen)

Un archivo de texto plano llamado Dockerfile (sin extensión) que contiene instrucciones.

# Dockerfile de ejemplo para una app Node.js

# 1. FROM: Define la imagen base
FROM node:18-alpine

# 2. WORKDIR: Establece el directorio de trabajo dentro del contenedor
WORKDIR /app

# 3. COPY: Copia archivos del contexto de construcción al contenedor
# Copia package.json y package-lock.json primero para aprovechar el cache de capas
COPY package*.json ./

# 4. RUN: Ejecuta comandos durante la construcción de la imagen
RUN npm install

# 5. COPY: Copia el resto del código de la aplicación
COPY . .

# 6. EXPOSE: Documenta los puertos que el contenedor va a escuchar (no los publica automáticamente)
EXPOSE 3000

# 7. CMD: Comando por defecto que se ejecuta cuando el contenedor se inicia
# Se puede sobrescribir al ejecutar `docker run`
CMD ["npm", "start"]

# Opcional: ENTRYPOINT: Define el comando principal que se ejecutará.
# ENTRYPOINT ["node", "server.js"]
# Combinado con CMD: ENTRYPOINT ["npm"], CMD ["start"] -> ejecuta `npm start`

Instrucciones Comunes de Dockerfile

  • FROM <image>[:<tag>]: Especifica la imagen base.
  • WORKDIR /path/to/workdir: Establece el directorio de trabajo para cualquier instrucción RUN, CMD, ENTRYPOINT, COPY, ADD.
  • COPY <src> <dest>: Copia archivos o directorios del host al contenedor. Preferible a ADD.
  • ADD <src> <dest>: Similar a COPY, pero puede manejar URLs y extraer archivos comprimidos.
  • RUN <command>: Ejecuta un comando en una nueva capa durante la construcción de la imagen. (Ej. RUN apt-get update && apt-get install -y git).
  • CMD ["executable", "param1", "param2"]: Proporciona valores predeterminados para un contenedor en ejecución. Puede ser sobrescrito al ejecutar docker run.
  • ENTRYPOINT ["executable", "param1", "param2"]: Configura un contenedor para que se ejecute como un ejecutable. Los argumentos de CMD se pasan como parámetros a ENTRYPOINT.
  • EXPOSE <port> [<port>...]: Documenta los puertos que el contenedor escucha en tiempo de ejecución. No publica los puertos automáticamente.
  • ENV <key&gt;=<value>: Establece variables de entorno.
  • ARG <name>[=<default value>]: Define variables de construcción que pueden ser pasadas con --build-arg durante docker build.
  • USER <user>[:<group>]: Establece el usuario por defecto para las instrucciones RUN, CMD, ENTRYPOINT.
  • VOLUME ["/data"]: Crea un punto de montaje para un volumen.

.dockerignore

  • Archivo para especificar archivos y directorios que deben ser ignorados al construir la imagen (similar a .gitignore).
  • Mejora la velocidad de construcción y reduce el tamaño de la imagen.
# .dockerignore
node_modules/
npm-debug.log
.git
.env
Dockerfile
*.md

4. 🚀 Comandos Básicos de Docker (CLI)

4.1. Construir Imágenes

  • docker build -t <image-name>:<tag> <path>: Construye una imagen a partir de un Dockerfile. . para el directorio actual.
    docker build -t my-node-app:1.0 .

4.2. Gestionar Imágenes

  • docker images / docker image ls: Lista todas las imágenes locales.
  • docker pull <image-name>[:<tag>]: Descarga una imagen de un registro (Docker Hub).
    docker pull ubuntu:latest
  • docker rmi <image-id> / <image-name>: Elimina una imagen.
    docker rmi my-node-app:1.0
  • docker tag <source-image>:<tag> <target-image>:<tag>: Etiqueta una imagen.
    docker tag my-node-app:1.0 myregistry/my-node-app:latest
  • docker push <image-name>:<tag>: Sube una imagen a un registro.
    docker login          # Primero inicia sesión
    docker push myregistry/my-node-app:latest

4.3. Ejecutar y Gestionar Contenedores

  • docker run [OPTIONS] <image> [COMMAND] [ARG...]: Crea y ejecuta un nuevo contenedor.
    • -p <host-port>:<container-port>: Publica (mapea) un puerto del contenedor al host.
      docker run -p 80:3000 my-node-app:1.0
    • -d / --detach: Ejecuta el contenedor en segundo plano (detached mode).
    • --name <container-name>: Asigna un nombre al contenedor.
    • -it: Asigna un TTY interactivo (para shells, etc.).
      docker run -it ubuntu:latest bash # Ejecuta un shell interactivo en Ubuntu
    • -v <host-path>:<container-path> / --mount type=bind,source=<host>,target=<container>: Monta un volumen de bind (mapear un directorio del host).
      docker run -v /mi/data:/app/data my-node-app
    • -v <volume-name>:<container-path> / --mount type=volume,source=<vol_name>,target=<container>: Monta un volumen con nombre (Docker gestiona el almacenamiento).
    • --rm: Elimina el contenedor automáticamente cuando se detiene.
    • --env <key&gt;=<value> / -e: Establece variables de entorno dentro del contenedor.
    • --network <network-name>: Conecta el contenedor a una red definida por el usuario.
  • docker ps / docker container ls: Lista los contenedores en ejecución.
    • -a / --all: Lista todos los contenedores (ejecución y detenidos).
  • docker stop <container-id> / <container-name>: Detiene un contenedor en ejecución de forma elegante.
  • docker kill <container-id> / <container-name>: Detiene un contenedor en ejecución de forma forzada.
  • docker rm <container-id> / <container-name>: Elimina uno o más contenedores detenidos.
  • docker exec [OPTIONS] <container-id> <command> [ARG...]: Ejecuta un comando dentro de un contenedor en ejecución.
    • -it: Para un shell interactivo.
      docker exec -it <container-id> bash
  • docker logs <container-id> / <container-name>: Muestra los logs de un contenedor.
    • -f / --follow: Sigue los logs en tiempo real.
  • docker inspect <object-id>: Muestra información detallada de un contenedor, imagen, volumen o red.

4.4. Gestionar Volúmenes

  • docker volume create <volume-name>: Crea un volumen con nombre.
  • docker volume ls: Lista todos los volúmenes.
  • docker volume inspect <volume-name>: Muestra detalles de un volumen.
  • docker volume rm <volume-name>: Elimina un volumen.

4.5. Gestionar Redes

  • docker network create <network-name>: Crea una red definida por el usuario (recomendado sobre la red por defecto bridge).
    docker network create my-app-network
  • docker network ls: Lista todas las redes.
  • docker network inspect <network-name>: Muestra detalles de una red.
  • docker network connect <network-name> <container-id>: Conecta un contenedor a una red.
  • docker network disconnect <network-name> <container-id>: Desconecta un contenedor de una red.

4.6. Limpieza

  • docker system prune: Elimina todos los datos de Docker no utilizados (contenedores detenidos, imágenes sin usar, volúmenes sin usar, redes sin usar). ¡Útil para liberar espacio!
    • -a / --all: También elimina imágenes sin etiqueta y volúmenes.
    • -v / --volumes: También elimina volúmenes (si se usa con -a).
  • docker rmi $(docker images -q): Elimina todas las imágenes.

5. 🏗️ Docker Compose (Multi-Contenedores)

Define y ejecuta aplicaciones Docker de múltiples contenedores.

5.1. docker-compose.yml (o compose.yml para v2)

Define los servicios, redes y volúmenes de tu aplicación.

# docker-compose.yml
version: '3.8' # Versión de la especificación de Compose

services:
  web: # Nombre del servicio (contenedor)
    build: . # Ruta al Dockerfile (en el directorio actual)
    ports:
      - "80:3000" # Mapeo de puertos (HOST:CONTAINER)
    volumes:
      - .:/app # Monta el directorio actual del host en /app del contenedor (para desarrollo)
      - /app/node_modules # Evita sobrescribir node_modules del contenedor con el del host
    environment: # Variables de entorno para este servicio
      NODE_ENV: development
    depends_on: # Define dependencias de inicio
      - db
    networks: # Conecta a redes
      - app-network

  db: # Otro servicio (contenedor de base de datos)
    image: postgres:14-alpine # Imagen de Docker Hub
    environment: # Variables de entorno para PostgreSQL
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data # Volumen con nombre para datos persistentes
    networks:
      - app-network

volumes: # Define volúmenes con nombre
  db-data:

networks: # Define redes personalizadas
  app-network:
    driver: bridge # Tipo de red

5.2. Comandos de Docker Compose

  • docker compose up [OPTIONS]: Construye (si es necesario), crea e inicia los servicios definidos en docker-compose.yml.
    • -d: Ejecuta los servicios en segundo plano.
    • --build: Fuerza la reconstrucción de las imágenes antes de iniciar.
    • <service-name>: Inicia solo servicios específicos.
      docker compose up -d
      docker compose up --build web
  • docker compose down [OPTIONS]: Detiene y elimina los contenedores, redes y volúmenes creados por up.
    • -v / --volumes: También elimina los volúmenes con nombre.
      docker compose down -v
  • docker compose ps: Lista los servicios en ejecución.
  • docker compose logs [OPTIONS] [SERVICE...]: Muestra los logs de los servicios.
    • -f: Sigue los logs en tiempo real.
  • docker compose build [SERVICE...]: Solo construye las imágenes de los servicios.
  • docker compose exec <service-name> <command>: Ejecuta un comando en un servicio en ejecución.
    docker compose exec web bash # Obtiene un shell interactivo en el contenedor 'web'

6. 💡 Buenas Prácticas y Consejos

  • Imágenes Ligeras: Usa imágenes base pequeñas (ej. alpine) y Dockerfiles multi-stage para reducir el tamaño final de la imagen.
  • Cache de Capas: Organiza tu Dockerfile para que las instrucciones que cambian con menos frecuencia (ej. FROM, RUN npm install) estén al principio, y las que cambian más a menudo (COPY . .) estén al final.
  • .dockerignore: Utilízalo para excluir archivos y directorios innecesarios de la construcción.
  • Contenedores Efímeros: Diseña tus contenedores para que sean desechables. Los datos persistentes deben guardarse en volúmenes.
  • Un Proceso por Contenedor: Cada contenedor debe tener una única responsabilidad principal.
  • No root: Ejecuta los procesos dentro del contenedor como un usuario no root por motivos de seguridad.
  • Variables de Entorno: Usa ENV en Dockerfile y environment en Compose para configuración flexible. No incluyas secretos directamente en la imagen.
  • Volúmenes para Persistencia: Utiliza volúmenes con nombre para la persistencia de datos de base de datos o cualquier otro dato crítico.
  • Redes Personalizadas: Crea redes definidas por el usuario en Docker Compose para una comunicación clara entre servicios.
  • Seguridad: Escanea tus imágenes en busca de vulnerabilidades, usa un usuario no root, y evita instalar paquetes innecesarios.

Este cheatsheet te proporciona una referencia completa de Docker, cubriendo sus conceptos esenciales, comandos CLI, Dockerfile, Docker Compose y las mejores prácticas para construir, desplegar y ejecutar aplicaciones en contenedores.

Descarga completada