데몬 로그 읽기

데몬 로그 읽기 (Read the daemon logs)

데몬 로그는 문제를 진단하는 데 도움이 될 수 있어요. 로그는 운영 체제 구성과 사용되는 로깅 하위 시스템에 따라 몇 가지 위치 중 하나에 저장될 수 있어요:

Operating system Location
Linux journalctl -xu docker.service 명령 사용(또는 Linux 배포판에 따라 /var/log/syslog 또는 /var/log/messages 읽기)
macOS (Docker Desktop) ~/Library/Containers/com.docker.docker/Data/log/vm/init.log
Windows (WSL2) %LOCALAPPDATA%\Docker\log\vm\init.log
Windows (Windows containers) 로그는 Windows 이벤트 로그에 있음

출처: 문서

본문

macOS와 Windows(WSL2)에서 Docker Desktop은 데몬 로그(dockerd, containerd, 기타 VM 서비스)를 JSON 형식의 단일 다중화된 init.log 파일에 써요. 각 줄에는 서비스를 식별하는 "component" 필드가 있어요. 로그를 팔로우하려면 터미널을 열고 -f 플래그와 함께 tail 명령을 사용해요. CTRL+c로 명령을 종료할 때까지 로그가 출력돼요:

$ tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/init.log
{"component":"dockerd","level":"debug","msg":"attach: stdout: begin","time":"2021-07-28T10:21:21.497642089Z"}
{"component":"dockerd","level":"debug","msg":"attach: stderr: begin","time":"2021-07-28T10:21:21.497714291Z"}
...
^C

dockerd 출력만 필터링하려면:

$ grep '"component":"dockerd"' ~/Library/Containers/com.docker.docker/Data/log/vm/init.log

디버깅 활성화 (Enable debugging)

디버깅을 활성화하는 두 가지 방법이 있어요. 권장되는 방법은 daemon.json 파일의 debug 키를 true로 설정하는 거예요. 이 방법은 모든 Docker 플랫폼에서 동작해요.

  1. 보통 /etc/docker/에 있는 daemon.json 파일을 편집해요. 아직 없으면 이 파일을 만들어야 할 수도 있어요. macOS나 Windows에서는 파일을 직접 편집하지 마세요. 대신 Docker Desktop 설정을 통해 파일을 편집해요.
  2. 파일이 비어 있으면 다음을 추가해요:
{
  "debug": true
}

파일이 이미 JSON을 담고 있으면 키 "debug": true만 추가하고, 닫는 괄호 앞의 마지막 줄이 아니면 줄 끝에 쉼표를 추가하는 데 주의해요. log-level 키가 설정된 경우 info 또는 debug로 설정되어 있는지도 확인해요. info가 기본값이고, 가능한 값은 debug, info, warn, error, fatal이에요.

  1. 데몬에 HUP 신호를 보내 구성을 리로드하게 해요. Linux 호스트에서는 다음 명령을 사용해요.
$ sudo kill -SIGHUP $(pidof dockerd)

Windows 호스트에서는 Docker를 재시작해요.

이 절차를 따르는 대신 Docker 데몬을 중지하고 디버그 플래그 -D로 수동으로 재시작할 수도 있어요. 하지만 이렇게 하면 Docker가 호스트의 시작 스크립트가 만드는 환경과 다른 환경으로 재시작될 수 있고, 이는 디버깅을 더 어렵게 만들 수 있어요.

스택 트레이스 로그 강제 (Force a stack trace to be logged)

데몬이 응답하지 않으면 데몬에 SIGUSR1 신호를 보내 전체 스택 트레이스가 기록되도록 강제할 수 있어요.

  • Linux:
$ sudo kill -SIGUSR1 $(pidof dockerd)
  • Windows Server: docker-signal을 다운로드해요. Get-Process dockerd로 dockerd의 프로세스 ID를 얻어요. --pid=<PID of daemon> 플래그로 실행 파일을 실행해요.

이렇게 하면 스택 트레이스가 기록되도록 강제하지만 데몬을 중지하지는 않아요. 데몬 로그에 스택 트레이스 또는 파일에 기록된 경우 그 파일의 경로가 표시돼요.

데몬은 SIGUSR1 신호를 처리하고 스택 트레이스를 로그에 덤프한 후 계속 동작해요. 스택 트레이스는 데몬 내 모든 goroutine과 스레드의 상태를 결정하는 데 사용될 수 있어요.

스택 트레이스 보기 (View stack traces)

Docker 데몬 로그는 다음 방법 중 하나로 볼 수 있어요:

  • systemctl을 사용하는 Linux 시스템에서 journalctl -u docker.service 실행
  • 오래된 Linux 시스템의 /var/log/messages, /var/log/daemon.log, 또는 /var/log/docker.log

Note Docker Desktop for Mac 또는 Docker Desktop for Windows에서는 스택 트레이스를 수동으로 생성할 수 없어요. 하지만 문제가 발생하면 Docker 작업 표시줄 아이콘을 클릭하고 Troubleshoot를 선택해 Docker에 정보를 보낼 수 있어요.

Docker 로그에서 다음과 같은 메시지를 찾아보세요:

...goroutine stacks written to /var/run/docker/goroutine-stacks-2017-06-02T193336z.log

Docker가 이러한 스택 트레이스와 덤프를 저장하는 위치는 운영 체제와 구성에 따라 달라져요. 때로는 스택 트레이스와 덤프에서 바로 유용한 진단 정보를 얻을 수 있어요. 그렇지 않으면 이 정보를 Docker에 제공해 문제 진단에 도움을 받을 수 있어요.

더 알아보기 (Learn more)