Udostępnij za pośrednictwem


Rozwiązywanie problemów

Masz problemy z konfigurowaniem maszyny lub uruchamianiem kontenera? Utworzyliśmy skrypt programu PowerShell, aby sprawdzić typowe problemy. Spróbuj najpierw zobaczyć, co znajdzie i udostępnić wyniki.

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

Lista wszystkich testów, które są uruchamiane wraz z typowymi rozwiązaniami, znajduje się w pliku Readme dla skryptu.

Jeśli to nie pomoże znaleźć źródła problemu, proszę kontynuować i zamieścić dane wyjściowe z Twojego skryptu na forum kontenera . Jest to najlepsze miejsce, aby uzyskać pomoc od społeczności, w tym testerów systemu Windows i deweloperów.

Znajdowanie logów

Istnieje wiele usług używanych do zarządzania kontenerami systemu Windows. W następnych sekcjach pokazano, gdzie pobrać dzienniki dla każdej usługi.

Dzienniki kontenera platformy Docker

Polecenie docker logs pobiera logi kontenera z STDOUT/STDERR, standardowych lokalizacji dzienników aplikacji dla aplikacji systemu Linux. Aplikacje systemu Windows zazwyczaj nie logują się do STDOUT/STDERR; zamiast tego logują się do plików ETW, dzienników zdarzeń lub plików dziennika, między innymi.

Monitor dzienników, narzędzie opensource obsługiwane przez firmę Microsoft, jest teraz dostępne w witrynie GitHub. Monitor dzienników łączy dzienniki aplikacji systemu Windows z dziennikami STDOUT/STDERR. Monitor dzienników jest konfigurowany za pośrednictwem pliku konfiguracji.

Użycie narzędzia do monitorowania dzienników

LogMonitor.exe i LogMonitorConfig.json powinny być uwzględnione w tym samym katalogu LogMonitor.

Monitor dzienników może być używany w trybie działania powłoki:

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

Lub wzorzec użycia programu ENTRYPOINT:

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

Oba przykładowe użycia obejmują aplikację ping.exe. Inne aplikacje (takie jak IIS.ServiceMonitor) można zagnieżdżać z Log Monitorem w podobny sposób:

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;

Monitor logów uruchamia opakowaną aplikację jako proces podrzędny i obserwuje dane wyjściowe STDOUT tej aplikacji.

Należy pamiętać, że we wzorcu użycia SHELL instrukcja CMD/ENTRYPOINT powinna być określona w formie SHELL, a nie w formie exec. Gdy używana jest forma exec w instrukcji CMD/ENTRYPOINT, powłoka nie jest uruchamiana, a narzędzie Monitor logów nie zostanie uruchomione wewnątrz kontenera.

Więcej informacji o użyciu można znaleźć w wikipedii monitora logów . Przykładowe pliki konfiguracji dla kluczowych scenariuszy kontenera systemu Windows (IIS itp.) można znaleźć w repozytorium github. Dodatkowy kontekst można znaleźć w tym wpisie na blogu .

Docker Engine

Silnik Docker rejestruje do dziennika zdarzeń "Aplikacja" w systemie Windows, zamiast do pliku. Te dzienniki można łatwo odczytywać, sortować i filtrować przy użyciu programu Windows PowerShell

Na przykład spowoduje to wyświetlenie dzienników silnika Docker z ostatnich 5 minut, zaczynając od najstarszych.

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

Można to również łatwo przesłać potokiem do pliku CSV, aby można je było odczytać za pomocą innego narzędzia lub arkusza kalkulacyjnego.

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

Włączanie rejestrowania debugowania

Możesz również włączyć rejestrowanie na poziomie debug w silniku Docker. Może to być przydatne w przypadku rozwiązywania problemów, jeśli zwykłe dzienniki nie mają wystarczającej ilości szczegółów.

Najpierw otwórz wiersz polecenia z podwyższonym poziomem uprawnień, a następnie uruchom polecenie sc.exe qc docker pobierz bieżący wiersz polecenia dla usługi Docker. Przykład:

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

Weź aktualny BINARY_PATH_NAMEi go zmodyfikuj:

  • Dodaj -D na końcu
  • Poprzedzaj każdy znak " znakiem \
  • Ujmij całe polecenie w "

Następnie uruchom sc.exe config docker binpath=, a potem nowy ciąg. Na przykład:

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

Teraz uruchom ponownie usługę Platformy Docker

sc.exe stop docker
sc.exe start docker

Spowoduje to znacznie więcej logowań w dzienniku zdarzeń aplikacji, dlatego najlepiej jest usunąć opcję -D po zakończeniu rozwiązywania problemów. Wykonaj te same kroki bez -D i uruchom ponownie usługę, aby rejestrowanie debug zostało wyłączone.

Alternatywą dla powyższego jest uruchomienie demona platformy Docker w trybie debugowania z poziomu wiersza polecenia programu PowerShell z podwyższonym poziomem uprawnień, przechwytywanie danych wyjściowych bezpośrednio do pliku.

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

Uzyskiwanie zrzutu stosu

Ogólnie rzecz biorąc, jest to przydatne tylko wtedy, gdy jest to jawnie wymagane przez pomoc techniczną firmy Microsoft lub deweloperów platformy Docker. Może służyć do diagnozowania sytuacji, w której platforma Docker wydaje się być zawieszona.

Pobierz docker-signal.exe.

Użycie

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

Plik wyjściowy zostanie umieszczony w katalogu głównym danych, w którym docker jest uruchomiony. Domyślny katalog to C:\ProgramData\Docker. Rzeczywisty katalog można potwierdzić, uruchamiając docker info -f "{{.DockerRootDir}}".

Plik zostanie goroutine-stacks-<timestamp>.log.

Należy pamiętać, że goroutine-stacks*.log nie zawiera danych osobowych.

Hostowanie usługi obliczeniowej

Silnik Docker zależy od usługi obliczeniowej hosta specjalnego dla Windows. Ma oddzielne dzienniki:

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

Są one widoczne w Podglądzie zdarzeń i mogą być również odpytywane za pomocą programu PowerShell.

Na przykład:

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

Przechwytywanie dzienników analityki/debugowania HCS

Aby włączyć logi analityczne i debugowania dla Hyper-V Compute oraz zapisać je do 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

Przechwytywanie szczegółowego śledzenia HCS

Ogólnie rzecz biorąc, są one przydatne tylko w przypadku żądania pomocy technicznej firmy Microsoft.

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

Podaj HcsTrace.etl do kontaktu z pomocą techniczną.