Troubleshooting de Docker | Nicolás Garzón
--privileged
Texto
Copiar síntoma
→ identificar frontera
→ formular hipótesis
→ obtener evidencia
→ cambiar una variable
→ verificar causa
→ corregir y prevenirDocker añade capas, pero también ofrece inspect, logs, events y objetos explícitos. El método correcto las recorre en orden.
Texto
Copiar 1. cliente y context
2. daemon/host
3. registry e image
4. configuración de create
5. proceso/PID 1
6. filesystem y mounts
7. network/DNS/ports
8. resources/cgroups
9. aplicación y dependenciasNo investigues HTTP antes de demostrar que el proceso está running y escuchando.
Bash
Copiar docker ps -a
docker inspect container > inspect.json
docker logs --timestamps container > container.log
docker events --since 30m > events.log
docker stats --no-stream > stats.txt
docker system df -v > disk.txt
cambiar timestamps;
borrar writable state;
rotar logs;
ocultar exit code original;
recrear IP/config;
hacer el problema intermitente.
Mitiga primero si existe riesgo para usuarios o datos, pero conserva lo posible.
Texto
Copiar Cannot connect to the Docker daemonBash
Copiar docker context show
docker context ls
docker version
docker info
¿apuntas al daemon correcto?;
¿el socket existe?;
¿el servicio está iniciado?;
¿tu usuario tiene permiso?;
¿TLS/context remoto es válido?;
¿Docker Desktop está running?;
No cambies permisos del socket a world-writable. Controlar el daemon equivale normalmente a administración del host.
servicio del daemon;
logs del sistema;
espacio e inodes;
memory pressure;
kernel errors;
storage driver;
proxy/DNS;
clock;
certificados.
Comandos Linux conceptuales:
Bash
Copiar systemctl status docker
journalctl -u docker --since '30 min ago'
df -h
df -i
free -h
dmesg --ctime | tail En Docker Desktop, añade recursos de la VM, diagnóstico de Desktop, VPN y filesystem sharing.
Tag/digest no existe o registry incorrecto.
La plataforma del daemon no está publicada.
Autenticación, scope o repository.
CA, hostname, proxy de inspección o clock.
Bash
Copiar docker login registry.example.com
docker pull --platform linux/amd64 image
docker buildx imagetools inspect image
docker image inspect imageNo desactives TLS para “probar” en producción. Corrige confianza y hostname.
Bash
Copiar docker ps -a --filter name = api
docker inspect api --format '{{json .State}}'
docker logs api
error al crear;
proceso inicia y sale;
proceso queda running pero no ready.
0: terminó correctamente; quizá era un comando one-shot.
1: error genérico de app.
126: command encontrado pero no ejecutable/permisos.
127: command no encontrado.
137: SIGKILL; puede ser OOM, timeout o kill manual.
139: segmentation fault.
143: SIGTERM procesado como terminación.
Los significados necesitan contexto. Correlaciona State, events y logs.
Bash
Copiar docker image inspect image --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}'
docker inspect api --format '{{json .Path}} {{json .Args}}'
shell form;
quoting;
script sin executable bit;
CRLF en shebang;
path incorrecto;
entrypoint que no usa exec;
override de Compose inesperado.
Bash
Copiar docker run --rm --entrypoint /bin/sh imageSolo si la image tiene shell. En distroless usa debug image/container externo.
arquitectura incorrecta;
shebang inválido;
CRLF;
binario corrupto.
Bash
Copiar file executable
uname -m
docker image inspect image --format '{{.Architecture}}'
.dockerignore;
stage desde el que copias;
working directory;
case sensitivity;
bind mount que oculta contenido;
target equivocado.
Bash
Copiar docker create --name debug image
docker export debug | tar -tf - | head
docker rm debugNo imprimas secrets. Verifica nombres y presencia:
Bash
Copiar docker inspect api --format '{{json .Config.Env}}'
env file distinto;
interpolación Compose;
variable vacía;
secret file no montado;
permisos;
project override.
Bash
Copiar docker compose configcon cuidado de no publicar secretos.
Bash
Copiar docker top api
docker logs api
docker inspect api --format '{{json .State.Health}}' Luego identifica listener:
Bash
Copiar docker exec api sh -c 'ss -lntp || netstat -lntp' Si no hay tooling, usa logs, endpoint interno o debug container.
escucha en 127.0.0.1;
puerto distinto;
startup largo;
deadlock/event loop bloqueado;
health command ausente;
dependencia caída;
server no iniciado tras migration.
Bash
Copiar docker network inspect backendBash
Copiar docker run --rm --network backend nicolaka/netshoot getent hosts dbBash
Copiar docker run --rm --network backend nicolaka/netshoot ip routeBash
Copiar docker run --rm --network backend nicolaka/netshoot nc -zv db 5432 Bash
Copiar curl -v http://api:3000/health
no such host: DNS/network/name;
connection refused: destino alcanzado, no listener;
timeout: routing/firewall/proceso bloqueado;
TLS error: transporte funciona, falla confianza/hostname;
HTTP 500: network funciona, falla aplicación.
Dentro de un container apunta al mismo container. No a database, otro service ni host.
Usa service name para comunicación interna.
Bash
Copiar docker port api
docker inspect api --format '{{json .NetworkSettings.Ports}}'
host IP;
host port;
container port;
protocolo TCP/UDP;
firewall;
app en 0.0.0.0.
mismo container;
otro container;
host;
otra máquina.
Así localizas la frontera.
Síntoma: ciertos destinos fallan solo con VPN.
Bash
Copiar docker network inspect network
ip routeSi las subnets se superponen, coordina rangos. Reiniciar puede asignar otra red temporalmente, pero no corrige diseño.
Síntoma: ping o requests pequeños funcionan; TLS/payload grande falla.
Revisa MTU en host, bridge, VPN y overlay. Usa packet capture en entorno autorizado.
Bash
Copiar docker inspect api --format '{{json .Mounts}}'
source equivocado;
destination incorrecta;
read-only;
mount cubre archivos de image;
path relativo;
daemon remoto;
SELinux;
UID/GID;
volume distinto por project name.
permisos Unix;
owner numérico;
rootless/userns mapping;
SELinux/AppArmor;
rootfs read-only;
noexec;
capability ausente.
No escales directamente a root/privileged/777.
Bash
Copiar docker run --rm --mount type = volume,src= data,dst= /data alpine ls -lna /dataBash
Copiar docker compose ls
docker volume ls
docker inspect db --format '{{json .Mounts}}'
docker volume inspect volume
otro project name;
otro volume;
path equivocado;
down -v;
anonymous volume;
writable layer eliminada.
Bash
Copiar df -h
df -i
docker system df -v
docker ps -a --size
logs;
images;
build cache;
volumes;
container writable layers;
inodes;
archivos fuera del data root.
Libera solo después de identificar ownership y backup.
Bash
Copiar docker stats --no-stream api
docker inspect api --format '{{json .HostConfig}}' Bash
Copiar docker inspect api --format '{{.State.OOMKilled}}'
docker events --since 30mExit 137 no prueba OOM por sí solo.
RSS;
heap;
native memory;
children;
tmpfs;
limit;
host pressure.
latency alta;
CPU al límite;
timeouts;
event loop lag.
No confundas 100 % de la cuota con 100 % del host.
Errores resource temporarily unavailable, incapacidad de crear threads/procesos.
CPU/memory normales pero latencia alta. Revisa disk latency, queue y database.
Bash
Copiar docker inspect api --format '{{json .State.Health}}'
command inexistente;
shell ausente;
timeout corto;
dependencia externa;
endpoint equivocado;
check con efectos secundarios;
start period insuficiente.
Unhealthy no siempre reinicia automáticamente. Comprende la plataforma.
Bash
Copiar docker ps -a
docker inspect api --format '{{.RestartCount}}'
docker logs --tail 200 apiDesactiva temporalmente la política o ejecuta una instancia de diagnóstico controlada. No dejes que el loop destruya logs o golpee dependencies.
Bash
Copiar docker buildx build --progress = plain --no-cache-filter stage .
build context;
.dockerignore;
etapa;
cache;
network/proxy;
CA certificates;
secret mounts;
architecture;
disk;
package registry;
lockfile.
Eso sugiere cache/input incorrecto, no que “Docker cache esté dañada” necesariamente.
COPY incompleto;
build args no declarados;
generated files;
cache mounts con estado;
timestamps;
cache remota no confiable.
Corrige keys/dependencies; no desactives cache permanentemente.
Bash
Copiar docker compose config
docker compose ps --all
docker compose logs --tail 200
docker compose events
override inesperado;
profile no activado;
project name distinto;
restart en vez de recreate;
dependency healthy superficial;
port collision;
volume externo ausente.
Texto
Copiar host macOS/Windows
→ Docker Desktop
→ Linux VM
→ daemon
→ container
recursos asignados;
filesystem sharing;
VPN;
proxy;
arquitectura/emulación;
disk image;
context.
Que funcione en Desktop no garantiza Linux producción.
digest;
platform;
environment/config;
mounts;
user;
limits;
Engine/Compose version;
cgroup version;
network;
secrets;
data schema.
“Es el mismo código” no significa mismo sistema.
fija digest;
usa configuración mínima;
elimina dependencies no relacionadas;
reproduce en host limpio;
cambia una variable;
captura comandos y output;
vuelve a añadir complejidad.
No uses producción como laboratorio.
Mantén runtime mínimo y una variante debug controlada con herramientas.
No instales paquetes dentro del container productivo durante incidente: altera evidencia e inmutabilidad.
Puedes conectar un debug container a la misma network o namespaces cuando la plataforma lo permite y el riesgo está controlado.
Texto
Copiar ¿CLI conecta?
├─ no → context/socket/daemon
└─ sí
¿container fue creado?
├─ no → image/config/mount/network
└─ sí
¿PID 1 está running?
├─ no → exit/logs/signals/files
└─ sí
¿health/listener funciona?
├─ no → startup/app/resources
└─ sí
¿cliente alcanza?
├─ no → DNS/route/port/firewall
└─ sí → protocolo/dependency/businessUn incidente cerrado debe registrar:
síntoma;
timeline;
impacto;
causa raíz;
factores contribuyentes;
evidencia;
mitigación;
corrección;
prevención;
owner y fecha.
“Se arregló reiniciando” no es causa raíz.
Cambia demasiadas variables y crea riesgo.
No distingue network interna.
Puede borrar datos/cache necesarios.
Hace mutable la evidencia.
No sabes qué cambio resolvió.
Diagnostica por capas, no por intuición.
Preserva evidencia antes de reiniciar.
inspect, logs, events y stats se complementan.
Diferencia DNS, conexión, protocolo y negocio.
Exit codes necesitan contexto.
Un cambio amplio que “funciona” no identifica la causa.
Comprueba lo aprendido
Construye un diagnóstico para un container que sale con 137.
Distingue DNS failure, refused y timeout.
¿Cómo investigarías datos ausentes sin ponerlos en riesgo?
Diseña un flujo para un build que solo funciona con --no-cache.
Escribe un postmortem de un disk full causado por logs.
Limpieza y administración de disco , donde liberar espacio debe hacerse con inventario, ownership y protección de datos.