Delen via


Probleemoplossing

Hebt u problemen met het instellen van uw apparaat of het uitvoeren van een container? We hebben een PowerShell-script gemaakt om te controleren op veelvoorkomende problemen. Probeer eerst wat er wordt gevonden en deel uw resultaten.

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

Een lijst met alle tests die worden uitgevoerd, samen met algemene oplossingen, bevindt zich in het Leesmij-bestand voor het script.

Als dat niet helpt bij het vinden van de oorzaak van het probleem, gaat u verder en plaatst u de uitvoer van uw script op het Container Forum. Dit is de beste plek om hulp te krijgen van de community, waaronder Windows Insiders en ontwikkelaars.

Logboeken zoeken

Er zijn meerdere services die worden gebruikt voor het beheren van Windows-containers. In de volgende secties ziet u waar u logboeken voor elke service kunt ophalen.

Docker-containerlogboeken

Met de docker logs opdracht worden de logboeken van een container opgehaald uit STDOUT/STDERR, de standaardlocatie voor het opslaan van toepassingslogboeken voor Linux-toepassingen. Windows-toepassingen melden zich doorgaans niet aan bij STDOUT/STDERR; In plaats daarvan registreren ze zich onder andere bij ETW, gebeurtenislogboeken of logboekbestanden.

Log Monitor, een door Microsoft ondersteund opensource-hulpprogramma, is nu beschikbaar op github. Logboekmonitor overbrugt Windows-toepassingslogboeken naar STDOUT/STDERR. Log Monitor is geconfigureerd via een configuratiebestand.

Gebruik van logboekcontrole

LogMonitor.exe en LogMonitorConfig.json moeten beide worden opgenomen in dezelfde LogMonitor-map.

Logmonitor kan worden gebruikt in een SHELL-gebruikspatroon:

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

Of een ENTRYPOINT-gebruikspatroon:

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

Beide voorbeelden van gebruik omvatten de ping.exe toepassing. Andere toepassingen (zoals IIS.ServiceMonitor) kunnen op een vergelijkbare manier worden geïntegreerd met Log Monitor:

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 start de verpakte toepassing als een onderliggend proces en bewaakt de STDOUT-uitvoer van de toepassing.

Houd er rekening mee dat in het SHELL-gebruikspatroon de CMD/ENTRYPOINT-instructie moet worden opgegeven in het SHELL-formulier en niet in het exec-formulier. Wanneer de exec-vorm van de INSTRUCTIE CMD/ENTRYPOINT wordt gebruikt, wordt SHELL niet gestart en wordt het hulpprogramma Log Monitor niet gestart in de container.

Meer informatie over het gebruik vindt u op de Logboekcontrole-wiki. Voorbeelden van configuratiebestanden voor belangrijke Windows-containerscenario's (IIS, enzovoort) vindt u in de github-opslagplaats. Meer context vindt u in dit blogbericht.

Docker Engine

De Docker Engine registreert zich in het gebeurtenislogboek van De Windows-toepassing in plaats van in een bestand. Deze logboeken kunnen eenvoudig worden gelezen, gesorteerd en gefilterd met Windows PowerShell

Hiermee worden bijvoorbeeld de Docker Engine-logboeken van de afgelopen 5 minuten weergegeven, beginnend met de oudste.

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

Dit kan ook eenvoudig worden doorgesluisd naar een CSV-bestand dat kan worden gelezen door een ander hulpprogramma of spreadsheet.

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

Logboekregistratie voor foutopsporing inschakelen

U kunt logboekregistratie op foutopsporingsniveau ook inschakelen op de Docker Engine. Dit kan handig zijn voor het oplossen van problemen als de normale logboeken niet over voldoende details beschikken.

Open eerst een opdrachtprompt met verhoogde bevoegdheid en voer vervolgens sc.exe qc docker uit om de huidige opdrachtregel voor de Docker-service op te halen. Voorbeeld:

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

Neem de huidige BINARY_PATH_NAMEen wijzig deze:

  • Een -D toevoegen aan het einde
  • Escape each " with \
  • Plaats de hele opdracht in "

Voer dan sc.exe config docker binpath= uit, gevolgd door de nieuwe reeks tekens. Bijvoorbeeld:

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

Start nu de Docker-service opnieuw op

sc.exe stop docker
sc.exe start docker

Hierdoor wordt er veel meer vastgelegd in het gebeurtenislogboek van de toepassing, dus u kunt het beste de optie -D verwijderen zodra u klaar bent met het oplossen van problemen. Gebruik dezelfde stappen hierboven zonder -D en start de service opnieuw om de logboekregistratie voor foutopsporing uit te schakelen.

Een alternatief voor het bovenstaande is om de Docker-daemon uit te voeren in de foutopsporingsmodus vanuit een PowerShell-prompt met verhoogde bevoegdheid, waarbij uitvoer rechtstreeks in een bestand wordt vastgelegd.

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

Stackdump verkrijgen

Over het algemeen is dit alleen nuttig als dit expliciet wordt aangevraagd door Microsoft-ondersteuning of docker-ontwikkelaars. Het kan worden gebruikt om te helpen bij het diagnosticeren van een situatie waarin Docker lijkt te zijn vastgelopen.

Download docker-signal.exe.

Gebruik:

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

Het uitvoerbestand bevindt zich in de hoofdmap gegevens waarin Docker actief is. De standaardmap is C:\ProgramData\Docker. De werkelijke map kan worden bevestigd door docker info -f "{{.DockerRootDir}}"uit te voeren.

Het bestand zal goroutine-stacks-<timestamp>.logzijn.

Houd er rekening mee dat goroutine-stacks*.log geen persoonlijke gegevens bevat.

Hostcomputeservice

De Docker Engine is afhankelijk van een Windows-specifieke Host Compute-service. Het bevat afzonderlijke logboeken:

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

Ze zijn zichtbaar in het Gebeurtenissenlogboek en kunnen ook worden opgevraagd met PowerShell.

Bijvoorbeeld:

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

Logboeken voor HCS-analyse/foutopsporing vastleggen

Om analytische/foutopsporingslogboeken in te schakelen voor Hyper-V Compute en deze op te slaan 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

HCS uitgebreide tracering vastleggen

Over het algemeen zijn deze alleen nuttig als dit door Microsoft-ondersteuning wordt aangevraagd.

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

Geef HcsTrace.etl aan uw ondersteuningsmedewerker.