🐳 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
- Instalar Docker Desktop (Windows/macOS): Descarga desde docker.com/products/docker-desktop.
- Instalar Docker Engine (Linux): Sigue las instrucciones específicas para tu distribución en la documentación oficial de Docker.
- 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ónRUN,CMD,ENTRYPOINT,COPY,ADD.COPY <src> <dest>: Copia archivos o directorios del host al contenedor. Preferible aADD.ADD <src> <dest>: Similar aCOPY, 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 ejecutardocker run.ENTRYPOINT ["executable", "param1", "param2"]: Configura un contenedor para que se ejecute como un ejecutable. Los argumentos deCMDse pasan como parámetros aENTRYPOINT.EXPOSE <port> [<port>...]: Documenta los puertos que el contenedor escucha en tiempo de ejecución. No publica los puertos automáticamente.ENV <key>=<value>: Establece variables de entorno.ARG <name>[=<default value>]: Define variables de construcción que pueden ser pasadas con--build-argdurantedocker build.USER <user>[:<group>]: Establece el usuario por defecto para las instruccionesRUN,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:latestdocker rmi <image-id>/<image-name>: Elimina una imagen.docker rmi my-node-app:1.0docker tag <source-image>:<tag> <target-image>:<tag>: Etiqueta una imagen.docker tag my-node-app:1.0 myregistry/my-node-app:latestdocker 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>=<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 defectobridge).docker network create my-app-networkdocker 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 endocker-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 porup.-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
ENVen Dockerfile yenvironmenten 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.