Partilhar via


Solução de problemas

Está com problemas para configurar sua máquina ou executar um contêiner? Criamos um script do PowerShell para verificar problemas comuns. Por favor, experimente-o primeiro para ver o que ele encontra e compartilhar seus resultados.

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

Uma lista de todos os testes que ele executa junto com soluções comuns está no arquivo Leiame para o script.

Se isso não ajudar a encontrar a fonte do problema, vá em frente e publique a saída do seu script no Container Forum. Este é o melhor lugar para obter ajuda da comunidade, incluindo Windows Insiders e desenvolvedores.

Localizando 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 do STDOUT/STDERR, os locais de depósito de log de aplicativos padrão para aplicativos Linux. As aplicações do Windows normalmente não registam no STDOUT/STDERR; em vez disso, registam em ETW, registos de eventos ou ficheiros de log, entre outros.

Log Monitor, uma ferramenta de código aberto suportada pela Microsoft, já está disponível no github. O Monitor de Log faz a ponte entre os logs de aplicativos do Windows e o STDOUT/STDERR. O Log Monitor é configurado através 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 Log Monitor 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 do ponto de entrada:

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

Ambos os exemplos de uso envolvem o aplicativo ping.exe. Outras aplicações (como IIS.ServiceMonitor) podem ser aninhadas com o Log Monitor de forma 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 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 do SHELL, a instrução CMD/ENTRYPOINT deve ser especificada no formulário SHELL e não no formulário exec. Quando o formulário exec da instrução CMD/ENTRYPOINT é usado, o SHELL não é iniciado e a ferramenta Log Monitor não será iniciada dentro do contêiner.

Mais informações de uso podem ser encontradas no wiki do Log Monitor . Exemplos de arquivos de configuração 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 regista no log de eventos 'Aplicativo' do Windows, em vez de num ficheiro. 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, começando 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

Ativando o log de depuração

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

Primeiro, abra um Prompt de Comando elevado e, em seguida, execute o comando sc.exe qc docker para obter a linha de comandos 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
  • Fuja de cada " com \
  • Coloque todo o comando 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 Docker

sc.exe stop docker
sc.exe start docker

Isso irá registrar muito mais no registo de eventos da Aplicação, por isso é melhor remover a opção -D uma vez concluída a solução de problemas. Use as mesmas etapas acima sem -D e reinicie o serviço para desativar o log de depuração.

Uma alternativa ao acima é executar o daemon docker no modo de depuração a partir de um prompt elevado do PowerShell, 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

Geralmente, isso só é útil se explicitamente solicitado pelo suporte da Microsoft ou desenvolvedores docker. Ele poderá ser usado para ajudar a diagnosticar uma situação em que o Docker parece ter travado.

Baixar docker-signal.exe.

Utilização:

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á sendo executado. 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 de host

O mecanismo do Docker depende de um serviço de computação de host específico do Windows. 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

Capturando logs de análise/depuração da HCS

Para habilitar os logs analíticos e de depuração para Hyper-V Compute e gravá-los em 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 de HCS

Geralmente, eles só são úteis se solicitados pelo suporte da Microsoft.

Descarregar 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.