Docker Desktop 로그 명령어로 Docker Desktop 로그 확인 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker desktop logs 명령어를 효과적으로 사용하여 Docker 컨테이너에서 생성된 로그를 보고 분석하는 방법을 배우게 됩니다. 컨테이너 로그를 이해하는 것은 애플리케이션을 디버깅하고 동작을 모니터링하는 데 매우 중요합니다.

이 실습 랩에서는 기본적인 컨테이너 로그를 보는 방법을 안내하고, 우선순위, 시간 범위 및 로그를 생성하는 특정 유닛 (컨테이너 또는 서비스) 을 기준으로 이러한 로그를 필터링하는 방법을 보여줍니다. 이 랩을 마치면 docker desktop logs 명령어를 사용하여 컨테이너화된 애플리케이션에 대한 귀중한 통찰력을 얻는 데 능숙해질 것입니다.

기본 Docker Desktop 로그 보기

이 단계에서는 Docker 컨테이너에서 기본 로그를 보는 방법을 배우게 됩니다. 로그는 컨테이너에서 실행되는 애플리케이션을 디버깅하고 모니터링하는 데 필수적입니다.

먼저, 몇 가지 출력을 생성하는 간단한 컨테이너를 실행해 보겠습니다. 메시지를 출력하고 종료되는 매우 작은 이미지인 hello-world 이미지를 사용합니다.

docker run hello-world

Docker 데몬이 이미지를 풀링하고 컨테이너를 성공적으로 실행했음을 나타내는 다음과 유사한 출력을 볼 수 있습니다.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f52335ce493178fc15f729218f180e9988e31c374a6ce98da40cbb890f97f10e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To learn more, try the following commands:
 docker run -it ubuntu bash
 docker images
 docker ps
 docker stop <containerid>
 docker rm <containerid>
To get started with Docker Desktop, visit:
 https://www.docker.com/products/docker-desktop

보이는 출력은 컨테이너의 표준 출력 (stdout) 및 표준 오류 (stderr) 스트림입니다. Docker 는 이러한 스트림을 캡처하여 로그로 사용할 수 있도록 합니다.

이제 계속 실행되면서 시간이 지남에 따라 로그를 생성하는 컨테이너를 실행해 보겠습니다. alpine 이미지를 사용하고 5 초마다 메시지를 출력하는 간단한 명령을 실행합니다.

먼저, alpine 이미지를 풀링합니다.

docker pull alpine

이미지가 풀링되고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/alpine
... (output showing download progress)
Digest: sha256:...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

이제 백그라운드에서 실행되도록 detached 모드 (-d) 로 alpine 컨테이너를 실행하고, 쉽게 참조할 수 있도록 이름을 지정합니다 (--name mylogger). while true; do echo "Hello from mylogger at $(date)"; sleep 5; done 명령은 5 초마다 현재 날짜와 함께 메시지를 출력합니다.

docker run -d --name mylogger alpine sh -c 'while true; do echo "Hello from mylogger at $(date)"; sleep 5; done'

이 명령은 컨테이너 ID 를 출력합니다.

실행 중인 컨테이너의 로그를 보려면 docker logs 명령 다음에 컨테이너 이름 또는 ID 를 사용합니다.

docker logs mylogger

컨테이너의 명령으로 생성된 출력을 볼 수 있으며, 약 5 초마다 새 줄이 나타납니다. Ctrl+C를 눌러 로그 보기를 중지할 수 있습니다.

로그를 실시간으로 따라가려면 -f (follow) 옵션을 사용합니다.

docker logs -f mylogger

이렇게 하면 새 로그 항목이 생성될 때마다 지속적으로 표시됩니다. Ctrl+C를 눌러 로그를 따르는 것을 중지합니다.

마지막으로, 생성한 컨테이너를 중지하고 제거해 보겠습니다.

docker stop mylogger
docker rm mylogger

이렇게 하면 컨테이너 리소스가 정리됩니다.

우선 순위별 로그 필터링

이 단계에서는 Docker 컨테이너 로그를 우선순위 수준에 따라 필터링하는 방법을 배우게 됩니다. 표준 docker logs는 systemd-journald 와 같은 내장된 우선순위 필터링을 제공하지 않지만, grep과 같은 도구를 사용하여 로그 출력에서 특정 키워드 또는 패턴을 검색하여 유사한 필터링을 수행할 수 있습니다.

이전 단계에서 사용했던 alpine 컨테이너를 사용해 보겠습니다. 중지하고 제거했다면 다시 실행하십시오.

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

이 명령은 detached 모드에서 컨테이너를 실행하고 5 초마다 서로 다른 "우선순위" 접두사 (INFO, WARNING, ERROR) 가 있는 메시지를 출력합니다.

이제 로그를 보고 "ERROR"를 포함하는 줄만 표시하도록 필터링해 보겠습니다. docker logs의 출력을 grep으로 파이프할 수 있습니다.

docker logs mylogger | grep "ERROR"

"ERROR"라는 단어를 포함하는 컨테이너 로그의 줄만 표시됩니다.

마찬가지로 "WARNING"을 포함하는 줄만 보려면 다음을 수행합니다.

docker logs mylogger | grep "WARNING"

그리고 "INFO"를 포함하는 줄을 보려면:

docker logs mylogger | grep "INFO"

필터를 결합할 수도 있습니다. 예를 들어 "WARNING" 또는 "ERROR"를 포함하는 줄을 보려면 확장 정규 표현식을 위해 grep과 함께 -E 옵션과 | 연산자를 사용할 수 있습니다.

docker logs mylogger | grep -E "WARNING|ERROR"

이렇게 하면 경고 또는 오류인 모든 로그 항목이 표시됩니다.

이 방법은 컨테이너의 애플리케이션이 특정 키워드로 로그를 작성하는 데 의존한다는 점을 기억하십시오. 더 구조화된 로깅 및 고급 필터링을 위해서는 전용 로깅 드라이버 또는 Docker 외부의 로깅 솔루션을 고려하십시오.

마지막으로, 컨테이너를 중지하고 제거합니다.

docker stop mylogger
docker rm mylogger

시간 범위별 로그 필터링

이 단계에서는 특정 시간 범위를 기반으로 Docker 컨테이너 로그를 필터링하는 방법을 배우게 됩니다. 이는 사고 또는 특정 배포 중에 특정 기간의 로그를 검사하는 데 유용합니다.

docker logs 명령은 시간별로 로그를 필터링하는 옵션을 제공합니다. 다시 alpine 컨테이너를 사용합니다. 실행 중이지 않은 경우 이전과 동일한 명령으로 시작합니다.

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

컨테이너가 몇 분 동안 실행되어 몇 개의 로그를 생성하도록 합니다.

특정 시간 이후에 생성된 로그를 보려면 --since 옵션을 사용합니다. 시간은 타임스탬프 (에포크 이후의 초), 상대 시간 (예: 10 분은 10m, 1 시간은 1h), 또는 날짜/시간 문자열을 포함한 다양한 형식으로 지정할 수 있습니다.

지난 2 분 동안 생성된 로그를 살펴보겠습니다.

docker logs --since 2m mylogger

이 명령은 지난 2 분 이내에 생성된 mylogger 컨테이너의 모든 로그 항목을 표시합니다.

--since--until을 사용하여 시작 및 종료 시간을 지정할 수도 있습니다. --until 옵션은 --since와 유사하게 작동하며, 로그를 보고 싶은 시간을 지정할 수 있습니다.

5 분 전부터 1 분 전까지 생성된 로그를 보려면:

docker logs --since 5m --until 1m mylogger

이 명령은 지정된 시간 창의 로그를 표시합니다. 정확한 출력은 명령을 실행하는 시점과 컨테이너가 실행된 시간에 따라 달라집니다.

특정 타임스탬프를 사용할 수도 있습니다. 현재 타임스탬프를 얻으려면 date +%s 명령을 사용할 수 있습니다.

1 분 전의 타임스탬프를 얻어 보겠습니다.

date -d "1 minute ago" +%s

이제 --until과 함께 이 타임스탬프를 사용하여 1 분 전까지의 로그를 봅니다.

docker logs --until $(date -d "1 minute ago" +%s) mylogger

이 명령은 컨테이너의 시작부터 1 분 전까지의 로그를 표시합니다.

시간 범위별 필터링은 로그 분석을 좁히고 관련 이벤트에 집중하는 강력한 방법입니다.

마지막으로, 컨테이너를 중지하고 제거합니다.

docker stop mylogger
docker rm mylogger

유닛별 로그 필터링

이 단계에서는 Docker 컨테이너 로그를 해당 로그를 생성한 "유닛"별로 필터링하는 방법을 배우게 됩니다. Docker 로그의 컨텍스트에서 "유닛"은 일반적으로 컨테이너 자체를 의미합니다. docker logs는 본질적으로 단일 컨테이너 (또는 유닛) 에서 작동하지만, 이 개념을 이해하는 것은 더 발전된 로깅 시스템으로 작업하거나 서로 다른 컨테이너의 로그를 구별해야 할 때 중요합니다.

Docker 에서 유닛별로 로그를 필터링하는 주요 방법은 docker logs 명령을 사용할 때 컨테이너 이름 또는 ID 를 지정하는 것입니다. 우리는 이전 단계에서 이 작업을 수행했습니다.

두 개의 서로 다른 컨테이너를 실행하여 로그가 어떻게 분리되는지 살펴보겠습니다. 두 컨테이너 모두 alpine 이미지를 사용하지만 이름과 명령이 약간 다릅니다.

먼저, 이전 단계의 mylogger 컨테이너가 중지되고 제거되었는지 확인합니다.

docker stop mylogger || true
docker rm mylogger || true

이제 container1이라는 첫 번째 컨테이너를 실행합니다.

docker run -d --name container1 alpine sh -c 'while true; do echo "Container 1 log at $(date)"; sleep 3; done'

이 컨테이너는 3 초마다 로그 메시지를 출력합니다.

다음으로, container2라는 두 번째 컨테이너를 실행합니다.

docker run -d --name container2 alpine sh -c 'while true; do echo "Container 2 log at $(date)"; sleep 5; done'

이 컨테이너는 5 초마다 로그 메시지를 출력합니다.

이제 container1에서만 로그를 보려면 다음을 사용합니다.

docker logs container1

container1에서 생성된 로그 메시지만 표시됩니다.

container2에서만 로그를 보려면 다음을 사용합니다.

docker logs container2

container2에서 생성된 로그 메시지만 표시됩니다.

이는 docker logs가 지정된 컨테이너 ("유닛") 별로 어떻게 본질적으로 필터링하는지 보여줍니다. 여러 컨테이너에서 로그를 수집하는 중앙 집중식 로깅 시스템을 사용하는 경우, 일반적으로 각 로그 항목과 관련된 메타데이터 (컨테이너 이름 또는 ID) 를 사용하여 유닛별로 필터링합니다.

docker logs 자체에는 일부 시스템 로깅 도구와 같은 별도의 --unit 플래그가 없지만, 로그의 소스 (컨테이너) 별로 필터링하는 기본 개념은 컨테이너 이름 또는 ID 를 지정하여 달성됩니다.

마지막으로, 두 컨테이너를 모두 중지하고 제거합니다.

docker stop container1 container2
docker rm container1 container2

요약

이 랩에서는 docker logs 명령을 사용하여 Docker 컨테이너 로그를 보는 기본적인 기술을 배웠습니다. hello-worldalpine과 같은 간단한 컨테이너를 실행하여 Docker 가 표준 출력 및 오류 스트림을 로그로 캡처하는 방식을 이해하는 것으로 시작했습니다. 이 초기 단계는 컨테이너 내에서 실행되는 애플리케이션을 모니터링하고 디버깅하는 데 중요한 컨테이너 출력에 액세스하는 기본 프로세스를 보여주었습니다.

기본 로그 보기를 기반으로, 로그 데이터를 효율적으로 관리하고 분석하기 위한 고급 필터링 옵션을 탐색했습니다. 중요 메시지에 집중할 수 있도록 우선 순위 수준별로 로그를 필터링하는 방법을 배웠습니다. 또한 특정 시간 범위 내의 이벤트를 격리하기 위해 특정 시간 범위별로, 그리고 특정 서비스 또는 구성 요소의 로그를 보기 위해 유닛별로 로그를 필터링하는 연습을 했습니다. 이러한 필터링 기술은 대량의 로그 데이터를 탐색하고 문제 해결 및 분석을 위해 관련 정보를 신속하게 식별하는 데 필수적입니다.