آنچه در این مقاله میخوانید [پنهانسازی]
اگر به دنبال پایش دقیق کانتینرها با کمترین سربار هستید، بهترین نقطه شروع استفاده از Prometheus برای Docker است. در این راهنما یاد می گیرید چه اجزایی لازم دارید، چگونه آن ها را اجرا کنید، چه متریک هایی را بسنجید و چطور هشدارهای کاربردی بسازید تا قبل از بروز مشکل، سرنخ ها را پیدا کنید.
چرا نظارت بر کانتینرها حیاتی است
کانتینرها سبک، پویا و کوتاه عمر هستند. همین ویژگی ها عیب یابی را دشوار می کنند. بدون پایش مستمر، نشت حافظه، فشار دیسک یا راه اندازی مکرر سرویس ها دیر تشخیص داده می شود. با یک سیستم مانیتورینگ مناسب می توانید ظرفیت را برنامه ریزی کنید، هزینه را کنترل کنید و ریشه خطاها را سریع تر بیابید.
معماری پیشنهادی و اجزا
یک معماری ساده و قابل اتکا شامل سرور Prometheus، اکسپورترها و یک ابزار بصری سازی است. وقتی از Prometheus برای Docker استفاده می کنیم، معمول ترین ترکیب شامل cAdvisor برای متریک های کانتینر، node exporter برای متریک های سیستم عامل میزبان و فعال کردن متریک های خود Docker daemon است.
| مولفه | نقش در سیستم |
|---|---|
| Prometheus Server | جمع آوری، ذخیره و کوئری گرفتن از متریک ها |
| cAdvisor | نمایش مصرف CPU، حافظه، شبکه و بلوک دیسک هر کانتینر |
| Node Exporter | پایش وضعیت میزبان مانند CPU، حافظه، فایل سیستم و شبکه |
| Docker Daemon Metrics | متریک های موتور Docker مانند وضعیت پل ها، تعداد کانتینرها و خطاها |
پیش نیازها و راه اندازی مرحله ای
در این بخش یک سناریوی ساده و عملی را روی یک میزبان واحد پیاده سازی می کنیم. می توانید همین الگو را در خوشه ها یا چند میزبان نیز گسترش دهید.
- نصب Docker و Docker Compose
آخرین نسخه های پایدار Docker Engine و Docker Compose را نصب کنید. مطمئن شوید کاربر فعلی مجوز اجرای Docker را دارد.
- فعال کردن متریک های Docker
در فایل تنظیمات Docker مقادیر زیر را اضافه کنید و سرویس را ریستارت کنید.
{
"metrics-addr": "0.0.0.0:9323",
"experimental": true
}
# روی لینوکس:
# sudo systemctl restart docker
- ایجاد شبکه و فایل های پیکربندی
یک پوشه کاری بسازید و در آن فایل های docker-compose.yml و prometheus.yml را قرار دهید.
- راه اندازی سرویس ها
با docker compose بالا بیاورید و صفحه Targets را بررسی کنید تا مطمئن شوید همه job ها در وضعیت UP هستند.
- افزودن یک ابزار داشبورد
استفاده از Grafana توصیه می شود تا متریک ها را در داشبوردهای آماده مثل Kubernetes و Docker Container بررسی کنید.
فایل نمونه docker compose برای شروع سریع
این فایل سه سرویس اصلی را بالا می آورد و شبکه ای مشترک برای ارتباط بین آن ها می سازد. همچنین برای دسترسی Prometheus به متریک های Docker روی میزبان، نگاشت host.docker.internal اضافه شده است.
version: "3.8"
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.retention.time=15d
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prom_data:/prometheus
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- monitoring
restart: unless-stopped
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
networks:
- monitoring
restart: unless-stopped
volumes:
prom_data:
networks:
monitoring:
driver: bridge
تنظیم Prometheus برای اسکرپ متریک ها
فایل زیر سه job اصلی برای خود Prometheus، cAdvisor و node exporter را تعریف می کند و متریک های Docker daemon را از میزبان جمع آوری می کند.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "cadvisor"
static_configs:
- targets: ["cadvisor:8080"]
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]
- job_name: "docker"
static_configs:
- targets: ["host.docker.internal:9323"]
متریک های کلیدی که باید مانیتور شوند
تمرکز بر چند شاخص کلیدی، ساده ترین راه برای گرفتن دید سریع از سلامت کانتینرها است. موارد زیر را در داشبورد خود قرار دهید و برای آن ها هشدار بسازید.
- CPU: متریک های container_cpu_usage_seconds_total برای تشخیص مصرف لحظه ای و نرخ میانگین. اگر کانتینرها محدودیت دارند، به throttling نیز توجه کنید.
- حافظه: container_memory_working_set_bytes تصویر دقیقی از حافظه فعال می دهد. نزدیک شدن به limit خطر OOM را افزایش می دهد.
- فایل سیستم: container_fs_usage_bytes و container_fs_writes_bytes_total برای بررسی پر شدن حجم و الگوی نوشتن.
- شبکه: container_network_receive_bytes_total و container_network_transmit_bytes_total برای سنجش پهنای باند و تشخیص اختلال.
- پایداری سرویس: increase(container_restart_count_total[5m]) برای مشاهده راه اندازی مجدد غیر عادی.
- سطح میزبان: node_load1، node_filesystem_avail_bytes و node_network_errors_total برای محدودیت های سخت افزاری.
نمونه قوانین هشدار عملی
با چند قانون ساده می توانید هشدارهای پر سر و صدا را کاهش دهید و روی موارد مهم تمرکز کنید. فایل زیر را به عنوان rule file اضافه کنید.
groups:
- name: container-alerts
rules:
- alert: ContainerHighCPU
expr: rate(container_cpu_usage_seconds_total{image!=""}[5m]) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: مصرف CPU بالا در کانتینر
description: کانتینر بیش از 80 درصد CPU را در 10 دقیقه گذشته مصرف کرده است.
- alert: ContainerOOMRisk
expr: (container_memory_working_set_bytes{image!=""} / on(container) group_left limit) > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: ریسک OOM
description: مصرف حافظه نزدیک به limit است. منابع را افزایش دهید یا حافظه نشت را بررسی کنید.
توجه: برچسب limit باید از طریق runtime یا label به متریک ها اضافه شود. اگر limit تنظیم نشده است، قاعده را بر اساس مقدار مطلق یا درصد از حافظه میزبان بازنویسی کنید.
بهینه سازی های ضروری برای محیط تولید
- Retention و ذخیره سازی: برای محیط های پر ترافیک از دیسک سریع و مقدار retention منطقی مانند 15 تا 30 روز استفاده کنید.
- تنظیم interval: برای سرویس های پرترافیک scrape_interval را 15 ثانیه نگه دارید و برای سرویس های کم اهمیت تر آن را افزایش دهید تا سربار کاهش یابد.
- Label hygiene: برچسب های پرکاراکتر مانند مسیرهای پویا را حذف یا خلاصه کنید تا تعداد سری های زمانی انفجاری نشود.
- Service discovery: اگر از Docker Compose فراتر می روید، به استفاده از discovery مبتنی بر label یا یک سرویس رجیستری فکر کنید.
- امنیت شبکه: پورت های 9090، 8080، 9100 و 9323 را فقط روی شبکه داخلی یا با فایروال محدود کنید.
عیب یابی مشکلات رایج
- هدف ها DOWN هستند: بخش Status سپس Targets را در رابط Prometheus بررسی کنید. خطای TLS، DNS یا فایروال را در نظر بگیرید.
- خطای permission در cAdvisor: مطمئن شوید مسیرهای /sys و /var/lib/docker با دسترسی read only درست mount شده اند.
- عدم دریافت متریک های Docker: گزینه experimental و metrics addr باید فعال و سرویس Docker ریستارت شده باشد. آدرس 9323 را با curl تست کنید.
- افزایش سری های زمانی: برچسب های پویا مانند شناسه درخواست را حذف کنید. از relabel_configs برای کاهش کاردینالیتی بهره ببرید.
- مصرف بالای دیسک: retention را کوتاه تر کنید یا remote write به یک سیستم long term مانند Thanos یا VictoriaMetrics اضافه کنید.
نمونه کوئری های مفید PromQL
- مصرف CPU هر کانتینر در درصد: rate(container_cpu_usage_seconds_total{image!=””}[5m]) * 100
- مصرف حافظه بر حسب مگابایت: container_memory_working_set_bytes{image!=””} / 1024 / 1024
- نوشتن دیسک در 5 دقیقه: rate(container_fs_writes_bytes_total{image!=””}[5m])
- کانتینرهایی با ریستارت اخیر: increase(container_restart_count_total[30m]) > 0
گسترش سیستم با داشبورد و لاگ
برای داشبوردهای آماده، Grafana و بسته های رسمی Prometheus را نصب کنید. داشبوردهای cAdvisor و Node Exporter در گالری Grafana در دسترس هستند و راه اندازی را سریع می کنند. برای تکمیل دید، اتصال لاگ ها با ابزارهایی مانند Loki یا ELK می تواند به همبستگی رخدادها با متریک ها کمک کند.
موارد امنیتی که نباید فراموش شوند
- جدا سازی شبکه: سرویس های پایش را در یک شبکه داخلی مجزا اجرا کنید و از NAT تنها برای دسترسی مدیران استفاده کنید.
- احراز هویت: روی رابط های وب از reverse proxy با احراز هویت استفاده کنید. خود Prometheus احراز هویت داخلی ندارد.
- حداقل دسترسی: فقط مسیرهای ضروری را به کانتینرها mount کنید و قابلیت های اضافی را غیرفعال نگه دارید.
جمع بندی
با اجرای cAdvisor، node exporter و فعال کردن متریک های موتور Docker، یک شالوده سبک و قابل اطمینان برای نظارت خواهید داشت. افزودن قوانین هشدار و داشبوردهای هدفمند، تشخیص پیشگیرانه را ممکن می کند و زمان عیب یابی را کاهش می دهد. پیاده سازی درست Prometheus برای Docker نه تنها سلامت سرویس ها را تضمین می کند بلکه دید روشنی از ظرفیت و روند رشد ارائه می دهد.






