Поделиться через


Устранение неполадок

Возникли проблемы с настройкой компьютера или запуском контейнера? Мы создали скрипт PowerShell для проверки распространенных проблем. Попробуйте сначала увидеть, что он находит и поделиться результатами.

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

Список всех тестов, которые выполняются, вместе с общими решениями находится в файле Readme для скрипта .

Если это не поможет найти источник проблемы, можете опубликовать результаты выполнения вашего скрипта на форуме Контейнеров. Это лучшее место, чтобы получить помощь от сообщества, включая участников программы предварительной оценки Windows и разработчиков.

Поиск журналов

Существует несколько служб, которые используются для управления контейнерами Windows. В следующих разделах показано, где получить журналы для каждой службы.

Журналы контейнеров Docker

Команда docker logs извлекает журналы контейнера из STDOUT/STDERR, стандартных расположений журналов приложений для приложений Linux. Приложения Windows обычно не регистрируются в STDOUT/STDERR; вместо этого они регистрируются в ETW, журналах событий или файлах журналов, среди прочего.

Log Monitor, поддерживаемый Microsoft инструмент с открытым исходным кодом, теперь доступен на сайте GitHub. Монитор журналов связывает журналы приложений Windows с STDOUT/STDERR. Монитор журналов настраивается с помощью файла конфигурации.

Использование монитора журналов

LogMonitor.exe и LogMonitorConfig.json должны быть включены в один каталог LogMonitor.

Монитор журналов можно использовать в шаблоне использования SHELL:

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

Или шаблон использования ENTRYPOINT:

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

Оба примера использования охватывают приложение ping.exe. Другие приложения (например, IIS.ServiceMonitor) можно вложить с помощью Монитора Журналов подобным образом:

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;

Монитор журналов запускает обёрнутое приложение в качестве дочернего процесса и отслеживает выходные данные STDOUT этого приложения.

Обратите внимание, что в шаблоне использования ОБОЛОЧКИ инструкция CMD/ENTRYPOINT должна быть указана в формате SHELL, а не в формате exec. Если используется форма exec инструкции CMD/ENTRYPOINT, оболочка не запускается, и средство "Мониторинг журналов" также не будет запущено внутри контейнера.

Дополнительную информацию об использовании можно найти на вики монитора журналов . Примеры файлов конфигурации для ключевых сценариев контейнеров Windows (IIS и т. д.) можно найти в репозитории github. Дополнительные контексты можно найти в этой записи блога .

Подсистема Docker

Подсистема Docker регистрирует журнал событий Windows Application, а не в файл. Эти журналы можно легко считывать, сортировать и фильтровать с помощью Windows PowerShell

Например, в этом случае будут отображаться журналы подсистемы Docker за последние 5 минут, начиная с самого старого.

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

Это также может быть легко передано в CSV-файл для чтения другим средством или электронной таблицей.

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

Включение ведения журнала отладки

Вы также можете включить ведение журнала на уровне отладки в подсистеме Docker. Это может быть полезно для устранения неполадок, если обычные журналы не имеют достаточно подробных сведений.

Сначала откройте командную строку с повышенными привилегиями, а затем запустите sc.exe qc docker получите текущую командную строку для службы Docker. Пример:

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

Возьмите текущий BINARY_PATH_NAMEи измените его:

  • Добавьте -D в конец
  • Экранируйте каждую " с помощью \
  • Заключите всю команду в "

Затем запустите sc.exe config docker binpath=, а затем новую строку. Например:

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

Теперь перезапустите службу Docker

sc.exe stop docker
sc.exe start docker

Это будет записывать намного больше в журнал событий приложения, поэтому рекомендуется удалить параметр -D после завершения устранения неисправностей. Выполните те же действия, описанные выше без -D, и перезапустите службу, чтобы отключить ведение журнала отладки.

Альтернативным вариантом выше является запуск управляющей программы Docker в режиме отладки из командной строки PowerShell с повышенными привилегиями, записывая выходные данные непосредственно в файл.

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

Получение дампа стека

Как правило, это полезно только при явном запросе поддержки Майкрософт или разработчиков Docker. Его можно использовать для диагностики ситуации, когда Docker, кажется, завис.

Скачайте docker-signal.exe.

Употребление:

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

Выходной файл будет находиться в корневом каталоге данных, в котором работает Docker. Каталог по умолчанию — C:\ProgramData\Docker. Фактический каталог можно подтвердить, выполнив docker info -f "{{.DockerRootDir}}".

Файл будет goroutine-stacks-<timestamp>.log.

Обратите внимание, что goroutine-stacks*.log не содержит личные сведения.

Служба вычислений узла

Docker Engine зависит от Windows-специфической Host Compute Service. В нем есть отдельные журналы:

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

Они видны в средстве просмотра событий и также могут запрашиваться с помощью PowerShell.

Например:

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

Запись журналов аналитики и отладки HCS

Чтобы включить журналы аналитики и отладки для компонента Hyper-V Compute и сохранить их в 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

Как правило, они полезны только при запросе поддержки Майкрософт.

Загрузите 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"

Предоставьте HcsTrace.etl вашему контакту службы поддержки.