docker exec y docker logs
docker logs: ver el output de un contenedor
Sección titulada «docker logs: ver el output de un contenedor»docker logs mi-webdocker logs -f mi-web # -f = follow, sigue mostrando en vivo (como tail -f)docker logs --tail 50 mi-webdocker logs --since 10m mi-webMuestra lo que el proceso principal del contenedor escribió a stdout/stderr — es la primera herramienta para debuggear “¿por qué mi contenedor no arranca / se cae?”.
docker exec: correr un comando dentro de un contenedor ya corriendo
Sección titulada «docker exec: correr un comando dentro de un contenedor ya corriendo»docker exec -it mi-web bashAbre una sesión interactiva de bash dentro de un contenedor que ya está corriendo — a diferencia de docker run -it (que crea uno nuevo), exec entra al que ya existe.
docker exec mi-web ls /app # correr un comando puntual, sin sesión interactivadocker exec -it mi-db psql -U postgres # entrar directo al cliente de Postgres dentro del contenedordocker exec -it vs docker run -it
Sección titulada «docker exec -it vs docker run -it»docker run -it <imagen> bash → crea un contenedor NUEVO y entradocker exec -it <contenedor> bash → entra a un contenedor que YA está corriendoConfundir los dos es común al empezar: si el contenedor de la base de datos ya está corriendo (por ejemplo, vía Compose) y se quiere entrar a inspeccionarlo, es exec, no run — run crearía un contenedor Postgres nuevo y vacío, separado del que ya tiene los datos.
Cuando bash no está disponible
Sección titulada «Cuando bash no está disponible»Algunas imágenes minimalistas (Alpine) no traen bash, solo sh:
docker exec -it mi-contenedor shCombinación típica de debug
Sección titulada «Combinación típica de debug»docker ps # ver qué está corriendo y su nombre/iddocker logs -f mi-app # ver si tira erroresdocker exec -it mi-app sh # entrar a inspeccionar archivos, variables de entorno, etc.Consideraciones
Sección titulada «Consideraciones»docker execno funciona en un contenedor detenido — hace falta que estéRunning(ver Ciclo de vida).- Cualquier cambio hecho a mano dentro de una sesión
exec(instalar algo o editar un archivo) se pierde si el contenedor se elimina y no se refleja en la imagen. Los cambios permanentes deben declararse en el Dockerfile.