컨테이너 로그

DockerBeginner
지금 연습하기

소개

컨테이너 내부에서 실행되는 애플리케이션은 일반적으로 상태 메시지와 오류 메시지를 표준 출력과 표준 오류로 기록합니다. 이는 컨테이너화된 시스템에서 중요한 설계 패턴입니다. 각 컨테이너가 복잡한 로그 파일을 직접 관리하는 대신, 컨테이너 런타임이 이 스트림을 캡처하여 중앙에서 사용할 수 있도록 합니다.

이 때문에 컨테이너 이미지는 기존 서버 소프트웨어와 다른 방식으로 빌드되는 경우가 많습니다. 컨테이너 플랫폼에서는 로그를 로컬 파일에만 숨겨 두기보다 유용한 stdout/stderr 출력을 작성하는 방식을 선호합니다.

개발자나 시스템 관리자는 백그라운드 컨테이너 내부에서 어떤 일이 일어나는지 파악하기 위해 이러한 로그에 액세스해야 합니다. Kubernetes 와 같은 실제 플랫폼에서도 이 stdout/stderr 모델은 중앙 집중식 로깅 파이프라인의 기반이 됩니다.

이 실습에서는 다음을 수행하는 방법을 배웁니다.

  • 지속적으로 출력을 생성하는 컨테이너를 실행합니다.
  • 지금까지 생성된 로그를 가져옵니다.
  • 애플리케이션이 실행되는 동안 로그를 실시간으로 추적합니다.
  • 애플리케이션을 중지하지 않고 안전하게 로그 모니터링을 중단합니다.

백그라운드 프로세스 시작

이 단계에서는 Docker 컨테이너를 분리 모드 (detached mode) 로 시작합니다. 실제 애플리케이션을 모방하기 위해 1 초마다 메시지를 출력하는 간단한 스크립트를 실행합니다.

분리 모드에서 컨테이너를 실행하면 (-d 플래그 사용) 컨테이너가 백그라운드에서 실행되므로 터미널에 출력이 즉시 표시되지 않습니다.

출력은 계속 생성되지만, 현재 셸 세션으로 직접 스트리밍되는 대신 Docker 가 캡처합니다.

다음 명령을 실행하여 컨테이너를 시작합니다.

docker run -d --name web-log-app alpine sh -c "while true; do echo 'Application is running...'; sleep 1; done"

명령 분석:

  • docker run -d: 컨테이너를 백그라운드에서 시작합니다.
  • --name web-log-app: 컨테이너 이름을 "web-log-app"으로 지정합니다.
  • alpine: 가벼운 "Alpine Linux" 이미지를 사용합니다.
  • sh -c "...": 컨테이너 내부에서 실행할 명령입니다. 무한 루프 (while true) 를 실행하는 셸 스크립트를 실행하며, 각 반복에서 메시지를 출력하고 (echo) 1 초 동안 대기합니다 (sleep 1).

컨테이너가 실행 중인지 확인합니다.

docker ps

활성 컨테이너 목록에 web-log-app이 표시되어야 합니다.

기존 로그 확인

컨테이너가 백그라운드에서 실행 중이므로 현재 터미널 화면에는 컨테이너의 출력이 표시되지 않습니다. Docker 는 이 출력을 캡처하고 docker logs 명령으로 확인할 수 있게 합니다.

이 단계에서는 컨테이너가 시작된 후 지금까지 생성된 로그를 가져옵니다.

다음 명령을 실행합니다.

docker logs web-log-app

Application is running... 메시지가 여러 줄 표시됩니다.

작동 방식:

docker logs 명령은 지금까지 저장된 모든 로그를 가져와 화면에 출력합니다. 그런 다음 즉시 종료되어 명령 프롬프트로 돌아갑니다. 이 기능은 애플리케이션의 실행 이력을 확인하거나 시작 상태를 검증할 때 유용합니다.

따라서 docker logs는 현재 시점까지의 과거 출력을 보여 주는 명령이며, 컨테이너 내부로 들어가는 대화형 셸이 아닙니다. 컨테이너의 주 프로세스가 작성한 내용을 읽기 전용으로 확인하는 기능입니다.

몇 초 후 명령을 다시 실행하면 컨테이너가 백그라운드에서 계속 로그를 생성하고 있으므로 더 많은 메시지가 표시됩니다.

docker logs web-log-app

실시간으로 로그 모니터링

과거 로그를 확인하는 것만으로는 충분하지 않은 경우가 있습니다. 문제를 디버깅하거나 실시간 트래픽을 모니터링하기 위해 로그가 생성되는 과정을 지켜봐야 할 수 있습니다. 이는 Linux 에서 tail -f 명령을 사용하는 것과 비슷합니다.

이 단계에서는 -f(follow) 플래그를 사용해 로그를 실시간으로 스트리밍합니다.

다음 명령을 실행합니다.

docker logs -f web-log-app

현재 진행 중인 작업:

명령 프롬프트로 돌아가지 않습니다. 대신 터미널이 컨테이너의 로그 스트림에 연결됩니다. 1 초마다 새로운 Application is running... 메시지가 표시됩니다.

개념적으로는 tail -f와 비슷하지만, 여기서 데이터 소스는 직접 읽는 일반 파일이 아니라 Docker 가 캡처한 로그 스트림입니다.

이 모드는 애플리케이션과 상호 작용하면서 애플리케이션의 동작을 관찰할 때 매우 유용합니다.

분리하고 정리하기

현재 터미널은 로그를 계속 추적하느라 명령 프롬프트로 돌아가지 않는 상태입니다. 컨테이너는 여전히 실행 중이며 docker logs 명령은 새로운 출력을 기다리고 있습니다.

로그 확인을 중단하고 명령 프롬프트로 돌아가려면 인터럽트 신호를 보내야 합니다.

키보드에서 Ctrl+C를 누릅니다.

중요한 개념:

여기서 Ctrl+C를 누르면 로그를 표시하는 docker logs 명령만 중지됩니다. 컨테이너 자체는 중지되지 않습니다. web-log-app 컨테이너는 여전히 백그라운드에서 실행되며 로그를 생성합니다.

이 차이는 운영 측면에서 중요합니다. 컨테이너를 관찰하는 작업과 컨테이너를 제어하는 작업은 서로 다르며, 이를 혼동하는 것은 초보자가 흔히 하는 실수입니다.

프로세스 목록을 확인하여 이를 검증할 수 있습니다.

docker ps

목록에 web-log-app이 계속 표시되어야 합니다.

정리:

이제 실습을 마쳤으므로 리소스를 확보하기 위해 컨테이너를 중지하고 삭제합니다. 실행 중인 컨테이너를 강제로 삭제하는 docker rm -f를 사용합니다. 이 명령은 중지와 삭제 작업을 함께 수행합니다.

docker rm -f web-log-app

요약

이 실습에서는 Docker 컨테이너 로그에 액세스하는 기본 방법을 배웠습니다. 다음 작업을 연습했습니다.

  • 백그라운드 프로세스 실행: docker run -d를 사용해 터미널을 계속 사용할 수 있도록 합니다.
  • 기존 로그 확인: docker logs <container_name>을 사용해 과거 출력을 확인합니다.
  • 실시간 로그 모니터링: docker logs -f <container_name>을 사용해 출력이 생성되는 즉시 스트리밍합니다.
  • 분리: 애플리케이션을 계속 실행한 상태에서 Ctrl+C를 눌러 로그 확인을 중단합니다.

이러한 기술은 어떤 환경에서든 컨테이너화된 애플리케이션을 디버깅하고 모니터링하는 데 필수적입니다.