Condividi tramite


Risoluzione dei problemi

State problemi a configurare la vostra macchina o a eseguire un container? È stato creato uno script di PowerShell per verificare la presenza di problemi comuni. Si prega di dare un tentativo prima di vedere cosa trova e condividere i risultati.

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

Un elenco di tutti i test eseguiti insieme alle soluzioni comuni si trova nel file Leggimi per lo script.

Se ciò non aiuta a trovare l'origine del problema, procedi e pubblica l'output del tuo script nel forum Container. Questo è il posto migliore per ottenere assistenza dalla community, inclusi Windows Insider e sviluppatori.

Ricerca dei log

Sono disponibili più servizi usati per gestire i contenitori di Windows. Le sezioni successive illustrano dove ottenere i log per ogni servizio.

Registri dei contenitori Docker

Il comando docker logs recupera i log di un contenitore da STDOUT/STDERR, i percorsi di deposito standard del log applicazioni per le applicazioni Linux. Le applicazioni Windows in genere non registrano su STDOUT/STDERR; registrano invece su ETW, registri eventi o file di log, tra gli altri metodi.

Log Monitor, uno strumento opensource supportato da Microsoft, è ora disponibile in github. Log Monitor collega i log delle applicazioni Windows a STDOUT/STDERR. Monitoraggio log viene configurato tramite un file di configurazione.

Uso del monitoraggio dei registri

LogMonitor.exe e LogMonitorConfig.json devono essere inclusi nella stessa directory LogMonitor.

Log Monitor può essere utilizzato in un modello di utilizzo SHELL:

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

Oppure un modello di utilizzo di ENTRYPOINT:

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

Entrambi gli utilizzi di esempio racchiudono l'applicazione ping.exe. Altre applicazioni (come ad esempio IIS.ServiceMonitor) possono essere annidate con Monitoraggio log in modo simile.

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;

Log Monitor avvia l'applicazione incapsulata come processo figlio e monitora l'output STDOUT dell'applicazione.

Si noti che nel modello di utilizzo di SHELL l'istruzione CMD/ENTRYPOINT deve essere specificata nel modulo SHELL e non nel formato exec. Quando si usa il formato exec dell'istruzione CMD/ENTRYPOINT, SHELL non viene avviato e lo strumento Monitoraggio log non verrà avviato all'interno del contenitore.

Altre informazioni sull'utilizzo sono disponibili nel wiki Log Monitor. I file di configurazione di esempio per gli scenari di contenitori di Windows chiave (IIS e così via) sono disponibili all'interno del repository github . Altre informazioni di contesto sono disponibili in questo post di blog .

Docker Engine

Il motore Docker accede al registro eventi "Applicazione" di Windows anziché a un file. Questi log possono essere facilmente letti, ordinati e filtrati con Windows PowerShell

Ad esempio, verranno visualizzati i log del motore Docker degli ultimi 5 minuti a partire dal meno recente.

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

Questo potrebbe anche essere facilmente inviato tramite pipe in un file CSV per essere letto da un altro strumento o foglio di calcolo.

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

Abilitazione della registrazione di debug

È anche possibile abilitare la registrazione a livello di debug nel motore Docker. Questo può essere utile per la risoluzione dei problemi se i log regolari non hanno dettagli sufficienti.

Prima di tutto, aprire un prompt dei comandi con privilegi elevati, quindi eseguire sc.exe qc docker per ottenere la riga di comando corrente per il servizio Docker. Esempio:

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

Prendere il BINARY_PATH_NAMEcorrente e modificarlo.

  • Aggiungere un -D alla fine
  • Inserisci un \ prima di ogni "
  • Mettere il comando completo in "

Eseguire quindi sc.exe config docker binpath= seguito dalla nuova stringa. Per esempio:

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

A questo momento, riavviare il servizio Docker

sc.exe stop docker
sc.exe start docker

In questo modo si accederà molto di più al registro eventi dell'applicazione, quindi è consigliabile rimuovere l'opzione -D al termine della risoluzione dei problemi. Usare gli stessi passaggi precedenti senza -D e riavviare il servizio per disabilitare la registrazione di debug.

Un'alternativa a quella precedente consiste nell'eseguire il daemon Docker in modalità di debug da un prompt di PowerShell con privilegi elevati, acquisendo l'output direttamente in un file.

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

Ottenimento del dump dello stack

In genere, questo è utile solo se richiesto in modo esplicito dal supporto Tecnico Microsoft o dagli sviluppatori Docker. Può essere usato per aiutare a diagnosticare una situazione in cui Docker sembra essersi bloccato.

Scarica docker-signal.exe.

Uso:

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

Il file di output sarà situato nella directory data-root in cui docker è in esecuzione. La directory predefinita è C:\ProgramData\Docker. La directory effettiva può essere confermata eseguendo docker info -f "{{.DockerRootDir}}".

Il file sarà goroutine-stacks-<timestamp>.log.

Si noti che goroutine-stacks*.log non contiene informazioni personali.

Servizio di calcolo host

Il motore Docker dipende da un servizio di calcolo host specifico di Windows. Ha log separati:

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

Sono visibili nel Visualizzatore eventi e possono anche essere sottoposte a query con PowerShell.

Per esempio:

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

Acquisizione di log di analisi/debug HCS

Per abilitare i log analitici/di debug per Hyper-V Calcolo e salvarli in 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

Acquisizione della traccia dettagliata di HCS

In genere, questi sono utili solo se richiesti dal supporto Tecnico Microsoft.

Scaricare 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"

Fornire HcsTrace.etl al contatto del supporto tecnico.