소개
이 랩에서는 docker system events 명령을 사용하여 Docker 활동을 효과적으로 모니터링하는 방법을 배우게 됩니다. 먼저, 이미지를 풀링하고 컨테이너를 실행하는 등의 작업으로 생성되는 실시간 Docker 이벤트를 수신하는 것으로 시작합니다.
그런 다음, 이러한 이벤트를 다양한 기준에 따라 필터링하는 방법을 살펴봅니다. 여기에는 --since 및 --until 플래그를 사용하여 시간별 필터링, --filter 플래그를 사용하여 객체 유형 및 작업별 필터링, 그리고 보다 구체적인 모니터링을 위해 여러 필터를 결합하는 것이 포함됩니다. 마지막으로, --format 플래그를 사용하여 이벤트 출력을 가독성과 분석을 위해 서식 지정하는 방법을 배우게 됩니다.
실시간 Docker 이벤트 수신 대기
이 단계에서는 실시간 Docker 이벤트를 수신하는 방법을 배우게 됩니다. Docker 이벤트는 컨테이너, 이미지 또는 볼륨의 시작, 중지 또는 삭제와 같은 특정 작업이 발생할 때 Docker 데몬에 의해 생성됩니다. 이러한 이벤트를 모니터링하는 것은 자동화, 로깅 및 디버깅에 유용할 수 있습니다.
Docker 이벤트를 수신하려면 docker events 명령을 사용합니다. 기본적으로 이 명령은 이벤트가 발생할 때마다 지속적으로 출력합니다.
먼저, 터미널을 열고 docker events 명령을 실행해 보겠습니다. 이 명령은 이벤트를 기다리면서 블록됩니다.
docker events
이제 새 터미널을 엽니다 (첫 번째 터미널에서 docker events를 계속 실행합니다). 이 새 터미널에서 간단한 Docker 컨테이너를 실행합니다. 이 작업은 첫 번째 터미널에서 볼 수 있는 이벤트를 생성합니다.
새 터미널에서 다음 명령을 실행하여 hello-world 이미지를 풀링합니다. 이렇게 하면 pull 이벤트가 생성됩니다.
docker pull hello-world
첫 번째 터미널에서 이미지 풀 이벤트가 발생했음을 나타내는 출력을 볼 수 있습니다.
다음으로, hello-world 컨테이너를 실행합니다. 이렇게 하면 create, start 및 die 이벤트가 생성됩니다.
docker run hello-world
첫 번째 터미널의 출력을 관찰합니다. 컨테이너가 생성, 시작된 다음 종료 (die) 되는 관련 이벤트를 볼 수 있습니다.
Ctrl+C를 눌러 첫 번째 터미널에서 docker events 명령을 중지할 수 있습니다.
--since 및 --until 을 사용하여 시간별 이벤트 필터링
이 단계에서는 --since 및 --until 플래그를 사용하여 시간을 기준으로 Docker 이벤트를 필터링하는 방법을 배우게 됩니다. 이는 특정 시간 범위 내에서 발생한 이벤트를 보는 데 유용합니다.
--since 플래그를 사용하면 특정 시간 이후에 발생한 이벤트를 볼 수 있습니다. --until 플래그를 사용하면 특정 시간까지 발생한 이벤트를 볼 수 있습니다. 이러한 플래그를 함께 사용하여 시간 창을 지정할 수 있습니다.
시간은 RFC3339 날짜 형식 (예: 2023-10-27T10:00:00Z), Unix 타임스탬프 (예: 1698393600) 또는 상대 시간 (예: 10 분 전의 10m, 1 시간 전의 1h) 을 포함한 다양한 형식으로 지정할 수 있습니다.
먼저, 몇 가지 이벤트를 생성해 보겠습니다. hello-world 컨테이너를 다시 실행합니다.
docker run hello-world
이제 지난 5 분 동안 발생한 이벤트를 보려고 시도해 보겠습니다. 상대 시간을 사용하여 --since 플래그를 사용할 수 있습니다.
docker events --since 5m
방금 수행한 hello-world 컨테이너 실행과 관련된 이벤트를 볼 수 있습니다.
다음으로, 지난 10 분 동안 발생했지만 지난 2 분 동안 발생하지 않은 이벤트를 보려고 시도해 보겠습니다. 상대 시간을 사용하여 --since 및 --until 플래그를 모두 사용할 수 있습니다.
docker events --since 10m --until 2m
hello-world 컨테이너를 실행한 시간에 따라 이벤트가 표시될 수도 있고 표시되지 않을 수도 있습니다. 이벤트가 표시되지 않으면 시간 범위를 조정해 보십시오.
절대 타임스탬프도 사용할 수 있습니다. 현재 Unix 타임스탬프를 얻으려면 date +%s 명령을 사용할 수 있습니다.
현재 타임스탬프를 얻어 보겠습니다.
date +%s
이제 hello-world 컨테이너를 다시 실행합니다.
docker run hello-world
현재 타임스탬프를 다시 얻습니다.
date +%s
이제 --since 및 --until 플래그와 함께 얻은 두 개의 타임스탬프를 사용하여 해당 두 시간 사이에 발생한 이벤트를 봅니다. START_TIMESTAMP 및 END_TIMESTAMP를 기록한 실제 타임스탬프로 바꿉니다.
docker events --since START_TIMESTAMP --until END_TIMESTAMP
두 타임스탬프 사이에 발생한 hello-world 컨테이너 실행의 이벤트를 볼 수 있습니다.
--filter 를 사용하여 객체 유형 및 작업별 이벤트 필터링
이 단계에서는 --filter 플래그를 사용하여 객체 유형 및 작업을 기반으로 Docker 이벤트를 필터링하는 방법을 배우게 됩니다. 이를 통해 컨테이너 이벤트 또는 이미지 이벤트와 같은 특정 유형의 이벤트와 create, start, stop 또는 delete와 같은 특정 작업에 집중할 수 있습니다.
--filter 플래그는 key=value 형식의 키 - 값 쌍을 사용합니다. 객체 유형별 필터링의 경우 키는 type이고 값은 container, image, volume, network, daemon 또는 plugin일 수 있습니다. 작업별 필터링의 경우 키는 event이고 값은 특정 작업입니다.
컨테이너 이벤트만 필터링하는 것부터 시작해 보겠습니다. 이벤트를 생성하기 위해 hello-world 컨테이너를 다시 실행합니다.
docker run hello-world
이제 --filter type=container 플래그와 함께 docker events 명령을 사용하여 컨테이너 관련 이벤트만 봅니다.
docker events --filter type=container --since 5m
hello-world 컨테이너에 대한 create, start 및 die와 같은 이벤트는 표시되지만 이미지 풀링과 관련된 이벤트는 표시되지 않아야 합니다.
다음으로, 특정 작업, 예를 들어 컨테이너에 대한 start 이벤트만 필터링해 보겠습니다.
docker events --filter type=container --filter event=start --since 5m
이 명령은 지난 5 분 이내에 발생한 경우 hello-world 컨테이너에 대한 start 이벤트만 표시합니다.
객체의 이름 또는 ID 로도 필터링할 수 있습니다. 예를 들어, my-container라는 특정 컨테이너에 대한 이벤트를 필터링하려면 --filter container=my-container를 사용합니다.
특정 이름으로 hello-world 컨테이너를 실행해 보겠습니다.
docker run --name my-hello-container hello-world
이제 my-hello-container라는 컨테이너에 대한 이벤트를 구체적으로 필터링합니다.
docker events --filter container=my-hello-container --since 5m
지난 5 분 이내에 my-hello-container와 관련된 모든 이벤트를 볼 수 있습니다.
여러 --filter 플래그를 사용하여 여러 기준별 이벤트 필터링
이 단계에서는 여러 --filter 플래그를 결합하여 여러 기준을 기반으로 Docker 이벤트를 동시에 필터링하는 방법을 배우게 됩니다. 이를 통해 관심 있는 이벤트를 정확히 찾기 위해 보다 구체적인 필터를 만들 수 있습니다.
여러 --filter 플래그를 사용하는 경우 Docker 는 "AND" 논리를 적용합니다. 즉, 출력에 포함되려면 이벤트가 지정된 모든 필터와 일치해야 합니다.
객체 유형 및 작업별 필터링을 결합해 보겠습니다. 컨테이너 start 이벤트를 필터링합니다.
먼저, start 이벤트를 생성하기 위해 컨테이너를 실행합니다.
docker run hello-world
이제 두 개의 --filter 플래그를 사용합니다. 하나는 객체 유형 (type=container) 에 대한 것이고 다른 하나는 작업 (event=start) 에 대한 것입니다. 또한 시간 범위를 제한하기 위해 --since 5m을 사용합니다.
docker events --filter type=container --filter event=start --since 5m
지난 5 분 이내에 발생한 경우 hello-world 컨테이너에 대한 start 이벤트만 표시됩니다. create 또는 die와 같은 이벤트는 event=start 필터와 일치하지 않으므로 제외됩니다.
시간, 유형 및 작업별 필터링을 결합할 수도 있습니다. 예를 들어, 지난 10 분 동안 발생했지만 지난 2 분 동안 발생하지 않은 컨테이너 die 이벤트를 필터링해 보겠습니다.
docker events --filter type=container --filter event=die --since 10m --until 2m
이 명령은 지정된 시간 창 내에 있는 컨테이너 die 이벤트를 표시합니다.
컨테이너 이름 또는 이미지 이름별 필터링과 같은 더 많은 필터를 추가할 수 있습니다. ubuntu 이미지를 사용하여 my-specific-container라는 컨테이너의 start 이벤트를 필터링해 보겠습니다.
먼저, ubuntu 이미지를 가져옵니다.
docker pull ubuntu
이제 특정 이름으로 ubuntu 컨테이너를 실행합니다.
docker run --name my-specific-container ubuntu echo "Hello from Ubuntu"
이제 my-specific-container라는 컨테이너의 start 이벤트를 필터링합니다.
docker events --filter type=container --filter event=start --filter container=my-specific-container --since 5m
지난 5 분 이내에 발생한 경우 my-specific-container에 대한 start 이벤트가 표시됩니다.
--format 을 사용하여 이벤트 출력 형식 지정
이 단계에서는 --format 플래그를 사용하여 Docker 이벤트의 출력을 형식 지정하는 방법을 배우게 됩니다. 이를 통해 각 이벤트에 대해 표시되는 정보를 사용자 정의하여 구문 분석하거나 읽기 쉽게 만들 수 있습니다.
--format 플래그는 Go 의 text/template 패키지 구문을 사용합니다. .Time, .Type, .Action, .Actor.ID 및 .Actor.Attributes와 같은 이벤트 객체의 다양한 필드에 액세스할 수 있습니다.
각 이벤트의 시간, 유형 및 작업을 표시하는 것부터 시작해 보겠습니다.
먼저, hello-world 컨테이너를 실행하여 몇 가지 이벤트를 생성합니다.
docker run hello-world
이제 docker events 명령을 --format 플래그와 함께 사용하여 원하는 출력 형식을 지정합니다. 탭 (\t) 으로 구분된 시간, 유형 및 작업을 표시합니다.
docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}'
다음과 유사한 출력을 볼 수 있지만 타임스탬프와 ID 는 다릅니다.
2023-10-27 10:30:00.123456789 +0000 UTC container create
2023-10-27 10:30:00.987654321 +0000 UTC container start
2023-10-27 10:30:01.567890123 +0000 UTC container die
이벤트를 트리거한 액터의 속성에도 액세스할 수 있습니다. 예를 들어 컨테이너 이름을 표시하려면 .Actor.Attributes.name을 사용할 수 있습니다.
이름을 사용하여 hello-world 컨테이너를 다시 실행해 보겠습니다.
docker run --name my-formatted-container hello-world
이제 컨테이너 이름을 포함하도록 출력을 형식 지정합니다.
docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}\t{{.Actor.Attributes.name}}'
이제 출력에 컨테이너 이름이 포함되어야 합니다.
2023-10-27 10:35:00.123456789 +0000 UTC container create my-formatted-container
2023-10-27 10:35:00.987654321 +0000 UTC container start my-formatted-container
2023-10-27 10:35:01.567890123 +0000 UTC container die my-formatted-container
더 복잡한 형식 지정을 위해 형식 문자열 내에서 다양한 템플릿 함수 및 제어 구조를 사용할 수 있습니다. 자세한 내용은 Go text/template 문서를 참조하십시오.
요약
이 Lab 에서는 docker events 명령을 사용하여 Docker 활동을 실시간으로 모니터링하는 방법을 배웠습니다. 먼저, 간단한 컨테이너를 풀링하고 실행하여 생성된 이벤트를 관찰하면서 발생하는 모든 Docker 이벤트를 수신 대기하는 것으로 시작했습니다.
그런 다음, 이러한 이벤트를 다양한 기준에 따라 필터링하는 방법을 탐색했습니다. 특정 시간 범위 내의 이벤트를 보기 위해 --since 및 --until 플래그를 사용하여 시간별로 이벤트를 필터링하는 방법을 배웠습니다. 또한 --filter 플래그를 사용하여 객체 유형 및 작업별로 이벤트를 필터링하는 방법과 여러 필터를 동시에 적용하여 이벤트 스트림을 좁히는 방법을 배웠습니다. 마지막으로, 가독성과 구문 분석을 향상시키기 위해 --format 플래그를 사용하여 docker events 명령의 출력을 형식 지정하는 방법을 배웠습니다.



