Risoluzione dei problemi

Problemi di configurazione del computer o di esecuzione di un contenitore? È stato creato e reso disponibile uno script di PowerShell per verificare la presenza di problemi comuni. Si consiglia di eseguirlo per verificare e condividere i risultati.

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

Il file Readme dello script include un elenco di tutti i test che vengono eseguiti e relative soluzioni comuni.

Se il contenuto di questo file non consente di trovare l'origine del problema, si consiglia di pubblicare l'output dello script nel forum del contenitore. Questo è il posto migliore per ottenere aiuto dalla community che include Windows Insider e sviluppatori.

Ricerca di log

Sono disponibili più servizi usati per gestire i contenitori di Windows. Nelle sezioni successive viene illustrato come ottenere i log per ogni servizio.

Log dei contenitori Docker

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

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

Utilizzo di Log Monitor

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

Monitoraggio log può essere usato 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 escludono l'applicazione ping.exe. Altre applicazioni, ad esempio IIS. ServiceMonitor) può essere annidato con Log Monitor in modo analogo:

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 di cui è stato eseguito il wrapping 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 viene utilizzata la forma exec dell'istruzione CMD/ENTRYPOINT, SHELL non viene avviata e lo strumento Monitoraggio log non verrà avviato all'interno del contenitore.

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

Motore Docker

Il motore Docker esegue la registrazione nel registro eventi 'Applicazione' di Windows invece che in un file. Questi registri possono essere letti, ordinati e filtrati facilmente usando Windows PowerShell.

Ad esempio, questa istruzione visualizzerà i registri del motore Docker degli ultimi 5 minuti, partendo dal meno recente.

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

È possibile anche reindirizzare facilmente i dati in un file CSV da leggere usando 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 debug

È inoltre possibile abilitare la registrazione a livello debug nel motore Docker. Ciò potrebbe essere utile per la risoluzione dei problemi se i log regolari non contengono informazioni sufficienti.

Aprire innanzitutto un prompt dei comandi con privilegi elevati ed eseguire sc.exe qc docker per ottenere la riga di comando corrente per il servizio di 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

Usare il BINARY_PATH_NAME corrente e modificarlo come segue:

  • Aggiungere -D alla fine
  • Usare una sequenza di escape per ogni " with \
  • Racchiudere l'intero comando in "

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

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

Riavviare ora il servizio Docker

sc.exe stop docker
sc.exe start docker

Ciò registrerà più informazioni nel registro eventi dell'applicazione e per questo motivo si consiglia di rimuovere l'opzione -D dopo che il problema è stato risolto. Usare la stessa procedura descritta di sopra senza -D e riavviare il servizio per disabilitare la registrazione debug.

Un'alternativa a quanto detto sopra 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

Recupero del dump dello stack

In genere, ciò è utile solo se richiesto in modo esplicito dal supporto Tecnico Microsoft o dagli sviluppatori Docker. Può essere usato per facilitare la diagnosi di una situazione in cui Docker sembra aver bloccato.

Scarica docker signal.exe .

Utilizzo:

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

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

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

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

Servizio di elaborazione host (HCS, Host Compute Service)

Il motore Docker dipende da un servizio di elaborazione host specifico di Windows. Ha registri separati:

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

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

Ad esempio:

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

Acquisizione dei registri di analisi/debug HCS

Per abilitare i registri di analisi/debug per Hyper-V, elaborarli e salvali 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 dell'analisi dettagliata HCS

In genere, è utilizzata solo se richiesta dal supporto tecnico clienti Microsoft.

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

Fornisci HcsTrace.etl al contatto del supporto tecnico.