Fehlerbehebung
Haben Sie Probleme beim Einrichten Ihres Computers oder beim Ausführen eines Containers? Wir haben ein PowerShell-Skript erstellt, um auf häufige Probleme zu überprüfen. Bitte versuchen Sie es zuerst, zu sehen, was sie findet, und teilen Sie Ihre Ergebnisse.
Invoke-WebRequest https://aka.ms/Debug-ContainerHost.ps1 -UseBasicParsing | Invoke-Expression
Eine Liste aller tests, die sie zusammen mit allgemeinen Lösungen ausführt, befindet sich in der Readme-Datei für das Skript.
Wenn dies nicht hilft, die Quelle des Problems zu finden, veröffentlichen Sie bitte die Ausgabe Ihres Skripts im Containerforum. Dies ist der beste Ort, um Hilfe von der Community einschließlich Windows-Insider und -Entwicklern zu erhalten.
Suchen von Protokollen
Es gibt mehrere Dienste, die zum Verwalten von Windows-Containern verwendet werden. In den nächsten Abschnitten wird gezeigt, wo Protokolle für jeden Dienst abgerufen werden.
Docker-Containerprotokolle
Der Befehl docker logs
ruft die Protokolle eines Containers von STDOUT/STDERR ab, den Standardspeicherorten für Anwendungsprotokolle von Linux-Anwendungen. Windows-Anwendungen protokollieren normalerweise nicht in STDOUT/STDERR, sondern unter anderem in ETW, Ereignisprotokollen oder Protokolldateien.
Log Monitor, ein von Microsoft unterstütztes OpenSource-Tool, ist jetzt auf GitHub verfügbar. Log-Monitor verbindet Windows-Anwendungsprotokolle mit STDOUT/STDERR. Der Protokollmonitor wird über eine Konfigurationsdatei konfiguriert.
Verwendung der Protokollüberwachung
LogMonitor.exe und LogMonitorConfig.json sollten beide im selben LogMonitor-Verzeichnis enthalten sein.
Die Protokollüberwachung kann entweder in einem SHELL-Nutzungsmuster verwendet werden:
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "cmd", "/S", "/C"]
CMD c:\windows\system32\ping.exe -n 20 localhost
Oder ein ENTRYPOINT-Verwendungsmuster:
ENTRYPOINT C:\LogMonitor\LogMonitor.exe c:\windows\system32\ping.exe -n 20 localhost
Beide Beispielverwendungen umschließen die ping.exe Anwendung. Andere Anwendungen (z. B. IIS.ServiceMonitor) können auf ähnliche Weise mit Log Monitor geschachtelt werden:
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;
Die Protokollüberwachung startet die umschlossene Anwendung als untergeordneten Prozess und überwacht die STDOUT-Ausgabe der Anwendung.
Beachten Sie, dass im SHELL-Verwendungsmuster die CMD/ENTRYPOINT-Anweisung im SHELL-Formular und nicht im Exec-Formular angegeben werden sollte. Wenn das Exec-Formular der CMD/ENTRYPOINT-Anweisung verwendet wird, wird SHELL nicht gestartet, und das Protokollmonitor-Tool wird nicht innerhalb des Containers gestartet.
Weitere Nutzungsinformationen finden Sie im Log Monitor Wiki. Beispielkonfigurationsdateien für wichtige Windows-Containerszenarien (IIS usw.) finden Sie im GitHub-Repository-. Zusätzlichen Kontext finden Sie in diesem Blogbeitrag.
Docker-Engine
Die Docker Engine protokolliert im Windows-Ereignisprotokoll „Anwendung“ und nicht in einer Datei. Diese Protokolle können mithilfe von Windows PowerShell ganz einfach gelesen, sortiert und gefiltert werden.
Dies zeigt z. B. die Protokolle der Docker-Engine aus den letzten 5 Minuten, beginnend mit dem ältesten.
Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time
Dies kann auch problemlos in eine CSV-Datei weitergeleitet werden, um von einem anderen Tool oder arbeitsblatt gelesen zu werden.
Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-30) | Sort-Object Time | Export-CSV ~/last30minutes.CSV
Aktivieren der Debugprotokollierung
Sie können auch das Debug-Level-Logging auf der Docker Engine aktivieren. Dies kann bei der Problembehandlung hilfreich sein, wenn die regulären Protokolle nicht über genügend Details verfügen.
Öffnen Sie zunächst eine Eingabeaufforderung mit erhöhten Rechten, und führen Sie dann sc.exe qc docker
aus, um die aktuelle Befehlszeile für den Docker-Dienst abzurufen.
Beispiel:
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
Nehmen Sie die aktuelle BINARY_PATH_NAME
, und ändern Sie sie:
- Füge ein -D am Ende hinzu
- Versehen Sie jedes " mit dem Escapezeichen \.
- Schließen Sie den gesamten Befehl in " ein.
Führen Sie dann sc.exe config docker binpath=
gefolgt von der neuen Zeichenfolge aus. Zum Beispiel:
sc.exe config docker binpath= "\"C:\Program Files\Docker\dockerd.exe\" --run-service -D"
Starten Sie nun den Docker-Dienst neu.
sc.exe stop docker
sc.exe start docker
Dadurch wird viel mehr in das Anwendungsereignisprotokoll geschrieben, daher ist es am besten, die Option -D
zu entfernen, sobald Sie die Problembehandlung abgeschlossen haben. Führen Sie die obigen Schritte ohne -D
aus, und starten Sie den Dienst neu, um die Debugprotokollierung zu deaktivieren.
Eine Alternative zur obigen Vorgehensweise besteht darin, den Docker-Daemon im Debugmodus über eine PowerShell-Eingabeaufforderung mit erhöhten Rechten auszuführen und die Ausgabe direkt in eine Datei aufzunehmen.
sc.exe stop docker
<path\to\>dockerd.exe -D > daemon.log 2>&1
Abrufen des Stapelabbilds
Im Allgemeinen ist dies nur hilfreich, wenn sie explizit vom Microsoft-Support oder Docker-Entwicklern angefordert werden. Es kann zur Unterstützung bei der Diagnose einer Situation verwendet werden, in der Docker scheinbar abgestürzt ist.
Laden Sie docker-signal.exeherunter.
Verwendung:
docker-signal --pid=$((Get-Process dockerd).Id)
Die Ausgabedatei wird sich in dem Datenstammverzeichnis befinden, in dem Docker ausgeführt wird. Das Standardverzeichnis ist C:\ProgramData\Docker
. Das tatsächliche Verzeichnis kann durch Ausführen von docker info -f "{{.DockerRootDir}}"
bestätigt werden.
Die Datei wird goroutine-stacks-<timestamp>.log
sein.
Beachten Sie, dass goroutine-stacks*.log
keine persönlichen Informationen enthält.
Hostcomputedienst
Das Docker-Modul hängt von einem windowsspezifischen Host Compute Service ab. Es verfügt über separate Protokolle:
- Microsoft-Windows-Hyper-V-Compute-Admin
- Microsoft-Windows-Hyper-V-Compute-Operational
Sie sind in der Ereignisanzeige sichtbar und können auch mit PowerShell abgefragt werden.
Zum Beispiel:
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Admin
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Operational
Erfassen von HCS-Analyse-/Debugprotokollen
Um Analyse-/Debugprotokolle für Hyper-V Compute zu aktivieren und in hcslog.evtx
zu speichern.
# 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
Erfassen ausführlicher HCS-Ablaufverfolgung
Im Allgemeinen sind diese nur nützlich, wenn sie vom Microsoft-Support angefordert werden.
Laden Sie HcsTraceProfile.wprp herunter.
# Enable tracing
wpr.exe -start HcsTraceProfile.wprp!HcsArgon -filemode
# <reproduce your issue>
# Capture to HcsTrace.etl
wpr.exe -stop HcsTrace.etl "some description"
Stellen Sie ihrem Supportkontakt HcsTrace.etl
bereit.