การ Debug แอปพลิเคชันที่ทำงานบน Docker บางครั้งก็เหมือนกับการเดินในเขาวงกต เรามักจะเริ่มต้นด้วย docker logs เพื่อดูว่าเกิดอะไรขึ้น หรือใช้ docker exec เพื่อเข้าไปสำรวจภายในคอนเทนเนอร์ บางครั้งก็ใช้ docker inspect เพื่อดูรายละเอียดการตั้งค่า แต่บ่อยครั้ง เครื่องมือเหล่านี้ก็ให้ภาพที่ไม่สมบูรณ์ ทำให้เรายังคงงุนงงกับปัญหาที่เกิดขึ้น เช่น ทำไมคอนเทนเนอร์ถึงรีสตาร์ทเอง? เกิดอะไรขึ้นก่อนที่มันจะหยุดทำงาน? แล้วถ้ามีเครื่องมือที่สามารถให้คำตอบเหล่านี้ได้แบบเรียลไทม์ล่ะ?

เปิดม่านสู่ docker events

ผมขอแนะนำ docker events เครื่องมือที่มักถูกลืม แต่ทรงพลังอย่างยิ่งในการ Debug Docker ครับ docker events ไม่ได้แสดงผลลัพธ์จากแอปพลิเคชันเหมือน docker logs แต่มันทำหน้าที่เหมือนผู้ประกาศข่าวที่คอยรายงานทุกความเคลื่อนไหวจาก Docker daemon โดยตรง มันจะสตรีม เหตุการณ์ (events) ระดับต่ำแบบเรียลไทม์ออกมาให้เราเห็น

นั่นหมายความว่าเราจะได้เห็นภาพที่กว้างกว่าแค่สิ่งที่เกิดขึ้นภายในคอนเทนเนอร์เดียว สิ่งที่จะเห็นคือ

  • การสร้างและทำลายคอนเทนเนอร์: create, start, stop, die, destroy
  • การทำงานของอิมเมจ: pull, push, tag, untag, delete
  • เหตุการณ์เครือข่ายและโวลุ่ม: connect, disconnect, mount, unmount
  • และที่สำคัญ: health_status (เมื่อ Health Check ล้มเหลว), oom (เมื่อคอนเทนเนอร์ถูกฆ่าเพราะ Out of Memory), restart (เมื่อคอนเทนเนอร์เริ่มการรีสตาร์ท)

ข้อมูลเหล่านี้คือสิ่งที่ docker logs หรือ docker exec อาจไม่เคยบอกเรา และมันคือจิ๊กซอว์ชิ้นสำคัญที่ช่วยให้เข้าใจต้นตอของปัญหาที่ซับซ้อนได้

ใช้งาน docker events อย่างไร?

การใช้งานเพียงแค่รันคำสั่ง

$ docker events --filter container=my_app_container

คำสั่งนี้จะเริ่มสตรีมเหตุการณ์ Docker ทั้งหมดมายังคอนโซลของเราแบบเรียลไทม์ มันจะแสดงเฉพาะคอนเทนเนอร์ที่เราระบุไว้

กำหนดช่วงเวลา

$ docker events --filter contaner=<container-id> --since="30m" --until "2025-05-04T18:00:00"

ตำสั่งนี้จะแสดงเหตุการณ์ที่อยู่ในช่วงเวลาตั้งแต่ 30 นาทีที่ผ่านมา (นับจากเวลาที่เรารันคำสั่งนี้) ไปจนถึงวันที่เรากำหนด

แสดงผลแบบ JSON

$ docker events --filter container=<cont_id> --since="5m" --format '{{json .}}' | jq

ทำไม docker events ถึงเป็น Game Changer?

การนำ docker events เข้ามาเป็นส่วนหนึ่งของกระบวนการ Debug จะช่วยยกระดับความสามารถในการแก้ไขปัญหาของเราได้อย่างมาก มันมอบ "การมองเห็น" (Visibility) ในระดับที่เครื่องมือพื้นฐานให้ไม่ได้ ช่วยให้เรา

  1. วินิจฉัยปัญหาการรีสตาร์ท: เห็นเหตุการณ์ที่นำไปสู่การ die และ restart ได้ชัดเจน
  2. ตรวจจับปัญหาหน่วยความจำ: แจ้งเตือนทันทีเมื่อเกิด oom
  3. ตรวจสอบ Health Check: รู้ได้ทันทีเมื่อ Health Check ของคอนเทนเนอร์มีปัญหา
  4. เข้าใจภาพรวม: เห็นปฏิสัมพันธ์ระหว่างคอนเทนเนอร์ต่างๆ และ Docker daemon

บทสรุป

ในโลกของการพัฒนาและการจัดการ Docker ที่ซับซ้อน การมีเครื่องมือที่เหมาะสมเป็นสิ่งสำคัญอย่างยิ่ง docker logs, exec, และ inspect ยังคงเป็นเครื่องมือหลัก แต่เมื่อเราต้องการมุมมองที่ลึกกว่า หรือต้องการจับเหตุการณ์ที่เกิดขึ้นในเสี้ยววินาที docker events คือ "อัญมณีที่ซ่อนอยู่" ที่เราไม่ควรมองข้าม ลองนำไปใช้งานดูครับ จะพบว่าการ Debug Docker ไม่ได้ยากอย่างที่เคยเป็นอีกต่อไป