La CLI de Docker no debe aprenderse como una colección de comandos aislados. Funciona mejor si se entiende como una interfaz para consultar y modificar .
objetos administrados por un daemon
La forma moderna suele seguir este patrón:
Texto
docker <objeto> <acción> [opciones] [argumentos]
Ejemplos:
Bash
docker container lsdocker image inspect node:22
docker volume create app-data
docker network connect backend api
docker context use production
También existen aliases históricos como docker ps, docker rm o docker images. Son válidos, pero el formato objeto-acción ayuda a construir un modelo mental consistente.
Sin una organización clara, es fácil ejecutar un comando destructivo sobre el objeto equivocado, confundir configuración con estado o depender de copiar comandos sin entender sus efectos.
Cada recurso tiene una identidad y propiedades. Un container, por ejemplo, combina:
Texto
identidad
+ image
+ configuración de runtime
+ relaciones con network y mounts
+ estado observado
La CLI no siempre muestra todo en una tabla. docker container ls presenta un resumen; docker inspect devuelve la configuración efectiva y estado detallado.
Antes de memorizar flags, usa la ayuda jerárquica:
Bash
docker--helpdocker container --helpdocker container run --helpdocker compose --help
La ayuda de la versión instalada es importante porque opciones y comportamientos evolucionan. Un tutorial antiguo puede usar flags deprecados o asumir una versión diferente.
También comprueba versiones:
Bash
docker version
docker compose version
docker buildx version
No asumas que Docker Engine, Compose y Buildx tienen el mismo ciclo de versión.
docker container stop api
docker container kill api
stop intenta una terminación ordenada mediante señal y timeout. kill envía una señal inmediata, SIGKILL por defecto. Usar kill como primera reacción puede impedir flush de datos y borrar evidencia del shutdown.
docker container rm api
docker container rm--force api
Eliminar un container borra su writable layer, pero no necesariamente named volumes o images. Debes conocer la relación entre objetos antes de limpiar.
docker inspect --format'{{.State.Status}}' api
docker inspect --format'{{.State.ExitCode}}' api
docker inspect --format'{{json .Mounts}}' api
docker inspect --format'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' api
Los templates Go son útiles para humanos y scripts pequeños, pero para automatización compleja puede ser más seguro consumir JSON con una herramienta estructurada como jq.
docker logs api
docker logs --follow--since 10m --tail200 api
docker logs solo muestra lo capturado por el logging driver desde stdout/stderr. No puede recuperar automáticamente archivos internos que la aplicación escribió en otro path.
exec crea un proceso adicional dentro de namespaces del container. No reemplaza el proceso principal y termina si el container se detiene.
No todas las images contienen shell. Distroless puede no tener sh, bash, curl ni package manager. Diseña diagnóstico mediante logs, métricas y debug containers, no instalando herramientas dentro de producción.
La CLI devuelve un exit code que un script debe comprobar.
Bash
docker inspect missing-container
echo$?
No confíes únicamente en texto de salida. Con pipelines de shell, usa opciones como set -euo pipefail conscientemente y captura errores cuando necesites limpieza.
Los eventos muestran create, start, die, restart, destroy, pull y otras transiciones. Son útiles para reconstruir qué ocurrió cuando un container reinicia rápidamente.
Limitaciones:
no reemplazan una plataforma de auditoría completa;
la retención depende del daemon;
pueden ser ruidosos;
no explican por sí solos la causa dentro de la aplicación.
docker stats
docker stats --no-stream
docker system df-v
docker stats muestra consumo observado, pero debes interpretar cgroups, cache y límites. system df ayuda a distinguir images, containers, volumes y build cache.
dockerps--all--filtername='^/api$'docker inspect api --format'{{json .State}}'| jq
docker logs --tail200 api
docker events --since 10m --filtercontainer=api
docker stats --no-stream api
Flujo:
ps -a confirma que existe y muestra reinicios.
inspect revela exit code, OOM y health.
logs muestra error de aplicación.
events confirma la secuencia temporal.
stats ayuda si aún está running.
Si OOMKilled es true, aumentar memoria puede estabilizar temporalmente, pero debes analizar heap, concurrencia y límites. Si el exit code es 127, revisa command y archivos. Si health falla, distingue healthcheck defectuoso de aplicación no disponible.