다음을 통해 공유


문제 해결

컴퓨터를 설정하거나 컨테이너를 실행하는 데 문제가 있나요? 일반적인 문제를 확인하기 위해 PowerShell 스크립트를 만들었습니다. 먼저 찾아낸 내용을 확인하고 결과를 공유해 보세요.

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

일반적인 솔루션과 함께 실행되는 모든 테스트 목록은 스크립트에 대한 리드미 파일에 있습니다.

문제의 원인을 찾는 데 도움이 되지 않는 경우 스크립트의 출력을 Container Forum게시하세요. Windows 참가자 및 개발자를 포함하여 커뮤니티에서 도움을 받을 수 있는 가장 좋은 장소입니다.

로그 찾기

Windows 컨테이너를 관리하는 데 사용되는 여러 서비스가 있습니다. 다음 섹션에서는 각 서비스에 대한 로그를 가져올 위치를 보여 줍니다.

Docker 컨테이너 로그

docker logs 명령은 Linux 애플리케이션의 표준 애플리케이션 로그 예금 위치인 STDOUT/STDERR에서 컨테이너의 로그를 가져옵니다. Windows 애플리케이션은 일반적으로 STDOUT/STDERR에 로그하지 않습니다. 대신 ETW, 이벤트 로그 또는 로그 파일에 기록합니다.

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 출력을 모니터링합니다.

SHELL 사용 패턴에서 CMD/ENTRYPOINT 명령은 exec 형식이 아니라 SHELL 형식으로 지정해야 합니다. CMD/ENTRYPOINT 명령의 exec 형식을 사용하면 SHELL이 시작되지 않으며 컨테이너 내에서 로그 모니터 도구가 시작되지 않습니다.

자세한 사용 정보는 Log Monitor wiki찾을 수 있습니다. 주요 Windows 컨테이너 시나리오(IIS 등)에 대한 예제 구성 파일은 github 리포지토리내에서 찾을 수 있습니다. 추가 컨텍스트는 이 블로그 게시물에서 찾을 수 있습니다.

Docker 엔진

Docker 엔진은 파일이 아닌 Windows 'Application' 이벤트 로그에 로그합니다. 이러한 로그는 Windows PowerShell을 사용하여 쉽게 읽고 정렬하고 필터링할 수 있습니다.

예를 들어 가장 오래된 것으로 시작하는 지난 5분 동안의 Docker 엔진 로그가 표시됩니다.

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 엔진에서 디버그 수준 로깅을 사용하도록 설정할 수도 있습니다. 일반 로그에 세부 정보가 충분하지 않은 경우 문제를 해결하는 데 도움이 될 수 있습니다.

먼저 관리자 권한 명령 프롬프트를 연 다음 Docker 서비스에 대한 현재 명령줄을 가져오는 sc.exe qc 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 않고 위의 동일한 단계를 사용하고 서비스를 다시 시작하여 디버그 로깅을 사용하지 않도록 설정합니다.

위의 대안은 관리자 권한 PowerShell 프롬프트에서 디버그 모드로 Docker 디먼을 실행하여 출력을 파일에 직접 캡처하는 것입니다.

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

스택 덤프 가져오기

일반적으로 이 기능은 Microsoft 지원 또는 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 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 상세 추적 캡처

일반적으로 이러한 기능은 Microsoft 지원에서 요청하는 경우에만 유용합니다.

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 제공합니다.