Algo falló a las nueve de la noche
La página de una tienda muestra un error. La persona que la hizo duerme. Tú estás de guardia y no puedes preguntarle nada.
Todo lo que necesitas está en la máquina: lo que se le dijo al programa que hiciera y lo que el programa dijo mientras funcionaba.
Al terminar esta lección
Nota
Puedo averiguar cómo se configuró un contenedor y qué ha dicho.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Inspeccionar | leer todos los ajustes de un contenedor | |
| Log | los mensajes que un programa escribe mientras funciona | |
| Código de salida | el número que da un programa al parar; 0 significa éxito | |
| Comprobación de salud | una prueba que Docker repite para ver si un servicio responde | |
| Variable de entorno | un ajuste con nombre que se da a un programa | NGINX_VERSION |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
docker inspect lee los ajustes de un contenedor
docker ps muestra unas pocas columnas. docker inspect muestra todo lo que Docker sabe de un contenedor, en JSON.
Casi nunca se lee entero. --format elige un campo, escrito entre dobles llaves. Los cuatro comandos siguientes leen la imagen, las puertas, el límite de memoria y una variable de entorno de web.
¿Qué imagen ejecuta web?
docker inspect --format '{{.Config.Image}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Qué puertas dice usar?
docker inspect --format '{{json .Config.ExposedPorts}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Cuánta memoria puede usar, en bytes?
docker inspect --format '{{.HostConfig.Memory}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee una variable de entorno de dentro
docker exec web printenv NGINX_VERSIONSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: quién fijó cada cosa
| Cosa | Quién la fijó | Cómo se lee |
|---|---|---|
| La imagen | quien arrancó el contenedor | Config.Image |
| Las puertas | el autor de la imagen, en el Dockerfile | Config.ExposedPorts |
| El límite de memoria | el archivo compose del laboratorio | HostConfig.Memory |
| NGINX_VERSION | el autor de la imagen, en el Dockerfile | docker exec web printenv NGINX_VERSION |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que docker ps muestra todo de un contenedor. Muestra un resumen. El usuario con el que corre, sus límites, su entorno y su salud solo están en docker inspect. Usa ps para encontrar el contenedor e inspect para hacerle preguntas.
Un log es lo que el programa dijo
El log de un contenedor es todo lo que imprimió su programa principal. docker logs lo muestra.
Un servicio ocupado escribe mucho. En este laboratorio una comprobación de salud llama a web cada pocos segundos, y cada llamada es una línea. Por eso se filtra. Primero pide una página que no existe.
Pide a web una página que no tiene
curl -s -o /dev/null -w "%{http_code}\n" http://web/missingSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Encuentra esa petición en el log
docker logs web 2>&1 | grep "/missing"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Código de salida y salud dicen cómo acabó
Un contenedor está en marcha o se ha parado. Cuando se para, su código de salida dice cómo. Cero significa que terminó bien. Cualquier otro número significa que falló.
Una comprobación de salud es una prueba que Docker repite mientras el contenedor funciona. El resultado es healthy o unhealthy.
¿Está web en marcha? ¿Qué código tiene?
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Pasa web su comprobación de salud?
docker inspect --format '{{.State.Health.Status}}' webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Cuánta memoria usa web ahora?
docker stats --no-stream --format "{{.Name}} {{.MemUsage}}" webSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: cuatro preguntas ante un fallo
| Pregunta | Comando | Lo que podría mostrar un trabajo "report" parado |
|---|---|---|
| ¿Está en marcha? | docker ps -a | Exited (137) hace un minuto |
| ¿Cómo acabó? | docker inspect --format '{{.State.ExitCode}}' report | 137: lo mataron |
| ¿Qué dijo al final? | docker logs --tail 5 report | una línea sobre quedarse sin memoria |
| ¿Qué se le había fijado? | docker inspect --format '{{.HostConfig.Memory}}' report | un límite menor de lo que el trabajo necesita |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más lejos
El worker del laboratorio se ha parado. Ya tienes las cuatro preguntas para él: su estado, su código de salida, su log y sus ajustes. La tarea del laboratorio es responderlas y arreglarlo.
Antes, ejecuta docker inspect web sin --format. Encuentra las tres secciones grandes: Config, State y HostConfig.