วิธีดูประวัติเหตุการณ์การติดตั้ง Docker ของคุณ

เผยแพร่แล้ว: 2022-08-11

โลโก้นักเทียบท่า

Docker 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 ได้ กลไกนี้เหมาะที่สุดสำหรับงานเฉพาะกิจด่วนที่คุณกำลังมองหาข้อมูลเฉพาะที่เกี่ยวข้องกับกิจกรรมล่าสุด สำหรับการเก็บรักษาระยะยาว คุณควรใช้บริการระบบของคุณเองเพื่อส่งเหตุการณ์ไปยังที่เก็บข้อมูลภายนอก