Solução de problemas

Problemas para configurar seu computador ou executar um contêiner? Criamos um script do PowerShell para verificar se há problemas comuns. Teste-o primeiro para ver o que será encontrado e compartilhe os resultados.

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

Uma lista de todos os testes executados juntamente com as soluções comuns fica no arquivo Leia-me do script.

Se isso não ajudar a localizar a origem do problema, vá em frente e publique o resultado do script no Fórum de Contêiner. Esse é o melhor lugar para obter ajuda da comunidade, incluindo especialistas e desenvolvedores do Windows.

Localizando logs

Há vários serviços que são usados para gerenciar contêineres do Windows. As seções a seguir mostram onde obter os logs para cada serviço.

Logs de Contêiner do Docker

O docker logs comando busca os logs de um contêiner de STDOUT/STDERR, os locais de depósito de log de aplicativo padrão para aplicativos Linux. Normalmente, os aplicativos do Windows não fazem logon no STDOUT/STDERR; Em vez disso, eles fazem logon no ETW, logs de eventos ou arquivos de log, entre outros.

O Log Monitor, uma ferramenta opensource com suporte da Microsoft, agora está disponível no github. O Log Monitor conecta os logs de aplicativos do Windows ao STDOUT/STDERR. O Monitor de Log é configurado por meio de um arquivo de configuração.

Uso do Monitor de Log

LogMonitor.exe e LogMonitorConfig.json devem ser incluídos no mesmo diretório LogMonitor.

O Monitor de Log pode ser usado em um padrão de uso do SHELL:

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

Ou um padrão de uso ENTRYPOINT:

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

Ambos os usos de exemplo encapsulam o aplicativo ping.exe. Outros aplicativos (como o IIS. ServiceMonitor) pode ser aninhado com o Log Monitor de maneira semelhante:

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;

O Monitor de Log inicia o aplicativo encapsulado como um processo filho e monitora a saída STDOUT do aplicativo.

Observe que, no padrão de uso do SHELL, a instrução CMD/ENTRYPOINT deve ser especificada no formulário SHELL e não no formulário executivo. Quando o formulário executivo da instrução CMD/ENTRYPOINT é usado, o SHELL não é iniciado e a ferramenta Monitor de Log não será iniciada dentro do contêiner.

Mais informações de uso podem ser encontradas no wiki do Log Monitor. Arquivos de configuração de exemplo para os principais cenários de contêiner do Windows (IIS etc.) podem ser encontrados no repositório github. Contexto adicional pode ser encontrado nesta postagem de blog.

Mecanismo do Docker

O mecanismo do Docker registra no log de eventos do 'Aplicativo' do Windows, em vez de em um arquivo. Esses logs podem ser lidos, classificados e filtrados facilmente usando o Windows PowerShell

Por exemplo, isso mostrará os logs do mecanismo do Docker dos últimos 5 minutos, começando pelo mais antigo.

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

Isso pode ser conectado facilmente em um arquivo CSV para ser lido por outra ferramenta ou planilha.

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

Habilitando o log de depuração

Você também pode habilitar o log de depuração no mecanismo do Docker. Isso poderá ser útil para solução de problemas se os logs regulares não tiverem detalhes suficientes.

Primeiro, abra um Prompt de comandos com privilégios elevados, depois execute sc.exe qc docker e obtenha a linha de comando atual para o serviço do Docker. Exemplo:

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

Pegue o atual BINARY_PATH_NAME e modifique-o:

  • Adicione -D ao final
  • Troque cada " por \
  • Coloque todo o comando entre "

Em seguida, execute sc.exe config docker binpath= seguido pela nova sequência. Por exemplo:

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

Reinicie o serviço do Docker

sc.exe stop docker
sc.exe start docker

Isso registrará muito mais no log de eventos do aplicativo, portanto, é melhor remover a opção -D após a solução de problemas. Use as mesmas etapas acima sem -D e reinicie o serviço para desabilitar o log de depuração.

Uma alternativa ao especificado acima é executar o daemon do docker no modo de depuração em um prompt do PowerShell com privilégios elevados, capturando a saída diretamente em um arquivo.

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

Obtendo despejo de pilha

Em geral, isso só será útil se solicitado explicitamente pelo suporte da Microsoft ou por desenvolvedores do Docker. Ele pode ser usado para ajudar a diagnosticar uma situação em que o Docker parece ter travado.

Baixe o docker-signal.exe.

Uso:

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

O arquivo de saída estará localizado no diretório raiz de dados no qual o Docker está em execução. O diretório padrão é C:\ProgramData\Docker. O diretório real poderá ser confirmado executando docker info -f "{{.DockerRootDir}}".

O arquivo será goroutine-stacks-<timestamp>.log.

Observe que goroutine-stacks*.log não contém informações pessoais.

Serviço de Computação de Host

O mecanismo do Docker depende de um Serviço de Computação de Host específico do Windows. Ele tem logs separados:

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

Eles são visíveis em Visualizador de Eventos e também podem ser consultados com o PowerShell.

Por exemplo:

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

Capturando logs analíticos/de depuração do HCS

Para habilitar os logs analíticos/de depuração para o Hyper-V computá-los e salvá-los no 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

Capturando o rastreamento detalhado do HCS

Em geral, eles são úteis somente se solicitados pelo suporte da Microsoft.

Baixe o 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"

Forneçao o HcsTrace.etl ao seu contato de suporte.