Compartir a través de


Solución de problemas

¿Tiene problemas para configurar el equipo o para ejecutar un contenedor? Hemos creado un script de PowerShell para comprobar los problemas comunes. Pruébelo primero para ver lo que encuentra y compartir los resultados.

Invoke-WebRequest https://aka.ms/Debug-ContainerHost.ps1 -UseBasicParsing | Invoke-Expression

Puede ver una lista de todas las pruebas que se ejecutan junto con soluciones comunes en el archivo Léame del script.

Si eso no ayuda encontrar el origen del problema, publique la salida del script en el Foro del contenedor. Este es el mejor lugar para obtener ayuda de la comunidad, incluidos los desarrolladores e Insiders de Windows.

Buscar registros

Hay varios servicios que se usan para administrar contenedores de Windows. En las secciones siguientes se muestra dónde obtener los registros de cada servicio.

Registros de contenedor de Docker

El docker logs comando captura los registros de un contenedor de STDOUT/STDERR, las ubicaciones de depósito de registros de aplicaciones estándar para aplicaciones Linux. Normalmente, las aplicaciones Windows no inician sesión en STDOUT/STDERR; en su lugar, inician sesión en ETW, registros de eventos o archivos de registro, entre otros.

Log Monitor, una herramienta de código abierto compatible con Microsoft, ahora está disponible en GitHub. El Monitor de registro conecta los registros de aplicaciones de Windows a STDOUT/STDERR. El Monitor de registro se configura a través de un archivo de configuración.

Uso del Monitor de registro

LogMonitor.exe y LogMonitorConfig.json deben incluirse en el mismo directorio LogMonitor.

El Monitor de registro se puede usar en un patrón de uso de SHELL:

SHELL ["C:\\LogMonitor\\LogMonitor.exe", "cmd", "/S", "/C"]
CMD c:\windows\system32\ping.exe -n 20 localhost

O bien, un patrón de uso ENTRYPOINT:

ENTRYPOINT C:\LogMonitor\LogMonitor.exe c:\windows\system32\ping.exe -n 20 localhost

Ambos usos de ejemplo encapsulan la aplicación ping.exe. Otras aplicaciones (como IIS. ServiceMonitor) se puede anidar con el Monitor de registro de forma similar:

COPY LogMonitor.exe LogMonitorConfig.json C:\LogMonitor\
WORKDIR /LogMonitor
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "powershell.exe"]

# Start IIS Remote Management and monitor IIS
ENTRYPOINT      Start-Service WMSVC; `
                    C:\ServiceMonitor.exe w3svc;

El Monitor de registro inicia la aplicación ajustada como un proceso secundario y supervisa la salida STDOUT de la aplicación.

Tenga en cuenta que, en el patrón de uso de SHELL, la instrucción CMD/ENTRYPOINT debe especificarse en el formulario SHELL y no en forma exec. Cuando se usa la forma exec de la instrucción CMD/ENTRYPOINT, no se inicia SHELL y la herramienta Monitor de registros no se iniciará dentro del contenedor.

Puede encontrar más información de uso en la wiki de Log Monitor. Puede encontrar archivos de configuración de ejemplo para escenarios clave de contenedor de Windows (IIS, etc.) en el repositorio de GitHub. Puede encontrar contexto adicional en esta entrada de blog.

Motor de Docker

El motor de Docker registra en el registro de eventos "Application" de Windows, en lugar de en un archivo. Estos registros se pueden leer, ordenar y filtrar muy fácilmente con Windows PowerShell.

Por ejemplo, esto mostrará los registros del motor de Docker de los últimos 5 minutos, empezando por los más antiguos.

Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time

Esto también se podría canalizar fácilmente en un archivo CSV para que otra herramienta u hoja de cálculo pueda leerlo.

Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-30)  | Sort-Object Time | Export-CSV ~/last30minutes.CSV

Habilitar el registro de depuración

También puede habilitar el registro de depuración en el motor de Docker. Esto puede resultar útil para solucionar problemas si los registros normales no tienen información suficiente.

En primer lugar, abra un símbolo del sistema con privilegios elevados, ejecute sc.exe qc docker para obtener la línea de comandos para el servicio Docker. Ejemplo:

C:\> sc.exe qc docker
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: docker
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\Program Files\Docker\dockerd.exe" --run-service
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Docker Engine
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

Tome la BINARY_PATH_NAME actual y modifíquela:

  • Agregue -D al final
  • Escape las "con \
  • Escriba el comando completo entre "

A continuación, ejecute sc.exe config docker binpath= seguido de la nueva cadena. Por ejemplo:

sc.exe config docker binpath= "\"C:\Program Files\Docker\dockerd.exe\" --run-service -D"

Reinicie el servicio Docker

sc.exe stop docker
sc.exe start docker

Esto registrará mucha más información en el registro de eventos de aplicación, por lo que es mejor quitar la opción -D una vez que haya terminado de solucionar los problemas. Use los mismos pasos anteriores sin -D y reinicie el servicio para deshabilitar el registro de depuración.

Una alternativa a lo anterior es ejecutar el daemon de Docker en modo de depuración desde el símbolo de PowerShell con privilegios elevados, capturando los resultados directamente en un archivo.

sc.exe stop docker
<path\to\>dockerd.exe -D > daemon.log 2>&1

Obtención del volcado de pila

Por lo general, esto solo es útil si el soporte técnico de Microsoft lo solicita explícitamente o los desarrolladores de Docker. Se puede usar para ayudar a diagnosticar una situación en la que Docker parece haber bloqueado.

Descarga docker signal.exe.

Uso:

docker-signal --pid=$((Get-Process dockerd).Id)

El archivo de salida se ubicará en el directorio raíz de datos en el que se ejecuta docker. El directorio predeterminado es C:\ProgramData\Docker. El directorio real puede confirmarse ejecutando docker info -f "{{.DockerRootDir}}".

El archivo será goroutine-stacks-<timestamp>.log.

Tenga en cuenta que goroutine-stacks*.log no contiene información personal.

Servicio de proceso de host

El motor de Docker depende de un servicio de contenedor de host específico de Windows. Tiene registros independientes:

  • Microsoft-Windows-Hyper-V-Compute-Admin
  • Microsoft-Windows-Hyper-V-Compute-Operational

Están visibles en Visor de eventos y también se pueden consultar con PowerShell.

Por ejemplo:

Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Admin
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Operational

Capturar registros de análisis y depuración de HCS

Habilitar los registros de análisis y depuración para proceso de Hyper-V y guardarlos en hcslog.evtx.

# Enable the analytic logs
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:true /q:true

# <reproduce your issue>

# Export to an evtx
wevtutil.exe epl Microsoft-Windows-Hyper-V-Compute-Analytic <hcslog.evtx>

# Disable
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:false /q:true

Capturar el rastreo detallado de HCS.

Por lo general, estos solamente son útiles si lo solicita el soporte técnico de Microsoft.

Descarga HcsTraceProfile.wprp

# Enable tracing
wpr.exe -start HcsTraceProfile.wprp!HcsArgon -filemode

# <reproduce your issue>

# Capture to HcsTrace.etl
wpr.exe -stop HcsTrace.etl "some description"

Proporciona HcsTrace.etl a tu contacto de soporte técnico.