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


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

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

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

Список всех запускаемых тестов вместе с распространенными решениями находится в файле сведений скрипта.

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

Нахождение журналов

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

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

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

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

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

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

Монитор журналов можно использовать в шаблоне использования ОБОЛОЧКИ:

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 должна быть указана в форме ОБОЛОЧКИ, а не в форме exec. Если используется exec-форма инструкции CMD/ENTRYPOINT, оболочка оболочки не запускается, а средство "Монитор журналов" не запускается внутри контейнера.

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

Модуль Docker

Подсистема Docker записывает сообщения в журнал событий приложений Windows, а не в файл журнала. Эти журналы можно легко прочитать, отсортировать и отфильтровать с помощью 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 зависит от службы контейнера узлов конкретной версии Windows. Она содержит отдельные журналы:

  • 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 с их сохранением в файле 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 специалисту службы поддержки.