Docker 설치의 이벤트 기록을 보는 방법

게시 됨: 2022-08-11

도커 로고

Docker 엔진은 데몬이 중요한 작업을 수행할 때마다 이벤트를 기록합니다. 이벤트 로그에 액세스하여 작업이 발생한 시간을 식별하고 시간 경과에 따른 개체의 변경 사항을 추적할 수 있습니다.

이 문서에서는 이벤트로 캡처된 항목과 이벤트를 보고 싶은 시기에 대해 설명합니다. 그런 다음 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 , attachstart )이 표시됩니다. 메시지의 나머지 부분에는 개체에 대한 유용한 메타데이터가 포함되어 있습니다. 위의 예는 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 – demo demo-container container라는 컨테이너에 대해 저장된 모든 이벤트를 가져옵니다(컨테이너의 ID 또는 이름을 참조할 수 있음).

container 외에도 image , networkvolume 과 같은 지원되는 모든 객체 유형 이름으로 필터링할 수 있습니다.

--filter 플래그를 반복하면 여러 필터가 지원됩니다. 고유 필터는 논리적 AND 조건으로 해석됩니다. 동일한 필터를 여러 번 사용하면 OR 절이 됩니다. 다음은 app-containerapi-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 , sinceuntil 매개변수를 지원합니다. 지난 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 호스트의 파일 시스템을 통해 이벤트에 액세스할 수 없습니다. 이 메커니즘은 최근 활동과 관련된 특정 정보를 찾는 빠른 임시 작업에 가장 적합합니다. 장기간 보존하려면 자체 시스템 서비스를 사용하여 이벤트를 외부 저장소로 보내야 합니다.