Compartilhar via


Resolução de problemas

Tem problemas para configurar seu computador ou executar um contêiner? Criamos um script do PowerShell para verificar se há problemas comuns. Tente primeiro ver o que ele encontra e compartilhe seus resultados.

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

Uma lista de todos os testes executados, juntamente com soluções comuns, está no arquivo Readme para o script.

Se isso não ajudar a encontrar a origem do problema, publique a saída do script no Fórum de contêineres. Este é o melhor lugar para obter ajuda da comunidade, incluindo participantes do Programa Windows Insider e desenvolvedores.

Como localizar logs

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

Logs de contêiner do Docker

O comando docker logs busca os logs de um contêiner a partir de STDOUT/STDERR, que são os locais padrão de armazenamento de logs para aplicativos Linux. Os aplicativos do Windows normalmente não registram no STDOUT/STDERR; em vez disso, eles registram no ETW, Log de Eventos ou arquivos de log, entre outros.

Log Monitor, uma ferramenta open source 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 Log Monitor

LogMonitor.exe e LogMonitorConfig.json devem ser incluídos no mesmo diretório do 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 de "ENTRYPOINT":

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

Ambos os exemplos de uso encapsulam o aplicativo ping.exe. Outros aplicativos (como IIS.ServiceMonitor) podem ser aninhados com o Log Monitor da mesma forma.

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 Log Monitor inicia o aplicativo encapsulado como um processo filho e monitora a saída STDOUT do aplicativo.

Observe que, no padrão de uso shell, a instrução CMD/ENTRYPOINT deve ser especificada no formulário SHELL e não no formulário executivo. Quando a forma exec da instrução CMD/ENTRYPOINT é usada, o SHELL não é iniciado, e a ferramenta de monitoramento 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 Docker Engine registra no log de eventos "Aplicativo" do Windows, em vez de em um arquivo. Esses logs podem ser facilmente lidos, classificados e filtrados usando o Windows PowerShell

Por exemplo, isso mostrará os logs do Docker Engine dos últimos 5 minutos iniciando com o mais antigo.

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

Isso também pode ser facilmente canalizado para 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

Como habilitar o registro de depuração

Você também pode habilitar o registro em log no nível de depuração no Mecanismo do Docker. Isso pode 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 e, em seguida, execute o comando sc.exe qc docker para obter a linha de comando atual do serviço 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 BINARY_PATH_NAMEatual e modifique-o:

  • Adicionar um -D ao final
  • Escape cada " com \
  • Coloque o comando inteiro em "

Em seguida, execute sc.exe config docker binpath= seguido pela nova cadeia de caracteres. Por exemplo:

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

Agora, 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 assim que terminar de solucionar problemas. Siga os mesmos passos acima sem o -D e reinicie o serviço para desabilitar o log de depuração.

Uma alternativa à mencionada acima é executar o daemon do Docker no modo de depuração de 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

Como obter o 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.

Baixar docker-signal.exe.

Uso:

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

O arquivo de saída estará localizado no diretório raiz de dados em que o Docker está em execução. O diretório padrão é C:\ProgramData\Docker. O diretório real pode 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 Hospedeira

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 no 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

Como capturar logs de análise/depuração do HCS

Para habilitar logs de análise/depuração para Computação do Hyper-V 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

Como capturar o rastreamento detalhado do HCS

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

Baixar 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ça HcsTrace.etl ao seu contato de suporte.