انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

تسجيل الحاويات: إدارة سجلات Docker و Kubernetes

مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.

وقت القراءة: 15 dk الحاويات والتنسيق
dockerkubernetesتسجيلسجلlokielkfluentdمراقبة
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

تسجيل الحاويات: إدارة سجلات Docker و Kubernetes

يختلف التسجيل في بيئات الحاويات عن تسجيل الخوادم التقليدية. نظراً لأن الحاويات مؤقتة، فإن جمع السجلات مركزياً خارج الحاوية أمر بالغ الأهمية. يتناول هذا الدليل إدارة سجلات Docker و Kubernetes وحلول جمع السجلات المركزية وأفضل ممارسات الإنتاج.

أساسيات تسجيل Docker

أمر docker logs

hljs bash
# عرض سجلات الحاوية
docker logs CONTAINER_NAME

# عرض آخر N سطر
docker logs --tail 100 CONTAINER_NAME

# بث السجلات المباشر
docker logs -f CONTAINER_NAME

# عرض مع الطوابع الزمنية
docker logs -t CONTAINER_NAME

# من وقت محدد
docker logs --since 1h CONTAINER_NAME  # آخر ساعة

# نطاق زمني محدد
docker logs --since 2h --until 1h CONTAINER_NAME

مشغلات سجلات Docker

hljs bash
# التحقق من مشغل السجل الحالي
docker info | grep 'Logging Driver'

إعداد مشغل السجل

hljs json
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
  }
}
hljs bash
# إعادة تشغيل Docker daemon
systemctl restart docker

مشغل السجل عند تشغيل الحاوية

hljs bash
# json-file مع تدوير السجلات
docker run -d \
  --name myapp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

# إعادة التوجيه إلى syslog
docker run -d \
  --name myapp \
  --log-driver syslog \
  --log-opt syslog-address=udp://localhost:514 \
  myapp:latest

إعداد السجلات مع Docker Compose

hljs yaml
version: '3.8'

services:
  app:
    image: myapp:latest
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"
        compress: "true"

  nginx:
    image: nginx:latest
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "3"

سجلات Pods في Kubernetes

hljs bash
# عرض سجلات الـ pod
kubectl logs POD_NAME

# حاوية محددة (pod متعدد الحاويات)
kubectl logs POD_NAME -c CONTAINER_NAME

# بث السجلات المباشر
kubectl logs -f POD_NAME

# آخر N سطر
kubectl logs --tail=100 POD_NAME

# من وقت محدد
kubectl logs --since=1h POD_NAME

# سجلات الحاوية السابقة (بعد الانهيار)
kubectl logs --previous POD_NAME

# سجلات جميع الـ pods في deployment
kubectl logs -l app=myapp --all-containers

جمع السجلات المركزي: Loki + Grafana

hljs yaml
# loki-stack.yml
version: '3.8'

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"
    volumes:
      - loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=StrongPass123!
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  loki-data:
  grafana-data:

تدوير السجلات وإدارة القرص

hljs bash
# التحقق من أحجام ملفات سجلات Docker
du -sh /var/lib/docker/containers/*/*-json.log

# مسح سجل حاوية محددة
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)

# التدوير التلقائي مع logrotate
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=10M
  missingok
  delaycompress
  copytruncate
}
EOF

التسجيل المنظم (JSON)

hljs javascript
// Node.js — تسجيل JSON مع Winston
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console()
  ]
});

logger.info('تسجيل دخول المستخدم', {
  userId: 123,
  action: 'login',
  ip: '192.168.1.1'
});

logger.error('خطأ في قاعدة البيانات', {
  error: err.message,
  query: 'SELECT * FROM users'
});

الخلاصة

تسجيل الحاويات الفعّال ضروري لاستكشاف الأخطاء ومراقبة صحة النظام في بيئات الإنتاج. امنع امتلاء القرص بتدوير سجلات Docker، وأعدّ جمع السجلات المركزي مع Loki أو ELK Stack، وبسّط تحليل السجلات بسجلات JSON المنظمة. بهذه الإعدادات على خوادم REXE يمكنك إدارة بنيتك التحتية للحاويات برؤية كاملة.

الأسئلة الشائعة

أين تُخزَّن سجلات Docker؟

مع مشغل json-file الافتراضي تُخزَّن السجلات في /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log. استخدم docker inspect CONTAINER_NAME | grep LogPath للعثور على المسار الدقيق. بدون تدوير السجلات المُعدّ يمكن لهذه الملفات أن تملأ القرص بمرور الوقت.

كيف أرى السجلات بعد حذف الحاوية؟

عند حذف الحاوية تُفقد سجلاتها أيضاً. لهذا يُعدّ استخدام جمع السجلات المركزي (Loki, ELK, Fluentd) في الإنتاج أمراً بالغ الأهمية. بديلاً يمكن إعادة التوجيه إلى syslog بـ --log-driver syslog أو الكتابة إلى ملف داخل التطبيق وجعله دائماً بـ volume.

كيف أعدّ تدوير السجلات؟

طريقتان: 1) على مستوى Docker daemon أضف max-size وmax-file إلى /etc/docker/daemon.json (ينطبق على جميع الحاويات). 2) عند تشغيل الحاوية استخدم --log-opt max-size=10m --log-opt max-file=3. لا تنسَ إعادة تشغيل Docker بعد التغييرات.

كيف أتابع سجلات عدة pods في Kubernetes؟

استخدم kubectl logs -l app=myapp --all-containers مع محدد التسمية لعرض سجلات عدة pods في آنٍ واحد. لحلول أكثر تقدماً استخدم أدوات مثل stern أو kubetail. في الإنتاج يُنصح بجمع السجلات المركزي مع Loki أو ELK Stack.

لماذا يُعدّ التسجيل بتنسيق JSON مهماً؟

سجلات JSON منظمة ويمكن تحليلها تلقائياً بواسطة أنظمة مثل Loki وElasticsearch. يمكن التصفية والبحث بحقول محددة (مثلاً جميع السجلات حيث userId=123). السجلات النصية تتطلب تحليلاً بـ regex وهو بطيء وعرضة للأخطاء.

مقالات ذات صلة

أمان Docker: تصليب بيئة الحاويات

أفضل ممارسات أمان Docker: مستخدم غير root، نظام ملفات للقراءة فقط، ملفات seccomp، فحص الصور، أمان Docker socket، عزل الشبكة وإدارة الأسرار.

17 dk
dockerأمانحاوية
حركة الشبكةالداخل Gbpsالخارج Gbps