วิธีดูประวัติเหตุการณ์การติดตั้ง Docker ของคุณ
เผยแพร่แล้ว: 2022-08-11Docker Engine บันทึกเหตุการณ์ทุกครั้งที่มีการดำเนินการที่สำคัญโดย daemon คุณสามารถเข้าถึงบันทึกเหตุการณ์เพื่อระบุเมื่อมีการกระทำเกิดขึ้น และติดตามการเปลี่ยนแปลงของออบเจกต์เมื่อเวลาผ่านไป
ในบทความนี้ เราจะอธิบายเกี่ยวกับเหตุการณ์ที่เกิดขึ้นและเวลาที่คุณอาจต้องการดู จากนั้นเราจะแสดงวิธีการตรวจสอบเหตุการณ์แบบเรียลไทม์โดยใช้ Docker CLI และ REST API
Docker Events คืออะไร?
เหตุการณ์ Docker อธิบายกิจกรรมที่ทำโดย Docker daemon ของคุณ การโต้ตอบกับออบเจ็กต์ส่วนใหญ่ เช่น คอนเทนเนอร์ รูปภาพ วอลุ่ม และเครือข่ายจะบันทึกเหตุการณ์ โดยสร้างบันทึกที่คุณสามารถใช้ตรวจสอบการเปลี่ยนแปลงที่ผ่านมาได้
มีเหตุการณ์หลายประเภทที่ระบุการเปลี่ยนแปลงเฉพาะในสภาพแวดล้อมของคุณ:
- การสร้างและการนำคอนเทนเนอร์ออก
- สถานะการตรวจสอบสภาพคอนเทนเนอร์
- คำสั่งที่ดำเนินการภายในคอนเทนเนอร์ด้วย
docker exec
- ดึงและดันภาพ
- การสร้าง การทำลาย ติดตั้ง และยกเลิกการต่อเชื่อมวอลุ่ม
- การเปิดใช้งานและปิดใช้งานปลั๊กอิน Docker daemon
คุณสามารถดูรายการทั้งหมดได้ในเอกสารประกอบของ Docker
แต่ละเหตุการณ์ที่บันทึกไว้จะมีการประทับเวลาและ ID ของวัตถุที่ได้รับผลกระทบ คุณสามารถใช้ข้อมูลนี้เพื่อรวบรวมประวัติการเปลี่ยนแปลงสภาพแวดล้อมของคุณ ไม่ว่าคุณจะสังเกตทริกเกอร์เดิมหรือไม่ก็ตาม
เหตุการณ์ที่เก็บไว้ยังสามารถช่วยในการวินิจฉัยปัญหา เช่น ความล้มเหลวของคอนเทนเนอร์ที่ไม่คาดคิด การดูบันทึกช่วยให้คุณระบุเวลาที่แม่นยำเมื่อคอนเทนเนอร์หยุดทำงาน โดยให้จุดข้อมูลที่คุณสามารถสัมพันธ์กับบันทึกอื่นๆ ของคุณได้ เหตุการณ์สามารถเกิดขึ้นได้เมื่อการตรวจสอบสภาพของคอนเทนเนอร์เริ่มล้มเหลว โดยลดระยะเวลาที่น่าสนใจลงเมื่อคุณต้องตรวจสอบบริการภายนอกเพื่อระบุสาเหตุของปัญหา
สตรีมกิจกรรมนักเทียบท่าด้วย Docker CLI
คำสั่ง docker events
CLI จะสตรีมเหตุการณ์จาก Docker daemon ของคุณไปยังหน้าต่างเทอร์มินัลของคุณ กิจกรรมจะปรากฏตามเวลาจริงจนกว่าคุณจะยุติกระบวนการโดยกดแป้นพิมพ์ Ctrl+C ร่วมกัน
การรันคำสั่งโดยไม่มีอาร์กิวเมนต์จะไม่แสดงผลลัพธ์ใดๆ ในการเริ่มต้น เฉพาะกิจกรรมใหม่เท่านั้นที่จะแสดง ดังนั้นเอาต์พุตจะว่างเปล่าจนกว่าจะมีเหตุการณ์เกิดขึ้น คุณสามารถกระตุ้นโดยเริ่มคอนเทนเนอร์ใหม่ในเชลล์อื่น:
$ docker run --rm สวัสดีชาวโลก
ขณะนี้หลายเหตุการณ์ควรปรากฏในหน้าต่างเทอร์มินัลที่รันคำสั่ง docker events
:
2022-05-31T15:20:00.267970018+01:00 ภาพดึงสวัสดีโลก:ล่าสุด (ชื่อ=สวัสดีโลก) 2022-05-31T15:20:00.347054862+01:00 สร้างคอนเทนเนอร์ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (รูปภาพ=สวัสดีชาวโลก ชื่อ=nifty_morse) 2022-05-31T15:20:00.347805277+01:00 คอนเทนเนอร์ แนบ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (รูปภาพ=สวัสดีชาวโลก ชื่อ=nifty_morse) 2022-05-31T15:20:00.621070053+01:00 เริ่มคอนเทนเนอร์ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (รูปภาพ=สวัสดีชาวโลก ชื่อ=nifty_morse) ...
แต่ละเหตุการณ์จะแสดงในบรรทัดของตัวเอง การประทับเวลาของเหตุการณ์จะแสดงก่อน ตามด้วยประเภทของวัตถุที่ได้รับผลกระทบ (เช่น image
หรือ container
) จากนั้นจึงดำเนินการ (เช่น create
, attach
และ start
) ส่วนที่เหลือของข้อความมีข้อมูลเมตาที่เป็นประโยชน์เกี่ยวกับวัตถุ ตัวอย่างด้านบนแสดงให้เห็นว่าภาพ hello-world:latest
ถูกดึงออกมาและสร้างคอนเทนเนอร์ขึ้นมา
การจัดรูปแบบเอาต์พุต
รายการเหตุการณ์ดิบมักจะเทอะทะ คุณสามารถฟอร์แมตเอาต์พุตใหม่โดยใช้แฟ --format
ซึ่งยอมรับสตริงเทมเพลต Go:
$ เหตุการณ์นักเทียบท่า --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
การรันตัวอย่างนี้จะสร้างเอาต์พุตที่มีลักษณะดังนี้:
1654006800 ดึงภาพ สวัสดีชาวโลก:ล่าสุด 1654006800 สร้างคอนเทนเนอร์ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 แนบคอนเทนเนอร์ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 เริ่มคอนเทนเนอร์ 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
คุณสามารถรับเหตุการณ์ที่แสดงเป็นวัตถุ JSON ได้โดยใช้ {{ json . }}
{{ json . }}
เป็นสตริงเทมเพลตของคุณ:
$ เหตุการณ์นักเทียบท่า --format '{{ json . }}' | jq { "สถานะ": "สร้าง", "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "จาก": "สวัสดีชาวโลก", "ประเภท": "คอนเทนเนอร์", "การกระทำ": "สร้าง", "นักแสดงชาย": { "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "คุณลักษณะ": { "image": "สวัสดีชาวโลก", "name": "nifty_morse" } }, "ขอบเขต": "ท้องถิ่น", "เวลา": 1654006800, "timeNano": 1654006800347054800 }
ที่นี่ JSON ดิบกำลังส่งผ่าน jq
ดังนั้นจึงพิมพ์ได้ดีในเทอร์มินัลของคุณ ทำให้สแกนข้อมูลได้ง่ายขึ้น
เมื่อคุณสร้างสตริงรูปแบบที่กำหนดเอง คุณสามารถใช้คุณสมบัติในเอาต์พุต JSON เป็นข้อมูลอ้างอิงสำหรับตัวยึดตำแหน่งที่รองรับได้ ในกรณีส่วนใหญ่ คุณจะต้องใช้อักษรตัวแรกของพร็อพเพอร์ตี้เป็นตัวพิมพ์ใหญ่ เช่น time
ถึง {{ .Time }}
กรองเหตุการณ์
บันทึกเหตุการณ์สำหรับ Docker daemon ที่ยุ่งอาจส่งเสียงดังได้อย่างรวดเร็ว คุณสามารถจำกัดเหตุการณ์ให้แคบลงเป็นการกระทำ วัตถุ หรือประเภทของวัตถุเฉพาะด้วยแฟ --filter
:

-
docker events --filter type=container
– รับเหตุการณ์ทั้งหมดที่เกี่ยวข้องกับคอนเทนเนอร์ -
docker events --filter event=create
– รับเหตุการณ์การสร้างคอนเทนเนอร์ -
docker events --filter container=demo-container
– รับเหตุการณ์ทั้งหมดที่บันทึกไว้สำหรับคอนเทนเนอร์ที่เรียกว่าdemo-container
(คุณสามารถอ้างอิง ID หรือชื่อของคอนเทนเนอร์ได้)
นอกจาก container
แล้ว คุณยังสามารถกรองตามชื่อประเภทอ็อบเจ็กต์ที่รองรับทั้งหมดได้ เช่น image
network
และ volume
รองรับตัวกรองหลายตัวเมื่อคุณตั้งค่าสถานะ --filter
ซ้ำ ตัวกรองที่แตกต่างจะถูกตีความว่าเป็นเงื่อนไข และ ตรรกะ การใช้ตัวกรองเดียวกันหลายครั้งกลายเป็นส่วนคำสั่ง OR ต่อไปนี้คือตัวอย่างที่แสดงเหตุการณ์การ create
สำหรับทั้ง app-container
api-container
:
$ เหตุการณ์นักเทียบท่า \ --filter container=app-container --filter container=api-container --กรองเหตุการณ์=สร้าง
การเข้าถึงเหตุการณ์ทางประวัติศาสตร์
docker events
มีค่าเริ่มต้นที่จะแสดงเฉพาะเหตุการณ์ที่จัดเก็บไว้ตั้งแต่มีการเรียกใช้คำสั่ง คุณสามารถรวมเหตุการณ์ในอดีตด้วยการเพิ่ม --since
แฟล็ก ยอมรับนิพจน์เวลาที่มนุษย์อ่านได้หรือการประทับเวลาแบบสัมบูรณ์:
$ เหตุการณ์นักเทียบท่า -- ตั้งแต่ 1 ชั่วโมง $ เหตุการณ์นักเทียบท่า --ตั้งแต่ '2021-05-01T16:00:00'
กิจกรรมที่บันทึกหลังจากเวลาที่กำหนดจะแสดงในเทอร์มินัลของคุณทันที กิจกรรมใหม่จะแสดงต่อไปตามเวลาจริงตามที่บันทึกไว้
คุณสามารถยกเว้นเหตุการณ์หลังจากช่วงเวลาหนึ่งได้ด้วยแฟ --until
มันทำงานคล้ายกับ -- --since
. การใช้ --until
จะปิดการสตรีมเหตุการณ์ใหม่ตามเวลาจริง เนื่องจากอยู่นอกกรอบเวลาที่ร้องขอ
สตรีมกิจกรรมนักเทียบท่าจาก Daemon REST API
อีกวิธีหนึ่งในการเข้าถึงเหตุการณ์ที่เก็บไว้คือผ่าน Docker daemon REST API คุณสามารถใช้ปลายทาง /events
เพื่อสตรีมเหตุการณ์แบบเรียลไทม์หลังจากที่คุณได้เปิดใช้งาน API บนโฮสต์ Docker ของคุณ เหตุการณ์จะถูกส่งกลับในรูปแบบ JSON:
$ curl http://127.0.0.1:2375/v1.41/events { "ประเภท": "คอนเทนเนอร์", "การกระทำ": "สร้าง", "นักแสดงชาย": { "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "คุณลักษณะ": { "image": "สวัสดีชาวโลก", "name": "nifty_morse" } }, "ขอบเขต": "ท้องถิ่น", "เวลา": 1654006800, "timeNano": 1654006800347054800 }
ตำแหน่งข้อมูล API รองรับ filter
since
และ until
พารามิเตอร์ที่มีพฤติกรรมเหมือนกับคู่ CLI วิธีดึงข้อมูลเหตุการณ์การสร้างคอนเทนเนอร์ทั้งหมดที่บันทึกไว้ในชั่วโมงที่ผ่านมามีดังนี้
$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}
การส่งกิจกรรมไปยังบริการภายนอก
นักเทียบท่าไม่มีวิธีการในตัวในการส่งกิจกรรมไปยังบริการภายนอก สิ่งนี้อาจมีประโยชน์หากคุณต้องการให้การสร้างคอนเทนเนอร์ทั้งหมดของคุณถูกบันทึกในแพลตฟอร์มการตรวจสอบหรือการตรวจสอบที่มีอยู่
คุณสามารถตั้งค่าโซลูชันของคุณเองโดยสร้างบริการระบบที่เรียกใช้ docker events
อย่างต่อเนื่อง ควรส่งเอาต์พุตใหม่แต่ละบรรทัดไปยังระบบภายนอกของคุณ
ขั้นแรกให้เขียนสคริปต์ทุบตีที่ใช้ฟังก์ชันที่คุณต้องการ:
#!/bin/bash เหตุการณ์นักเทียบท่า --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | ขณะอ่านเหตุการณ์ ทำ ขด \ -X โพสต์ \ -H "ประเภทเนื้อหา: แอปพลิเคชัน/json" \ -d '{"event": "$event"}' \ https://example.com/events เสร็จแล้ว
ตอนนี้สร้างหน่วยบริการ systemd
ใหม่ที่ /etc/systemd/system/docker-events.service
:
[หน่วย] Description=Custom Docker Event Monitoring Service [บริการ] Type=forking ExecStart=/usr/local/bin/docker-events.sh [ติดตั้ง] WantedBy=multi-user.target
สุดท้ายโหลด systemd
เพื่อโหลดบริการของคุณ จากนั้นเริ่มและเปิดใช้งานหน่วย:
$ sudo systemctl daemon-reload $ sudo systemctl เริ่มนักเทียบท่าเหตุการณ์ $ sudo systemctl เปิดใช้งานนักเทียบท่าเหตุการณ์
บริการของคุณจะสตรีมกิจกรรมใหม่แต่ละรายการไปยังแพลตฟอร์มการตรวจสอบของคุณ การเปิดใช้งานบริการจะกำหนดค่าให้เริ่มต้นโดยอัตโนมัติทุกครั้งที่โฮสต์ของคุณรีบูต
สรุป
เหตุการณ์นักเทียบท่าจะถูกสร้างขึ้นเมื่อใดก็ตามที่ daemon แก้ไขอ็อบเจ็กต์ในสภาพแวดล้อมของคุณ การสตรีมบันทึกเหตุการณ์ช่วยให้คุณตรวจสอบกิจกรรมของ daemon แบบเรียลไทม์ ซึ่งสามารถช่วยคุณแก้ปัญหา ตรวจสอบการเปลี่ยนแปลง และรับรองการปฏิบัติตาม
เนื่องจากการดึงข้อมูลเหตุการณ์โดยตรงจากเซิร์ฟเวอร์ Docker จึงไม่ควรเชื่อถือหากคุณจำเป็นต้องดึงข้อมูลในอนาคต มีเพียง 1,000 รายการเท่านั้นที่จะถูกเก็บไว้ และคุณไม่สามารถเข้าถึงกิจกรรมผ่านระบบไฟล์ของโฮสต์ Docker ได้ กลไกนี้เหมาะที่สุดสำหรับงานเฉพาะกิจด่วนที่คุณกำลังมองหาข้อมูลเฉพาะที่เกี่ยวข้องกับกิจกรรมล่าสุด สำหรับการเก็บรักษาระยะยาว คุณควรใช้บริการระบบของคุณเองเพื่อส่งเหตุการณ์ไปยังที่เก็บข้อมูลภายนอก