Docker 설치의 이벤트 기록을 보는 방법
게시 됨: 2022-08-11Docker 엔진은 데몬이 중요한 작업을 수행할 때마다 이벤트를 기록합니다. 이벤트 로그에 액세스하여 작업이 발생한 시간을 식별하고 시간 경과에 따른 개체의 변경 사항을 추적할 수 있습니다.
이 문서에서는 이벤트로 캡처된 항목과 이벤트를 보고 싶은 시기에 대해 설명합니다. 그런 다음 Docker CLI 및 REST API를 사용하여 실시간으로 이벤트를 모니터링하는 방법을 보여줍니다.
Docker 이벤트란 무엇입니까?
Docker 이벤트는 Docker 데몬이 수행하는 활동을 설명합니다. 컨테이너, 이미지, 볼륨 및 네트워크와 같은 개체와의 대부분의 상호 작용은 이벤트를 기록하여 과거 변경 사항을 검사하는 데 사용할 수 있는 로그를 생성합니다.
환경의 특정 변경 사항을 식별하는 다양한 종류의 이벤트가 있습니다.
- 컨테이너 생성 및 제거
- 컨테이너 상태 확인 상태
-
docker exec
를 사용하여 컨테이너 내에서 실행되는 명령 - 이미지 당기기 및 밀기
- 볼륨 생성, 삭제, 마운트 및 마운트 해제
- Docker 데몬 플러그인 활성화 및 비활성화
Docker 설명서에서 전체 목록을 볼 수 있습니다.
기록된 각 이벤트에는 영향을 받는 개체의 타임스탬프와 ID가 포함됩니다. 이 정보를 사용하여 원래 트리거를 관찰했는지 여부에 관계없이 환경에 대한 변경 기록을 수집할 수 있습니다.
저장된 이벤트는 예기치 않은 컨테이너 오류와 같은 문제를 진단하는 데도 도움이 될 수 있습니다. 로그를 보면 컨테이너가 중지된 정확한 시간을 식별하여 다른 로그와 상관시킬 수 있는 데이터 포인트를 제공할 수 있습니다. 이벤트는 컨테이너의 상태 확인이 실패하기 시작한 시점을 설정하여 문제의 근본 원인을 확인하기 위해 외부 서비스를 검사해야 하는 관심 기간을 좁힐 수 있습니다.
Docker CLI를 사용하여 Docker 이벤트 스트리밍
docker events
CLI 명령은 Docker 데몬에서 터미널 창으로 이벤트를 스트리밍합니다. 이벤트는 Ctrl+C 키보드 조합을 눌러 프로세스를 종료할 때까지 실시간으로 나타납니다.
인수 없이 명령을 실행하면 처음부터 출력이 표시되지 않습니다. 이벤트가 발생할 때까지 출력이 비어 있도록 새 활동만 표시됩니다. 다른 쉘에서 새 컨테이너를 시작하여 이를 유발할 수 있습니다.
$ docker run --rm hello-world
이제 docker events
명령을 실행하는 터미널 창에 여러 이벤트가 나타납니다.
2022-05-31T15:20:00.267970018+01:00 이미지 pull hello-world:latest(이름=hello-world) 2022-05-31T15:20:00.347054862+01:00 컨테이너 생성 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (이미지 이름 = hhellofty) 2022-05-31T15:20:00.347805277+01:00 컨테이너 첨부 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (이미지 이름=helloftyworld) 2022-05-31T15:20:00.621070053+01:00 컨테이너 시작 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (이미지 이름=hellofty) ...
각 이벤트는 자체 라인에 표시됩니다. 이벤트 타임스탬프가 먼저 표시되고 영향을 받는 객체 유형(예: image
또는 container
)이 표시되고 그 다음 수행된 작업(예: create
, attach
및 start
)이 표시됩니다. 메시지의 나머지 부분에는 개체에 대한 유용한 메타데이터가 포함되어 있습니다. 위의 예는 hello-world:latest
이미지를 가져와서 컨테이너를 생성했음을 보여줍니다.
출력 형식 지정
원시 이벤트 목록은 다루기 힘든 경우가 많습니다. Go 템플릿 문자열을 허용하는 --format
플래그를 사용하여 출력을 다시 포맷할 수 있습니다.
$ docker 이벤트 --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
이 예제를 실행하면 다음과 같은 출력이 생성됩니다.
1654006800 이미지 가져오기 hello-world:latest 1654006800 컨테이너 생성 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 첨부 컨테이너 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 시작 컨테이너 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
{{ json . }}
{{ json . }}
를 템플릿 문자열로 사용:
$ docker 이벤트 --format '{{ json . }}' | jq { "상태": "만들기", "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "from": "hello-world", "유형": "컨테이너", "액션": "만들기", "배우": { "아이디": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "속성": { "이미지": "hello-world", "이름": "nifty_morse" } }, "범위": "로컬", "시간": 1654006800, "타임나노": 1654006800347054800 }
여기서 원시 JSON은 jq
를 통해 전달되므로 터미널에 꽤 인쇄됩니다. 이렇게 하면 정보를 더 쉽게 스캔할 수 있습니다.
사용자 지정 형식 문자열을 생성할 때 지원되는 자리 표시자에 대한 참조로 JSON 출력의 속성을 사용할 수 있습니다. 대부분의 경우 time
to {{ .Time }}
과 같이 각 속성의 첫 글자를 대문자로 표시해야 합니다.
이벤트 필터링
사용량이 많은 Docker 데몬의 이벤트 로그는 빠르게 시끄러워질 수 있습니다. --filter
플래그를 사용하여 이벤트를 특정 작업, 개체 또는 개체 유형으로 좁힐 수 있습니다.
-
docker events --filter type=container
– 컨테이너와 관련된 모든 이벤트를 가져옵니다. -
docker events --filter event=create
– 컨테이너 생성 이벤트를 가져옵니다. -
docker events --filter container=demo-container
– demodemo-container
container라는 컨테이너에 대해 저장된 모든 이벤트를 가져옵니다(컨테이너의 ID 또는 이름을 참조할 수 있음).
container
외에도 image
, network
및 volume
과 같은 지원되는 모든 객체 유형 이름으로 필터링할 수 있습니다.
--filter
플래그를 반복하면 여러 필터가 지원됩니다. 고유 필터는 논리적 AND 조건으로 해석됩니다. 동일한 필터를 여러 번 사용하면 OR 절이 됩니다. 다음은 app-container
및 api-container
컨테이너 모두에 대한 create
이벤트를 표시하는 예입니다.
$ 도커 이벤트 \ --필터 컨테이너=앱 컨테이너 --필터 컨테이너 = API 컨테이너 --필터 이벤트=생성
역사적 사건에 접근하기
docker events
는 기본적으로 명령이 실행된 이후에 저장된 이벤트만 표시하도록 설정됩니다. --since
플래그를 추가하여 기록 이벤트를 포함할 수 있습니다. 이것은 사람이 읽을 수 있는 시간 표현 또는 절대 타임스탬프를 허용합니다.
$ 도커 이벤트 --1시간 이후 $ docker 이벤트 -- '2021-05-01T16:00:00' 이후
지정된 시간 이후에 기록된 이벤트는 즉시 단말기에 표시됩니다. 새로운 이벤트는 녹화되는 대로 실시간으로 계속 표시됩니다.
--until
플래그를 사용하여 특정 시간 이후의 이벤트를 제외할 수 있습니다. --since
와 유사하게 작동합니다. --until
을 사용하면 새 이벤트가 요청된 시간 범위를 벗어나기 때문에 새 이벤트의 실시간 스트리밍이 비활성화됩니다.
Daemon REST API에서 Docker 이벤트 스트리밍
저장된 이벤트에 액세스하는 또 다른 방법은 Docker 데몬 REST API를 사용하는 것입니다. Docker 호스트에서 API를 활성화한 후 /events
엔드포인트를 사용하여 실시간으로 이벤트를 스트리밍할 수 있습니다. 이벤트는 JSON 형식으로 반환됩니다.
$ 컬 http://127.0.0.1:2375/v1.41/events { "유형": "컨테이너", "액션": "만들기", "배우": { "아이디": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "속성": { "이미지": "hello-world", "이름": "멋진_모스" } }, "범위": "로컬", "시간": 1654006800, "타임나노": 1654006800347054800 }
API 엔드포인트는 CLI 대응과 동일한 동작을 갖는 filter
, since
및 until
매개변수를 지원합니다. 지난 1시간 동안 기록된 모든 컨테이너 생성 이벤트를 검색하는 방법은 다음과 같습니다.
$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}
외부 서비스에 이벤트 보내기
Docker에는 이벤트를 외부 서비스로 보내는 기본 제공 방법이 없습니다. 이는 모든 컨테이너 생성을 기존 모니터링 또는 감사 플랫폼에 기록하려는 경우에 유용할 수 있습니다.
docker events
를 지속적으로 실행하는 시스템 서비스를 만들어 고유한 솔루션을 설정할 수 있습니다. 각각의 새 출력 라인을 외부 시스템으로 보내야 합니다.
먼저 필요한 기능을 구현하는 Bash 스크립트를 작성하십시오.
#!/bin/bash 도커 이벤트 --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | 이벤트를 읽는 동안 하다 곱슬 곱슬하다 \ -X POST \ -H "콘텐츠 유형: 애플리케이션/json" \ -d '{"이벤트": "$event"}' \ https://example.com/events 완료
이제 /etc/systemd/system/docker-events.service
에서 새 systemd
서비스 단위를 만듭니다.
[단위] Description=사용자 지정 Docker 이벤트 모니터링 서비스 [서비스] 유형=포킹 ExecStart=/usr/local/bin/docker-events.sh [설치] WantedBy=다중 사용자.대상
마지막으로 systemd
를 다시 로드하여 서비스를 로드한 다음 장치를 시작하고 활성화합니다.
$ sudo systemctl 데몬 다시 로드 $ sudo systemctl 도커 이벤트 시작 $ sudo systemctl 도커 이벤트 활성화
이제 서비스에서 각 새 이벤트를 모니터링 플랫폼으로 스트리밍합니다. 서비스를 활성화하면 호스트가 재부팅될 때마다 자동으로 시작되도록 구성됩니다.
요약
데몬이 환경의 개체를 수정할 때마다 Docker 이벤트가 생성됩니다. 이벤트 로그를 스트리밍하면 실시간으로 데몬 활동을 모니터링할 수 있습니다. 이를 통해 문제를 디버그하고 변경 사항을 감사하며 규정 준수를 보장할 수 있습니다.
이벤트는 Docker 서버에서 직접 검색되므로 나중에 정보를 검색해야 하는 경우 이벤트에 의존해서는 안 됩니다. 1,000개 항목만 지속적으로 유지되며 Docker 호스트의 파일 시스템을 통해 이벤트에 액세스할 수 없습니다. 이 메커니즘은 최근 활동과 관련된 특정 정보를 찾는 빠른 임시 작업에 가장 적합합니다. 장기간 보존하려면 자체 시스템 서비스를 사용하여 이벤트를 외부 저장소로 보내야 합니다.