كيفية عرض سجل أحداث تثبيت Docker

نشرت: 2022-08-11

شعار Docker

يسجل Docker Engine حدثًا كلما تم اتخاذ إجراءات مهمة بواسطة البرنامج الخفي. يمكنك الوصول إلى سجل الأحداث لتحديد وقت حدوث الإجراء وتتبع التغييرات على الكائنات بمرور الوقت.

في هذه المقالة ، سنشرح ما تم التقاطه كأحداث ومتى قد ترغب في مشاهدتها. سنعرض بعد ذلك كيفية مراقبة الأحداث في الوقت الفعلي باستخدام Docker CLI و REST API.

ما هي أحداث Docker؟

تصف أحداث Docker الأنشطة التي يقوم بها Docker daemon الخاص بك. تسجل معظم التفاعلات مع كائنات مثل الحاويات والصور ووحدات التخزين والشبكات حدثًا ، مما يؤدي إلى إنشاء سجل يمكنك استخدامه لفحص التغييرات السابقة.

هناك العديد من أنواع الأحداث المختلفة التي تحدد تغييرات معينة في بيئتك:

  • عمل الحاويات وإزالتها
  • حالات فحص صحة الحاوية
  • يتم تنفيذ الأوامر داخل الحاويات باستخدام docker exec
  • سحب ودفع الصور
  • إنشاء وتدمير وتركيب وفك الأحجام
  • تمكين وتعطيل المكونات الإضافية لبرنامج Docker daemon

يمكنك عرض القائمة الكاملة في وثائق Docker.

يتضمن كل حدث مسجل طابعًا زمنيًا ومعرف الكائن المتأثر. يمكنك استخدام هذه المعلومات لتجميع محفوظات التغييرات التي طرأت على بيئتك ، سواء لاحظت مشغلاتها الأصلية أم لا.

يمكن أن تساعد الأحداث المخزنة أيضًا في تشخيص مشكلات مثل حالات فشل الحاوية غير المتوقعة. يتيح لك عرض السجل تحديد الوقت الدقيق الذي توقفت فيه الحاوية ، مما يوفر نقطة بيانات يمكنك ربطها بسجلاتك الأخرى. يمكن أن تحدد الأحداث متى بدأت الفحوصات الصحية للحاوية بالفشل ، مما يؤدي إلى تضييق فترة الاهتمام عندما تحتاج إلى فحص الخدمات الخارجية لتحديد السبب الجذري للمشكلة.

بث أحداث Docker باستخدام Docker CLI

يقوم أمر Docker docker events CLI بدفق الأحداث من Docker daemon الخاص بك إلى نافذة المحطة الطرفية. ستظهر الأحداث في الوقت الفعلي حتى تنتهي من العملية بالضغط على مجموعة لوحة المفاتيح Ctrl + C.

لن يؤدي تشغيل الأمر بدون وسيطات إلى إظهار أي إخراج لتبدأ به. يتم عرض النشاط الجديد فقط بحيث يظل الناتج فارغًا حتى يقع الحدث. يمكنك استفزاز واحد عن طريق بدء حاوية جديدة في غلاف مختلف:

 تشغيل Docker $ - rm hello-world

يجب أن تظهر عدة أحداث الآن في نافذة المحطة الطرفية التي تقوم بتشغيل أمر docker events :

 2022-05-31 T15: 20: 00.267970018 + 01: 00 سحب صورة hello-world: الأحدث (الاسم = hello-world)
2022-05-31 T15: 20: 00.347054862 + 01: 00 إنشاء حاوية 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (صورة = مرحبا-العالم ، الاسم = nifty_morse)
2022-05-31 T15: 20: 00.347805277 + 01: 00 إرفاق حاوية 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (صورة = مرحبا-العالم ، الاسم = nifty_morse)
2022-05-31T15: 20: 00.621070053 + 01: 00 بدء الحاوية 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image = hello-world ، name = nifty_morse)
...

كل حدث يعرض على خطه الخاص. يتم عرض الطابع الزمني للحدث أولاً ، متبوعًا بنوع الكائن المتأثر (مثل image أو container ) ثم الإجراء الذي تم اتخاذه (مثل create attach start ). يحتوي الجزء المتبقي من الرسالة على بيانات أولية مفيدة حول الكائن. يوضح المثال أعلاه أن hello-world:latest صورة وإنشاء حاوية منه.

إخراج التنسيق

غالبًا ما تكون قائمة الأحداث الأولية غير عملية. يمكنك إعادة تنسيق الإخراج باستخدام علامة --format التي تقبل سلسلة نموذج Go:

 أحداث $ docker --format '{{.Time}} {{.Action}} {{.Type}} {{.ID}}'

سيؤدي تشغيل هذا المثال إلى إنتاج مخرجات تبدو كالتالي:

 1654006800 سحب صورة hello-world: الأحدث
1654006800 إنشاء حاوية 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 إرفاق حاوية 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 حاوية البدء 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

يمكنك تمثيل الأحداث ككائنات JSON باستخدام {{ json . }} {{ json . }} كسلسلة القالب الخاص بك:

 أحداث $ docker --format '{{json. }} '| جي كيو
{
  "الحالة": "إنشاء" ،
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378" ،
  "from": "hello-world"،
  "النوع": "الحاوية" ،
  "الإجراء": "إنشاء" ،
  "الممثل": {
    "المعرف": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378" ،
    "صفات": {
      "صورة": "hello-world"،
      "الاسم": "nifty_morse"
    }
  } ،
  "النطاق": "محلي"،
  "الوقت": 1654006800 ،
  "timeNano": 1654006800347054800
}

هنا يتم تمرير JSON الخام من خلال jq لذا فهو مطبوع بشكل جيد في جهازك الطرفي. هذا يجعل المعلومات أسهل للبحث من خلالها.

عندما تقوم بإنشاء سلاسل تنسيق مخصصة ، يمكنك استخدام الخصائص في إخراج JSON كمرجع للعناصر النائبة المدعومة. في معظم الحالات ، ستحتاج إلى كتابة الحرف الأول من كل خاصية بأحرف كبيرة ، مثل time إلى {{ .Time }} .

تصفية الأحداث

يمكن أن يصبح سجل الأحداث لبرنامج Docker الخفي مشغولًا صاخبًا بسرعة. يمكنك تضييق الأحداث إلى إجراء معين ، أو كائن ، أو نوع كائن --filter :

  • docker events --filter type=container - احصل على جميع الأحداث المتعلقة بالحاويات.
  • docker events --filter event=create - احصل على أحداث إنشاء الحاوية.
  • docker events --filter container=demo-container - احصل على جميع الأحداث المحفوظة للحاوية المسماة demo-container (يمكنك الرجوع إلى معرّف الحاوية أو اسمها).

إلى جانب container ، يمكنك التصفية حسب جميع أسماء أنواع الكائنات المدعومة مثل image network volume .

يتم دعم عوامل التصفية المتعددة عند تكرار علامة --filter . يتم تفسير عوامل التصفية المميزة على أنها شروط منطقية " و " ؛ تصبح الاستخدامات المتعددة لنفس المرشح عبارة " أو ". في ما يلي مثال يبرز حدث create لكل app-container api-container :

 أحداث Docker $ \
    --filter container = app-container
    - حاوية المرشح = حاوية api
    - حدث التصفية = إنشاء

الوصول إلى الأحداث التاريخية

يتم docker events بشكل افتراضي لعرض الأحداث المخزنة منذ تشغيل الأمر فقط. يمكنك تضمين الأحداث التاريخية عن طريق إضافة --since العلم. هذا يقبل تعبير وقت يمكن قراءته أو طابع زمني مطلق:

 أحداث Docker $ - منذ ساعة
أحداث Docker $ - منذ "2021-05-01T16: 00: 00"

سيتم عرض الأحداث المسجلة بعد الوقت المحدد على الفور في محطتك. ستستمر الأحداث الجديدة في الظهور في الوقت الفعلي أثناء تسجيلها.

يمكنك استبعاد الأحداث بعد وقت معين --until . إنه يعمل بشكل مشابه لـ --since . سيؤدي استخدام --until إلى تعطيل دفق الأحداث الجديدة في الوقت الفعلي لأنها ستقع خارج الإطار الزمني المطلوب.

بث أحداث Docker من Daemon REST API

هناك طريقة أخرى للوصول إلى الأحداث المخزنة وهي من خلال Docker daemon REST API. يمكنك استخدام نقطة نهاية /events لدفق الأحداث في الوقت الفعلي بعد تمكين واجهة برمجة التطبيقات على مضيف Docker. سيتم عرض الأحداث بتنسيق JSON:

 حليقة $ http://127.0.0.1:2375/v1.41/events
{
  "النوع": "الحاوية" ،
  "الإجراء": "إنشاء" ،
  "الممثل": {
    "المعرف": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378" ،
    "صفات": {
      "صورة": "hello-world"،
      "الاسم": "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 إلى طريقة مضمنة لإرسال الأحداث إلى خدمة خارجية. قد يكون هذا مفيدًا إذا كنت تريد تسجيل جميع إبداعات الحاوية الخاصة بك في منصة مراقبة أو تدقيق موجودة.

يمكنك إعداد الحل الخاص بك عن طريق إنشاء خدمة نظام تعمل باستمرار على تشغيل docker events . يجب أن يرسل كل سطر إخراج جديد إلى نظامك الخارجي.

اكتب أولاً برنامج نصي Bash يقوم بتنفيذ الوظائف التي تحتاجها:

 #! / بن / باش
أحداث عامل ميناء --format '{{.Time}} {{.Action}} {{.Type}} {{.ID}}' | أثناء قراءة الحدث
فعل
    لفة \
        -X POST \
        -H "نوع المحتوى: application / json" \
        -d '{"event": "$ event"}' \
        https://example.com/events
فعله

أنشئ الآن وحدة خدمة systemd جديدة على /etc/systemd/system/docker-events.service :

 [وحدة]
الوصف = خدمة مراقبة حدث Docker المخصص

[خدمة]
اكتب = forking
ExecStart = / usr / local / bin / docker-events.sh

[تثبيت]
WantedBy = multi-user.target

أخيرًا ، أعد تحميل systemd لتحميل خدمتك ، ثم ابدأ الوحدة وقم بتمكينها:

 sudo systemctl الخفي-إعادة التحميل
sudo systemctl ابدأ أحداث عامل التحميل
sudo systemctl يقوم بتمكين أحداث عامل الإرساء

ستقوم خدمتك الآن ببث كل حدث جديد إلى منصة المراقبة الخاصة بك. يؤدي تمكين الخدمة إلى تكوينها للبدء تلقائيًا في كل مرة يعيد فيها مضيفك التشغيل.

ملخص

يتم إنشاء أحداث Docker عندما يقوم البرنامج الخفي بتعديل الكائنات في بيئتك. يتيح لك تدفق سجل الأحداث مراقبة نشاط البرنامج الخفي في الوقت الفعلي. يمكن أن يساعدك ذلك في تصحيح الأخطاء ومراجعة التغييرات وضمان الامتثال.

نظرًا لاسترداد الأحداث مباشرة من خادم Docker ، فلا ينبغي الاعتماد عليها إذا كنت ستحتاج إلى استرداد المعلومات في المستقبل. يتم الاحتفاظ بـ 1000 إدخال فقط على أساس دوري ولا يمكنك الوصول إلى الأحداث عبر نظام ملفات مضيف Docker. الآلية هي الأنسب للمهام المؤقتة السريعة حيث تبحث عن معلومات محددة تتعلق بنشاط حديث. للاحتفاظ على المدى الطويل ، يجب عليك استخدام خدمة النظام الخاصة بك لإرسال الأحداث إلى مستودع خارجي.