{"id":219,"date":"2026-08-21T12:00:00","date_gmt":"2026-08-21T12:00:00","guid":{"rendered":"https:\/\/konteynerium.com\/?p=219"},"modified":"2026-10-06T11:34:00","modified_gmt":"2026-10-06T11:34:00","slug":"container-izleme-loglama-docker-stats-prometheus-grafana","status":"publish","type":"post","link":"https:\/\/konteynerium.com\/index.php\/2026\/08\/21\/container-izleme-loglama-docker-stats-prometheus-grafana\/","title":{"rendered":"Container \u0130zleme ve Loglama: docker stats&#8217;tan Prometheus + Grafana&#8217;ya"},"content":{"rendered":"<p>Bir uygulamay\u0131 production&#8217;a ta\u015f\u0131mak i\u015fin sadece yar\u0131s\u0131d\u0131r \u2014 as\u0131l mesele, orada sa\u011fl\u0131kl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak ve bir \u015feyler ters gitti\u011finde bunu h\u0131zl\u0131ca fark edebilmektir. Bu yaz\u0131da, tek container&#8217;da <code>docker stats<\/code> ile ba\u015flay\u0131p, \u00f6l\u00e7eklenebilir bir izleme (monitoring) kurulumuna, Prometheus ve Grafana&#8217;ya kadar ilerliyoruz.<\/p>\n<h2>En basit hali: docker stats ve docker logs<\/h2>\n<p>K\u00fc\u00e7\u00fck kurulumlarda, container&#8217;lar\u0131n anl\u0131k kaynak kullan\u0131m\u0131n\u0131 g\u00f6rmek i\u00e7in yerle\u015fik komutlar yeterlidir:<\/p>\n<pre><code># T\u00fcm \u00e7al\u0131\u015fan container'lar\u0131n CPU\/RAM\/a\u011f kullan\u0131m\u0131n\u0131 canl\u0131 izle\ndocker stats\n\n# Belirli bir container'\u0131n loglar\u0131n\u0131 canl\u0131 takip et\ndocker logs -f --tail 100 benim-api\n\n# Son 1 saatteki loglar\u0131 g\u00f6ster\ndocker logs --since 1h benim-api<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m\u0131n s\u0131n\u0131r\u0131 bellidir: bir sunucuda birka\u00e7 container varken i\u015fe yarar, ama onlarca container ve birden fazla sunucu oldu\u011funda terminalde tek tek bakmak s\u00fcrd\u00fcr\u00fclemez hale gelir.<\/p>\n<h2>Health check: bir container&#8217;\u0131n ger\u00e7ekten sa\u011fl\u0131kl\u0131 oldu\u011funu bilmek<\/h2>\n<p>Bir container&#8217;\u0131n &#8220;\u00e7al\u0131\u015f\u0131yor&#8221; (running) durumda olmas\u0131, i\u00e7indeki uygulaman\u0131n <em>sa\u011fl\u0131kl\u0131<\/em> oldu\u011fu anlam\u0131na gelmez \u2014 process ayakta olabilir ama uygulama tak\u0131lm\u0131\u015f (hang) olabilir. <code>HEALTHCHECK<\/code> talimat\u0131, Docker&#8217;a periyodik olarak bir kontrol komutu \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 s\u00f6yler:<\/p>\n<pre><code># Dockerfile i\u00e7inde\nHEALTHCHECK --interval=30s --timeout=3s --retries=3 \\\n  CMD curl -f http:\/\/localhost:3000\/saglik || exit 1<\/code><\/pre>\n<pre><code># Container'\u0131n sa\u011fl\u0131k durumunu g\u00f6r\ndocker ps   # STATUS s\u00fctununda \"healthy\" \/ \"unhealthy\" g\u00f6r\u00fcn\u00fcr\ndocker inspect --format='{{.State.Health.Status}}' benim-api<\/code><\/pre>\n<p>Orkestrat\u00f6rler (Kubernetes, Swarm) bu health check&#8217;i kullanarak &#8220;unhealthy&#8221; duruma d\u00fc\u015fen container&#8217;lar\u0131 otomatik olarak yeniden ba\u015flatabilir veya trafi\u011fi o kopyadan uzakla\u015ft\u0131rabilir.<\/p>\n<div class=\"callout\">\n  <span class=\"glyph\">i<\/span><\/p>\n<p>Kubernetes&#8217;te bu kavram <code>livenessProbe<\/code> (container hayatta m\u0131) ve <code>readinessProbe<\/code> (trafik almaya haz\u0131r m\u0131) olarak ikiye ayr\u0131l\u0131r \u2014 Docker&#8217;\u0131n tek <code>HEALTHCHECK<\/code>&#8216;inden daha ince taneli bir kontrol sa\u011flar.<\/p>\n<\/div>\n<h2>\u00d6l\u00e7eklenebilir izleme: Prometheus + Grafana<\/h2>\n<p>Birden fazla sunucu ve onlarca container oldu\u011funda, standart yakla\u015f\u0131m <strong>Prometheus<\/strong> (metrik toplama ve saklama) ile <strong>Grafana<\/strong>&#8216;y\u0131 (g\u00f6rselle\u015ftirme ve alarm) bir arada kullanmakt\u0131r. Docker container&#8217;lar\u0131n\u0131n metriklerini toplamak i\u00e7in genellikle <code>cAdvisor<\/code> araya girer:<\/p>\n<pre><code>services:\n  cadvisor:\n    image: gcr.io\/cadvisor\/cadvisor:v0.49.1\n    volumes:\n      - \/:\/rootfs:ro\n      - \/var\/run:\/var\/run:ro\n      - \/sys:\/sys:ro\n      - \/var\/lib\/docker\/:\/var\/lib\/docker:ro\n    ports:\n      - \"8081:8080\"\n\n  prometheus:\n    image: prom\/prometheus:v2.53.0\n    volumes:\n      - .\/prometheus.yml:\/etc\/prometheus\/prometheus.yml\n    ports:\n      - \"9090:9090\"\n\n  grafana:\n    image: grafana\/grafana:11.1.0\n    ports:\n      - \"3001:3000\"<\/code><\/pre>\n<p>Bu \u00fc\u00e7l\u00fc \u015fu ak\u0131\u015fla \u00e7al\u0131\u015f\u0131r: <code>cAdvisor<\/code> her container&#8217;\u0131n CPU, bellek, a\u011f ve disk metriklerini toplar \u2192 <code>Prometheus<\/code> bu metrikleri d\u00fczenli aral\u0131klarla \u00e7ekip zaman serisi veritaban\u0131nda saklar \u2192 <code>Grafana<\/code> bu veriyi okuyup grafiklere ve panolara (dashboard) d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, e\u015fik a\u015f\u0131ld\u0131\u011f\u0131nda (\u00f6rne\u011fin CPU %90&#8217;\u0131 ge\u00e7ti\u011finde) alarm g\u00f6nderir.<\/p>\n<h2>Merkezi loglama: da\u011f\u0131n\u0131k loglar\u0131 tek yerde toplamak<\/h2>\n<p>Birden fazla sunucuda \u00e7al\u0131\u015fan container&#8217;lar\u0131n loglar\u0131n\u0131 tek tek <code>docker logs<\/code> ile takip etmek pratik de\u011fildir. Docker&#8217;\u0131n <code>logging driver<\/code> mekanizmas\u0131, log \u00e7\u0131kt\u0131s\u0131n\u0131 do\u011frudan merkezi bir sisteme y\u00f6nlendirmenizi sa\u011flar:<\/p>\n<pre><code># Container loglar\u0131n\u0131 do\u011frudan bir syslog sunucusuna y\u00f6nlendir\ndocker run -d --log-driver syslog \\\n  --log-opt syslog-address=udp:\/\/log-sunucusu:514 \\\n  benim-api:1.0<\/code><\/pre>\n<p>Daha b\u00fcy\u00fck kurulumlarda genellikle Grafana Loki, Elastic Stack (ELK) veya bulut sa\u011flay\u0131c\u0131n\u0131n kendi log servisi (CloudWatch Logs, Google Cloud Logging gibi) tercih edilir \u2014 bu ara\u00e7lar loglar\u0131 aranabilir, filtrelenebilir hale getirir ve genellikle ayn\u0131 Grafana panosunda metriklerle yan yana g\u00f6sterilebilir.<\/p>\n<h2>Basitten karma\u015f\u0131\u011fa: hangi seviyede kalmal\u0131?<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u00d6l\u00e7ek<\/th>\n<th>\u00d6nerilen yakla\u015f\u0131m<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tek sunucu, birka\u00e7 container<\/td>\n<td><code>docker stats<\/code> + <code>docker logs<\/code> + <code>HEALTHCHECK<\/code> yeterli<\/td>\n<\/tr>\n<tr>\n<td>Birka\u00e7 sunucu, orta \u00f6l\u00e7ek<\/td>\n<td>cAdvisor + Prometheus + Grafana; merkezi log toplama<\/td>\n<\/tr>\n<tr>\n<td>Kubernetes k\u00fcmesi<\/td>\n<td>Prometheus Operator + Grafana (kube-prometheus-stack), liveness\/readiness probe&#8217;lar<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Sa\u011fl\u0131kl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin oldu\u011funuz production ortam\u0131n\u0131z\u0131, farkl\u0131 donan\u0131m mimarilerinde (Intel\/AMD sunuculardan ARM tabanl\u0131 bulut \u00f6rneklerine) de ayn\u0131 imajla \u00e7al\u0131\u015ft\u0131rmak isteyebilirsiniz \u2014 bunu bir sonraki yaz\u0131da, multi-arch build ba\u015fl\u0131\u011f\u0131 alt\u0131nda ele al\u0131yoruz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>HEALTHCHECK ile sa\u011fl\u0131k kontrol\u00fcnden, cAdvisor + Prometheus + Grafana ile \u00f6l\u00e7eklenebilir izlemeye ve merkezi loglamaya kadar production container&#8217;lar\u0131n\u0131 g\u00f6zetim alt\u0131nda tutman\u0131n yollar\u0131n\u0131 anlat\u0131yoruz.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"seviye":[9],"class_list":["post-219","post","type-post","status-publish","format-standard","hentry","category-production-uygulamalar","seviye-ileri"],"_links":{"self":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/comments?post=219"}],"version-history":[{"count":1,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"predecessor-version":[{"id":578,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/219\/revisions\/578"}],"wp:attachment":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/tags?post=219"},{"taxonomy":"seviye","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/seviye?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}