Merhaba arkadaşlar, bugün sizlere Docker konteynerlerinde karşılaştığımız sorunları nasıl teşhis edip çözebileceğimizi anlatacağım. Özellikle çalışan bir konteynerin içine nasıl bağlanacağımızı (exec) ve logları nasıl etkili bir şekilde inceleyeceğimizi göreceğiz. Bu teknikler, bir servis neden başlamıyor, neden beklenen cevabı vermiyor veya performans sorunu yaşıyor gibi soruları çözmek için benim de sık sık başvurduğum temel yöntemler.
Hata Ayıklamaya Nereden Başlamalı?
İlk adım her zaman konteynerlerinizin genel durumunu kontrol etmektir. Aşağıdaki komutla çalışan tüm konteynerleri listeleyelim.
Eğer konteyneriniz listede yoksa, `docker ps -a` komutuyla durdurulmuş (exited) konteynerleri de görebilirsiniz. Sorunlu olduğunu düşündüğünüz konteynerin ID'sini veya ismini not alın.
Konteynerin İçine Bağlanma (docker exec)
Konteyner çalışıyorsa ama davranışında bir gariplik varsa, içine bağlanıp ortamı incelemek en doğru yoldur. Bunun için `docker exec` komutunu kullanıyoruz. En yaygın kullanımı, interaktif bir bash oturumu açmaktır.
Eğer konteynerde bash yüklü değilse (örn. Alpine tabanlı imajlar), `/bin/sh` deneyebilirsiniz.
Bu komutla konteynerin içindeymiş gibi komut çalıştırabilir, dosyalara bakabilir, prosesleri listeleyebilirsiniz. Örneğin, çalışan prosesleri görmek için `top` veya `ps aux` komutunu kullanın. Servisinizin çalışıp çalışmadığını kontrol edin. Benim sunucularda genelde ilk baktığım yer burası oluyor.
Logları İnceleme (docker logs)
Konteynere bağlanmak her zaman pratik olmayabilir veya sorun geçmişte olmuşsa loglara bakmak gerekir. Docker, konteynerlerin stdout/stderr çıktılarını otomatik olarak toplar ve `docker logs` komutuyla bize sunar.
Temel logları görmek için:
Logları gerçek zamanlı (tail -f gibi) takip etmek çok kullanışlıdır, özellikle bir hata anını yakalamak istediğinizde.
Son N satırı görmek için (örneğin son 100 satır):
Belirli bir zaman aralığındaki logları filtrelemek için `--since` ve `--until` flag'lerini kullanabilirsiniz. Bu, çok fazla log üreten konteynerlerde işinizi oldukça kolaylaştırır.
Dikkat Edilmesi Gerekenler
Şu ayara çok dikkat etmelisiniz: Eğer uygulamanız logları bir dosyaya yazıyorsa (örn. /var/log/myapp/app.log), `docker logs` komutu bu dosyadaki logları GÖSTERMEZ. `docker logs` sadece konteynerin 1 numaralı prosesine (PID 1) bağlı olan stdout/stderr'ı gösterir. Bu nedenle, uygulamanızın loglarını doğrudan stdout'a yönlendirdiğinizden emin olun ya da log dosyasını okumak için `docker exec` ile konteynere bağlanmanız gerekebilir.
Ayrıca, loglar disk alanınızı hızla doldurabilir. Docker'ın log sürücüsünü ve rotasyon ayarlarını (logrotate) yapılandırmayı unutmayın.
Pratik Örnek: Web Sunucusu Sorunu
Diyelim ki "webapp" isimli Nginx konteyneriniz çalışıyor ama 404 hatası alıyorsunuz. İşte adım adım yapacağımız işlemler:
1. Önce loglara hızlıca bir bakalım:
2. Loglarda net bir şey göremediysek, içine bağlanalım ve konfigürasyon dosyasını kontrol edelim:
Konteyner içinde:
3. Nginx prosesinin çalıştığından emin olalım:
Bu basit akış, sorunun kaynağını %90 ortaya çıkaracaktır.
Umarım bu rehber, Docker ortamınızda karşılaştığınız sorunları çözmenize yardımcı olur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız araçlar veya püf noktaları var mı? Ya da bu konuda sorusu olan aşağıya yazsın, bildiğim kadarıyla yardımcı olmaya çalışırım.
İlk adım her zaman konteynerlerinizin genel durumunu kontrol etmektir. Aşağıdaki komutla çalışan tüm konteynerleri listeleyelim.
Bash:
docker ps
Eğer konteyneriniz listede yoksa, `docker ps -a` komutuyla durdurulmuş (exited) konteynerleri de görebilirsiniz. Sorunlu olduğunu düşündüğünüz konteynerin ID'sini veya ismini not alın.
Konteyner çalışıyorsa ama davranışında bir gariplik varsa, içine bağlanıp ortamı incelemek en doğru yoldur. Bunun için `docker exec` komutunu kullanıyoruz. En yaygın kullanımı, interaktif bir bash oturumu açmaktır.
Bash:
docker exec -it <konteyner_adi_veya_id> /bin/bash
Eğer konteynerde bash yüklü değilse (örn. Alpine tabanlı imajlar), `/bin/sh` deneyebilirsiniz.
Bash:
docker exec -it <konteyner_adi_veya_id> /bin/sh
Bu komutla konteynerin içindeymiş gibi komut çalıştırabilir, dosyalara bakabilir, prosesleri listeleyebilirsiniz. Örneğin, çalışan prosesleri görmek için `top` veya `ps aux` komutunu kullanın. Servisinizin çalışıp çalışmadığını kontrol edin. Benim sunucularda genelde ilk baktığım yer burası oluyor.
Konteynere bağlanmak her zaman pratik olmayabilir veya sorun geçmişte olmuşsa loglara bakmak gerekir. Docker, konteynerlerin stdout/stderr çıktılarını otomatik olarak toplar ve `docker logs` komutuyla bize sunar.
Temel logları görmek için:
Bash:
docker logs <konteyner_adi_veya_id>
Logları gerçek zamanlı (tail -f gibi) takip etmek çok kullanışlıdır, özellikle bir hata anını yakalamak istediğinizde.
Bash:
docker logs -f <konteyner_adi_veya_id>
Son N satırı görmek için (örneğin son 100 satır):
Bash:
docker logs --tail 100 <konteyner_adi_veya_id>
Belirli bir zaman aralığındaki logları filtrelemek için `--since` ve `--until` flag'lerini kullanabilirsiniz. Bu, çok fazla log üreten konteynerlerde işinizi oldukça kolaylaştırır.
Şu ayara çok dikkat etmelisiniz: Eğer uygulamanız logları bir dosyaya yazıyorsa (örn. /var/log/myapp/app.log), `docker logs` komutu bu dosyadaki logları GÖSTERMEZ. `docker logs` sadece konteynerin 1 numaralı prosesine (PID 1) bağlı olan stdout/stderr'ı gösterir. Bu nedenle, uygulamanızın loglarını doğrudan stdout'a yönlendirdiğinizden emin olun ya da log dosyasını okumak için `docker exec` ile konteynere bağlanmanız gerekebilir.
Ayrıca, loglar disk alanınızı hızla doldurabilir. Docker'ın log sürücüsünü ve rotasyon ayarlarını (logrotate) yapılandırmayı unutmayın.
Diyelim ki "webapp" isimli Nginx konteyneriniz çalışıyor ama 404 hatası alıyorsunuz. İşte adım adım yapacağımız işlemler:
1. Önce loglara hızlıca bir bakalım:
Bash:
docker logs --tail 50 webapp
Bash:
docker exec -it webapp /bin/bash
Bash:
cat /etc/nginx/nginx.conf
nginx -t # Konfigürasyon testi yapalım
Bash:
ps aux | grep nginx
Bu basit akış, sorunun kaynağını %90 ortaya çıkaracaktır.
Umarım bu rehber, Docker ortamınızda karşılaştığınız sorunları çözmenize yardımcı olur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız araçlar veya püf noktaları var mı? Ya da bu konuda sorusu olan aşağıya yazsın, bildiğim kadarıyla yardımcı olmaya çalışırım.