Cách xem lịch sử sự kiện cài đặt Docker của bạn

[ad_1]

Docker Engine ghi lại một sự kiện bất cứ khi nào daemon thực hiện các hành động quan trọng. Bạn có thể truy cập nhật ký sự kiện để xác định thời điểm một hành động xảy ra và theo dõi các thay đổi đối với các đối tượng theo thời gian.

Trong bài viết này, chúng tôi sẽ giải thích những gì được ghi lại dưới dạng sự kiện và khi nào bạn có thể muốn xem chúng. Sau đó, chúng tôi sẽ chỉ ra cách theo dõi các sự kiện trong thời gian thực bằng cách sử dụng API Docker CLI và REST.

Các sự kiện Docker mô tả các hoạt động được thực hiện bởi daemon Docker của bạn. Hầu hết các tương tác với các đối tượng như vùng chứa, hình ảnh, khối lượng và mạng đều ghi lại một sự kiện, tạo một nhật ký mà bạn có thể sử dụng để kiểm tra các thay đổi trong quá khứ.

Có nhiều loại sự kiện khác nhau xác định những thay đổi cụ thể trong môi trường của bạn:

  • Tạo và xóa vùng chứa
  • Trạng thái kiểm tra tình trạng vùng chứa
  • Các lệnh được thực thi bên trong vùng chứa với docker exec
  • Kéo và đẩy hình ảnh
  • Tạo, hủy, gắn và tháo ổ đĩa
  • Bật và tắt các plugin Docker daemon

Bạn có thể xem danh sách đầy đủ trong tài liệu của Docker.

Mỗi sự kiện được ghi lại bao gồm một dấu thời gian và ID của đối tượng bị ảnh hưởng. Bạn có thể sử dụng thông tin này để thu thập lịch sử các thay đổi đối với môi trường của mình, cho dù bạn có quan sát thấy các kích hoạt ban đầu của chúng hay không.

Các sự kiện được lưu trữ cũng có thể giúp chẩn đoán các vấn đề như lỗi vùng chứa không mong muốn. Xem nhật ký cho phép bạn xác định thời gian chính xác khi vùng chứa dừng lại, cung cấp điểm dữ liệu mà bạn có thể tương quan với các nhật ký khác của mình. Sự kiện có thể thiết lập khi việc kiểm tra tình trạng của một thùng chứa bắt đầu không thành công, thu hẹp khoảng thời gian quan tâm khi bạn cần kiểm tra các dịch vụ bên ngoài để xác định nguyên nhân gốc rễ của vấn đề.

Truyền trực tuyến các sự kiện Docker với Docker CLI

Các docker events Lệnh CLI truyền các sự kiện từ trình nền Docker của bạn vào cửa sổ đầu cuối của bạn. Các sự kiện sẽ xuất hiện trong thời gian thực cho đến khi bạn kết thúc quá trình bằng cách nhấn tổ hợp bàn phím Ctrl + C.

Chạy lệnh không có đối số sẽ không hiển thị bất kỳ đầu ra nào để bắt đầu. Chỉ hoạt động mới được hiển thị nên đầu ra vẫn trống cho đến khi một sự kiện xảy ra. Bạn có thể kích hoạt một cái bằng cách bắt đầu một vùng chứa mới trong một trình bao khác:

$ docker run --rm hello-world

Một số sự kiện bây giờ sẽ xuất hiện trong cửa sổ đầu cuối đang chạy docker events yêu cầu:

2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world)
2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Mỗi sự kiện hiển thị trên dòng riêng của nó. Dấu thời gian sự kiện được hiển thị đầu tiên, tiếp theo là loại đối tượng bị ảnh hưởng (chẳng hạn như image hoặc container) và sau đó là hành động đã được thực hiện (như create, attachstart). Phần còn lại của thông báo chứa siêu dữ liệu hữu ích về đối tượng. Ví dụ trên cho thấy rằng hello-world:latest hình ảnh đã được kéo và một vùng chứa được tạo từ nó.

Định dạng đầu ra

Danh sách sự kiện thô thường khó sử dụng. Bạn có thể định dạng lại đầu ra bằng cách sử dụng --format cờ chấp nhận chuỗi mẫu Go:

$ docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'

Chạy ví dụ này sẽ tạo ra kết quả giống như sau:

1654006800 pull image hello-world:latest
1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Bạn có thể nhận các sự kiện được biểu diễn dưới dạng các đối tượng JSON bằng cách sử dụng {{ json . }} dưới dạng chuỗi mẫu của bạn:

$ docker events --format '{{ json . }}' | jq
and#13;
  "status": "create",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "from": "hello-world",
  "Type": "container",
  "Action": "create",
  "Actor": and#13;
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attributes": and#13;
      "image": "hello-world",
      "name": "nifty_morse"
    }
  },
  "scope": "local",
  "time": 1654006800,
  "timeNano": 1654006800347054800
}

Đây là JSON thô đang được chuyển qua jq vì vậy nó được in khá đẹp trong thiết bị đầu cuối của bạn. Điều này làm cho thông tin dễ dàng hơn để quét qua.

Khi bạn đang tạo chuỗi định dạng tùy chỉnh, bạn có thể sử dụng các thuộc tính trong đầu ra JSON làm tham chiếu cho các trình giữ chỗ được hỗ trợ. Trong hầu hết các trường hợp, bạn sẽ cần viết hoa chữ cái đầu tiên của mỗi thuộc tính, chẳng hạn như time đến {{ .Time }}.

Lọc sự kiện

Nhật ký sự kiện cho một daemon Docker bận rộn có thể nhanh chóng trở nên ồn ào. Bạn có thể thu hẹp các sự kiện thành một hành động, đối tượng hoặc loại đối tượng cụ thể với --filter lá cờ:

  • docker events --filter type=container – Nhận tất cả các sự kiện liên quan đến vùng chứa.
  • docker events --filter event=create – Nhận các sự kiện tạo vùng chứa.
  • docker events --filter container=demo-container – Nhận tất cả các sự kiện được lưu cho vùng chứa được gọi là demo-container (bạn có thể tham chiếu ID hoặc tên của vùng chứa).

ngoài ra containerbạn có thể lọc theo tất cả các tên loại đối tượng được hỗ trợ, chẳng hạn như image, networkvolume.

Nhiều bộ lọc được hỗ trợ khi bạn lặp lại --filter lá cờ. Các bộ lọc riêng biệt được hiểu là logic các điều kiện; nhiều lần sử dụng cùng một bộ lọc trở thành HOẶC điều khoản. Đây là một ví dụ hiển thị create sự kiện cho cả hai app-containerapi-container hộp đựng:

$ docker events 
    --filter container=app-container
    --filter container=api-container
    --filter event=create

Truy cập các sự kiện lịch sử

docker events mặc định chỉ hiển thị các sự kiện được lưu trữ kể từ khi lệnh đang chạy. Bạn có thể bao gồm các sự kiện lịch sử bằng cách thêm --since lá cờ. Điều này chấp nhận một biểu thức thời gian có thể đọc được của con người hoặc một dấu thời gian tuyệt đối:

$ docker events --since 1h
$ docker events --since '2021-05-01T16:00:00'

Các sự kiện được ghi lại sau thời gian nhất định sẽ ngay lập tức được hiển thị trong thiết bị đầu cuối của bạn. Các sự kiện mới sẽ tiếp tục hiển thị trong thời gian thực khi chúng được ghi lại.

Bạn có thể loại trừ các sự kiện sau một thời gian cụ thể với --until lá cờ. Nó hoạt động tương tự như --since. Sử dụng --until sẽ tắt tính năng phát trực tuyến các sự kiện mới theo thời gian thực vì chúng nằm ngoài khung thời gian được yêu cầu.

Truyền trực tuyến các sự kiện Docker từ API Daemon REST

Một cách khác để truy cập các sự kiện được lưu trữ là thông qua API REST của Docker daemon. Bạn có thể dùng /events điểm cuối để phát trực tuyến các sự kiện trong thời gian thực sau khi bạn đã bật API trên máy chủ Docker của mình. Các sự kiện sẽ được trả về ở định dạng JSON:

$ curl http://127.0.0.1:2375/v1.41/events
and#13;
  "Type": "container",
  "Action": "create",
  "Actor": and#13;
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attributes": and#13;
      "image": "hello-world",
      "name": "nifty_morse"
    }
  },
  "scope": "local",
  "time": 1654006800,
  "timeNano": 1654006800347054800
}

Điểm cuối API hỗ trợ filter, sinceuntil các tham số có cùng hành vi với các đối tác CLI của chúng. Dưới đây là cách truy xuất tất cả các sự kiện tạo vùng chứa được ghi lại trong giờ qua:

$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}

Gửi sự kiện đến dịch vụ bên ngoài

Docker thiếu một cách tích hợp để gửi các sự kiện đến một dịch vụ bên ngoài. Điều này có thể hữu ích nếu bạn muốn tất cả các sáng tạo vùng chứa của mình được đăng nhập vào một nền tảng giám sát hoặc kiểm tra hiện có.

Bạn có thể thiết lập giải pháp của riêng mình bằng cách tạo một dịch vụ hệ thống liên tục chạy docker events. Nó sẽ gửi từng dòng đầu ra mới đến hệ thống bên ngoài của bạn.

Đầu tiên hãy viết một tập lệnh Bash triển khai chức năng bạn cần:

#!/bin/bash
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | while read event
do
    curl 
        -X POST 
        -H "Content-Type: application/json" 
        -d '{"event": "$event"}' 
        https://example.com/events
done

Bây giờ hãy tạo mới systemd đơn vị dịch vụ tại /etc/systemd/system/docker-events.service:

[Unit]
Description=Custom Docker Event Monitoring Service

[Service]
Type=forking
ExecStart=/usr/local/bin/docker-events.sh

[Install]
WantedBy=multi-user.target

Cuối cùng tải lại systemd để tải dịch vụ của bạn, sau đó khởi động và kích hoạt thiết bị:

$ sudo systemctl daemon-reload
$ sudo systemctl start docker-events
$ sudo systemctl enable docker-events

Dịch vụ của bạn bây giờ sẽ truyền trực tuyến từng sự kiện mới đến nền tảng giám sát của bạn. Việc kích hoạt dịch vụ sẽ cấu hình nó tự động khởi động mỗi khi máy chủ của bạn khởi động lại.

Bản tóm tắt

Các sự kiện Docker được tạo bất cứ khi nào daemon sửa đổi các đối tượng trong môi trường của bạn. Truyền nhật ký sự kiện cho phép bạn theo dõi hoạt động của daemon trong thời gian thực. Điều này có thể giúp bạn gỡ lỗi các vấn đề, kiểm tra các thay đổi và đảm bảo tuân thủ.

Vì các sự kiện được truy xuất trực tiếp từ máy chủ Docker, nên bạn không nên dựa vào chúng nếu bạn cần truy xuất thông tin trong tương lai. Chỉ 1.000 mục nhập được giữ lại trên cơ sở luân phiên và bạn không thể truy cập các sự kiện thông qua hệ thống tệp của máy chủ lưu trữ Docker của mình. Cơ chế này phù hợp nhất với các nhiệm vụ đặc biệt nhanh chóng mà bạn đang tìm kiếm thông tin cụ thể liên quan đến một hoạt động gần đây. Để lưu giữ lâu dài, bạn nên sử dụng dịch vụ hệ thống của riêng mình để gửi các sự kiện đến kho lưu trữ bên ngoài.



[ad_2]

Đánh giá dịch vụ post
Chat Zalo
0903064855