Docker es una de esas herramientas que parecen excesivas hasta que despliegas a producción por primera vez sin ella — y entonces ya no vuelves atrás. En esencia, Docker simplemente empaqueta tu aplicación y su entorno en una unidad portable llamada contenedor. El mismo código, las mismas dependencias, el mismo comportamiento, ya sea en tu laptop, tu pipeline de CI o un servidor en Frankfurt.
El modelo mental es simple: las imágenes son planos, los contenedores son instancias en ejecución de esos planos. Construyes una imagen una vez y luego levantas tantos contenedores como necesites. Los volumes persisten datos más allá del ciclo de vida de un contenedor, y las networks permiten que los contenedores se comuniquen entre sí. Docker Compose une todo cuando necesitas múltiples servicios trabajando en conjunto.
Hemos organizado esto por los recursos con los que trabajas — imágenes, contenedores, volumes, networks — y Docker Compose tiene su propia sección porque a estas alturas es prácticamente una herramienta aparte. Empieza con Imágenes y Contenedores si eres nuevo. Una vez que esos se sientan naturales, volumes y networks encajarán rápido. Y si estás ejecutando algo con más de un servicio, Compose será tu hogar.
Una regla de oro: no pongas datos que te importen dentro de un contenedor sin un volume. Los contenedores son efímeros por diseño. Cuando desaparecen, todo dentro de ellos desaparece también. Los volumes son tu salvavidas.
Imágenes
docker build -t <name> .
Construir una imagen desde el Dockerfile en el directorio actualdocker build -t <name>:<tag> .
Construir y etiquetar una imagen con una versión específicadocker build --no-cache -t <name> .
Construir desde cero, ignorando las capas en cachédocker pull <image>
Descargar una imagen desde un registry (Docker Hub por defecto)docker push <image>
Subir una imagen a un registrydocker images
Listar todas las imágenes almacenadas localmentedocker images -q
Listar solo los IDs de imágenes (útil para scripting)docker tag <image> <new:tag>
Crear una nueva etiqueta apuntando a una imagen existentedocker rmi <image>
Eliminar una imagendocker rmi $(docker images -q -f dangling=true)
Eliminar todas las imágenes colgantes (sin etiqueta)docker image prune
Eliminar imágenes no utilizadas (colgantes)docker image prune -a
Eliminar todas las imágenes no usadas por ningún contenedordocker history <image>
Mostrar el historial de capas de una imagendocker inspect <image>
Mostrar metadatos detallados de una imagen en JSON
Contenedores
docker run <image>
Crear e iniciar un contenedor a partir de una imagendocker run -d <image>
Ejecutar un contenedor en segundo plano (modo detached)docker run -it <image> sh
Ejecutar interactivamente con una shell (ideal para depurar)docker run -p 8080:80 <image>
Mapear el puerto 8080 del host al puerto 80 del contenedordocker run --name <name> <image>
Ejecutar un contenedor con un nombre legibledocker run --rm <image>
Eliminar automáticamente el contenedor cuando terminedocker run -e KEY=value <image>
Pasar una variable de entorno al contenedordocker run --env-file .env <image>
Cargar variables de entorno desde un archivodocker ps
Listar contenedores en ejecucióndocker ps -a
Listar todos los contenedores, incluidos los detenidosdocker start <container>
Iniciar un contenedor detenidodocker stop <container>
Detener un contenedor en ejecución de forma ordenada (SIGTERM, luego SIGKILL)docker kill <container>
Terminar inmediatamente un contenedor en ejecución (SIGKILL)docker restart <container>
Detener e iniciar un contenedordocker exec -it <container> sh
Abrir una shell dentro de un contenedor en ejecucióndocker exec <container> <cmd>
Ejecutar un comando puntual dentro de un contenedor en ejecucióndocker logs <container>
Mostrar stdout/stderr de un contenedordocker logs -f <container>
Seguir los logs en tiempo real (como tail -f)docker logs --tail 100 <container>
Mostrar las últimas 100 líneas de logsdocker rm <container>
Eliminar un contenedor detenidodocker rm -f <container>
Forzar la eliminación de un contenedor, incluso si está en ejecucióndocker rm $(docker ps -aq)
Eliminar todos los contenedores detenidosdocker cp <container>:/path /local
Copiar archivos de un contenedor a tu hostdocker inspect <container>
Mostrar metadatos detallados del contenedor en JSONdocker stats
Flujo en vivo de uso de CPU, memoria y red de todos los contenedores
Volumes
docker volume create <name>
Crear un volume con nombredocker run -v <vol>:/data <image>
Montar un volume con nombre en /data dentro del contenedordocker run -v $(pwd):/app <image>
Montar el directorio actual dentro del contenedor (bind mount)docker run -v $(pwd):/app:ro <image>
Montar como solo lectura (el contenedor no puede escribir)docker volume ls
Listar todos los volumesdocker volume inspect <name>
Mostrar detalles de un volume (punto de montaje, driver, etc.)docker volume rm <name>
Eliminar un volumedocker volume prune
Eliminar todos los volumes no usados por ningún contenedor
Networks
docker network create <name>
Crear una red bridge definida por el usuariodocker network create --driver overlay <name>
Crear una red overlay (para Swarm / multi-host)docker run --network <name> <image>
Ejecutar un contenedor conectado a una red específicadocker network connect <net> <container>
Conectar un contenedor en ejecución a una reddocker network disconnect <net> <container>
Desconectar un contenedor de una reddocker network ls
Listar todas las redesdocker network inspect <name>
Mostrar detalles de la red incluyendo contenedores conectadosdocker network rm <name>
Eliminar una reddocker network prune
Eliminar todas las redes no utilizadas
Docker Compose
docker compose up
Crear e iniciar todos los servicios definidos en compose.yamldocker compose up -d
Iniciar servicios en segundo planodocker compose up --build
Reconstruir imágenes antes de iniciar serviciosdocker compose up <service>
Iniciar solo un servicio específico (y sus dependencias)docker compose down
Detener y eliminar contenedores y redes creados por updocker compose down -v
Igual que down, pero también elimina volumes con nombredocker compose down --rmi all
Detener todo y eliminar también las imágenesdocker compose build
Construir o reconstruir todas las imágenes de serviciosdocker compose build --no-cache
Reconstruir todas las imágenes desde cerodocker compose logs
Mostrar logs de todos los serviciosdocker compose logs -f <service>
Seguir los logs de un servicio específicodocker compose ps
Listar contenedores gestionados por Composedocker compose exec <service> sh
Abrir una shell en un contenedor de servicio en ejecucióndocker compose run <service> <cmd>
Ejecutar un comando puntual en un nuevo contenedor para ese serviciodocker compose pull
Descargar las últimas imágenes para todos los serviciosdocker compose restart <service>
Reiniciar un servicio específicodocker compose config
Validar y mostrar la configuración resuelta de Compose
Sistema y Limpieza
docker system df
Mostrar uso de disco por imágenes, contenedores y volumesdocker system prune
Eliminar contenedores detenidos, redes no usadas e imágenes colgantesdocker system prune -a --volumes
La opción nuclear — recuperar todo el espacio no utilizadodocker info
Mostrar la configuración y estadísticas globales de Dockerdocker version
Mostrar versiones del cliente y servidor de Docker
Usa docker run --rm para contenedores desechables. Sin ello, los contenedores detenidos se acumulan silenciosamente. Ejecuta docker ps -a alguna vez — podrías sorprenderte de cuántos zombis están al acecho.
Agrega un archivo .dockerignore a tu proyecto. Funciona como .gitignore pero para las construcciones. Excluir node_modules, .git y archivos de configuración local puede reducir tu contexto de construcción de gigabytes a kilobytes y acelerar las construcciones drásticamente.
Ordena las instrucciones de tu Dockerfile de menos a más frecuentemente modificadas. Docker cachea las capas de arriba hacia abajo, así que poner COPY package.json y RUN npm install antes de COPY . . significa que solo reinstalarás dependencias cuando realmente cambien — no en cada edición de código.
Usa docker compose up --build durante el desarrollo en lugar de pasos separados de build y up. Solo reconstruye lo que cambió y te ahorra el clásico "por qué no aparece mi cambio" que te rompe la cabeza.
Ejecuta docker system prune regularmente. Docker es sorprendentemente bueno acumulando espacio en disco. Agrega -a --volumes si quieres hacer tierra arrasada, pero ten cuidado — eso elimina todo lo que no esté activamente en uso, incluyendo volumes con nombre que contienen datos.
Prefiere docker compose exec sobre docker exec cuando uses Compose. Puedes referenciar servicios por nombre en lugar de buscar IDs de contenedores. docker compose exec db psql -U postgres supera copiar un hash de 12 caracteres cada vez.
Usa construcciones multi-stage para mantener las imágenes de producción ligeras. Construye tu app en una etapa con todas las dependencias de desarrollo, luego copia solo la salida compilada a una imagen base mínima. Tu imagen de Node de 1.2 GB se convierte en 150 MB.