Docker Kapsayıcı Sorunlarını Giderme: Kapsamlı Bir Rehber
Docker, modern yazılım geliştirme ve dağıtım süreçlerinin vazgeçilmez bir parçası haline gelmiştir. Uygulamaları kapsayıcılar içinde izole bir şekilde çalıştırma yeteneği sayesinde tutarlılık, taşınabilirlik ve verimlilik sağlar. Ancak, her teknoloji gibi Docker da zaman zaman sorunlarla karşılaşabiliriz. Bir kapsayıcının başlamaması, beklenmedik şekilde durması, ağ bağlantısı kuramaması veya performans sorunları yaşaması gibi durumlar, geliştiriciler ve sistem yöneticileri için can sıkıcı olabilir. Bu makale, Docker kapsayıcılarında ortaya çıkabilecek yaygın sorunları tanımlamanıza, teşhis etmenize ve çözmenize yardımcı olacak kapsamlı bir rehber sunmaktadır. Temel komutlardan gelişmiş hata ayıklama tekniklerine kadar birçok konuyu ele alarak, Docker ortamınızda karşılaştığınız problemleri etkili bir şekilde aşmanızı sağlayacak bilgi ve araçları sunacağız.
1. Temel Docker Komutları ve Bilgi Toplama
Sorun gidermeye başlamadan önce, Docker ortamınız hakkında temel bilgileri toplamak ve kapsayıcıların genel durumunu anlamak kritik öneme sahiptir. Doğru komutlarla başlayarak sorunun kökenine daha hızlı inebilirsiniz.
1.1. Docker Ortamının Durumunu Kontrol Etme
Docker daemon’unun çalışıp çalışmadığını kontrol etmek, sorun gidermenin ilk adımıdır. Daemon çalışmıyorsa hiçbir kapsayıcı çalışmaz. Sistem servislerini kontrol ederek durumu teyit edebilirsiniz.
sudo systemctl status docker
Eğer çalışmıyorsa, aşağıdaki komutla başlatmayı deneyebilirsiniz:
sudo systemctl start docker
1.2. Çalışan ve Durmuş Kapsayıcıları Listeleme
Hangi kapsayıcıların çalıştığını veya yakın zamanda durduğunu görmek, sorunun belirli bir kapsayıcıyla mı yoksa genel bir sistem sorunuyla mı ilgili olduğunu anlamanıza yardımcı olur. -a bayrağı, durmuş kapsayıcıları da gösterir.
docker ps # Sadece çalışan kapsayıcıları listeler
docker ps -a # Tüm kapsayıcıları (çalışan ve durmuş) listeler
Bu komutlar, kapsayıcı ID'si, imajı, komutu, oluşturulma zamanı, durumu, portları ve adı gibi önemli bilgileri sunar.
1.3. Kapsayıcı ve İmaj Bilgilerini İnceleme
Bir kapsayıcının veya imajın detaylı yapılandırmasını incelemek, özellikle ağ ayarları, volume'ler, ortam değişkenleri ve başlangıç komutları gibi bilgiler için çok değerlidir. docker inspect komutu, JSON formatında kapsamlı veri sağlar.
docker inspect
docker inspect
Bu komutun çıktısı, kapsayıcının nasıl yapılandırıldığına dair derinlemesine bilgi edinmenizi sağlar.
2. Kapsayıcı Durumu ve Log Analizi
Bir kapsayıcının neden düzgün çalışmadığını anlamanın en doğrudan yollarından biri, onun durumunu kontrol etmek ve ürettiği logları incelemektir. Loglar, genellikle hatanın kökenine dair kritik ipuçları barındırır.
2.1. Kapsayıcı Loglarını Görüntüleme
Kapsayıcılar, standart çıktı (stdout) ve standart hata (stderr) akışlarına mesajlar gönderirler. Docker, bu akışları yakalar ve log olarak saklar. Logları incelemek, uygulamanın içinde ne olup bittiğini anlamanın en hızlı yoludur.
docker logs # Tüm logları gösterir
docker logs -f # Logları canlı olarak takip eder
docker logs --tail 100 # Son 100 satırı gösterir
Uygulama hataları, yapılandırma sorunları veya bağımlılık eksiklikleri genellikle burada görünür.
2.2. Kapsayıcıyı Yeniden Başlatma ve Hata Ayıklama Modunda Çalıştırma
Bazen basit bir yeniden başlatma, geçici sorunları çözebilir. Eğer sorun devam ediyorsa, kapsayıcıyı hata ayıklama modunda veya daha fazla loglama çıktısı verecek şekilde çalıştırmak faydalı olabilir.
docker restart
Hata ayıklama modunda çalıştırmak için, genellikle uygulamanın başlangıç komutuna ek parametreler eklemek gerekir. Bu, Dockerfile'da veya docker run komutunda yapılabilir.
2.3. Kapsayıcı İçine Bağlanma (Exec)
Çalışan bir kapsayıcının içine bağlanarak, sanki bir sanal makineye SSH yapmış gibi komutlar çalıştırabilirsiniz. Bu, dosya sistemini incelemek, yapılandırma dosyalarını kontrol etmek veya bir uygulamanın durumunu manuel olarak test etmek için çok kullanışlıdır.
docker exec -it bash # Bash kabuğu ile bağlanma
docker exec -it sh # Sh kabuğu ile bağlanma (eğer bash yoksa)
Bu komutla, kapsayıcının içindeki ortamda sorun giderme yapabilirsiniz.
3. Ağ ve Bağlantı Sorunları
Docker kapsayıcılarının en yaygın sorunlarından biri ağ ile ilgilidir. Kapsayıcıların dış dünya ile veya birbirleriyle iletişim kuramaması, uygulamaların işlevselliğini doğrudan etkiler.
3.1. Port Eşleme (Port Mapping) Kontrolü
Bir kapsayıcıdaki uygulamanın dışarıdan erişilebilir olması için ana makine portları ile kapsayıcı portları arasında eşleme yapılması gerekir. Yanlış veya eksik port eşlemesi, bağlantı sorunlarına yol açar.
docker ps
Çıktıdaki "PORTS" sütununu kontrol edin. Örneğin, 0.0.0.0:8080->80/tcp, ana makinenin 8080 portunun kapsayıcının 80 portuna eşlendiğini gösterir.
docker run -p : ... komutunu doğru kullandığınızdan emin olun.
3.2. DNS Çözümleme ve Ağ Yapılandırması
Kapsayıcılar içinden internete veya diğer servislere erişimde sorun yaşıyorsanız, DNS çözümleme problemi olabilir. Kapsayıcının DNS ayarlarını docker inspect ile kontrol edebilir veya docker run komutuna --dns bayrağı ekleyerek özel DNS sunucuları belirtebilirsiniz.
docker inspect | grep "DNS"
Kapsayıcı içinde ping veya curl gibi komutlarla ağ bağlantısını test edebilirsiniz.
3.3. Docker Ağları ve Kapsayıcılar Arası İletişim
Birden fazla kapsayıcının birbirleriyle iletişim kurması gerektiğinde, özel Docker ağları (bridge, overlay) kullanmak en iyi yöntemdir. Kapsayıcıların aynı ağda olduğundan ve doğru servis adlarını kullandığından emin olun.
docker network ls # Mevcut ağları listeler
docker network inspect # Bir ağın detaylarını gösterir
docker run --network ... komutuyla kapsayıcıları belirli bir ağa bağlayabilirsiniz.
4. Depolama ve Veri Yönetimi Problemleri
Kapsayıcıların depolama alanlarıyla ilgili sorunlar, veri kaybına, performans düşüşlerine veya kapsayıcıların başlamamasına neden olabilir. Volume'ler ve bind mount'lar bu konuda dikkat edilmesi gereken ana noktalardır.
4.1. Volume ve Bind Mount Hataları
Veri kalıcılığı ve paylaşımı için Docker volume'leri veya bind mount'ları kullanılır. Yanlış yapılandırılmış bir volume veya bind mount, kapsayıcının verilere erişememesine veya yanlış verilere yazmasına neden olabilir. Dosya izinleri de önemli bir faktördür.
docker inspect | grep -A 10 "Mounts"
Bu çıktı, kapsayıcının hangi volume'leri veya bind mount'ları kullandığını ve bunların ana makinedeki karşılıklarını gösterir. İzin sorunları için ana makinedeki dosya veya dizin izinlerini kontrol edin.
4.2. Disk Alanı Tükenmesi
Docker imajları, kapsayıcı logları ve volume'ler zamanla disk alanını tüketebilir. Disk alanı tükendiğinde yeni kapsayıcılar başlayamayabilir veya mevcut kapsayıcılar hata verebilir.
docker system df -v
Bu komut, Docker'ın kullandığı disk alanını detaylı olarak gösterir. Gereksiz imajları, durmuş kapsayıcıları ve kullanılmayan volume'leri temizlemek için aşağıdaki komutları kullanabilirsiniz:
docker system prune -a
Bu komut dikkatli kullanılmalıdır, çünkü durmuş tüm kapsayıcıları, kullanılmayan tüm ağları, imajları ve build cache'i siler.
4.3. Dosya İzinleri Sorunları
Kapsayıcı içindeki bir uygulama, ana makineden bind mount edilen bir dizine yazma iznine sahip olmayabilir. Bu durum, özellikle root olmayan kullanıcılarla çalışan uygulamalarda sıkça görülür. Kapsayıcı içindeki kullanıcının UID/GID'sinin ana makinedeki dizinin izinleriyle eşleştiğinden emin olun.
docker exec -it ls -l /path/to/mounted/directory
Ana makinede dizinin izinlerini chmod ve chown ile ayarlayarak sorunu çözebilirsiniz.
5. Kaynak Tüketimi ve Performans İncelemesi
Kapsayıcılar, ana makinenin CPU, bellek ve I/O kaynaklarını kullanır. Aşırı kaynak tüketimi, kapsayıcının yavaşlamasına, yanıt vermemesine veya hatta ana makinenin genel performansını düşürmesine neden olabilir.
5.1. CPU ve Bellek Kullanımını İzleme
Bir kapsayıcının ne kadar CPU ve bellek kullandığını anlamak, performans sorunlarını teşhis etmek için önemlidir. docker stats komutu, çalışan kapsayıcıların gerçek zamanlı kaynak kullanımını gösterir.
docker stats
Bu komut, CPU yüzdesi, bellek kullanımı, ağ I/O ve disk I/O gibi metrikleri sunar. Yüksek CPU veya bellek kullanımı, uygulamanızda bir verimsizliğe veya kaynak sızıntısına işaret edebilir.
5.2. Kaynak Sınırlandırmalarını Ayarlama
Bir kapsayıcının belirli bir miktardan fazla kaynak tüketmesini önlemek için Docker'da kaynak sınırlandırmaları (CPU limitleri, bellek limitleri) belirleyebilirsiniz. Bu, bir kapsayıcının diğerlerini etkilemesini engeller.
docker run --memory="512m" --cpus="0.5" ...
Bu örnek, kapsayıcıya 512MB bellek ve bir CPU çekirdeğinin yarısını tahsis eder. Sınırların çok düşük ayarlanması da kapsayıcının performansını olumsuz etkileyebilir.
5.3. I/O Performansı ve Disk Kullanımı
Disk I/O performansı, özellikle yoğun disk işlemi yapan uygulamalar için kritik olabilir. Yavaş diskler veya yoğun I/O işlemleri, kapsayıcıların yavaş çalışmasına neden olabilir. docker stats çıktısındaki "BLOCK I/O" sütununu kontrol edin.
Eğer I/O performansı bir sorunsa, daha hızlı depolama çözümleri kullanmayı veya uygulamanın disk kullanımını optimize etmeyi düşünebilirsiniz. Ayrıca, volume'lerin doğru yapılandırıldığından emin olun.
6. Görüntü (Image) ve Yapılandırma Hataları
Bir kapsayıcının temelini oluşturan Docker imajı ve onun yapılandırması (Dockerfile, entrypoint, komutlar), sorunların önemli bir kaynağı olabilir. Yanlış bir imaj veya yapılandırma, kapsayıcının hiç başlamamasına yol açabilir.
6.1. Dockerfile ve İmaj Oluşturma Hataları
Dockerfile'daki hatalar (yanlış komutlar, eksik bağımlılıklar, hatalı yollar) imajın düzgün bir şekilde oluşturulmasını engelleyebilir veya oluşturulan imajın beklendiği gibi çalışmamasına neden olabilir. İmaj oluşturma sürecindeki logları dikkatlice inceleyin.
docker build -t myapp:latest .
Build çıktısında "ERROR" veya "FAILED" mesajlarını arayın. Her bir adımın başarılı olduğundan emin olun. İmaj oluşturulduktan sonra, docker history komutu ile imajın katmanlarını inceleyebilirsiniz.
6.2. Entrypoint ve Komut (CMD) Sorunları
Kapsayıcı başlatıldığında çalışacak olan ENTRYPOINT ve CMD komutları, uygulamanın doğru bir şekilde başlatılması için hayati öneme sahiptir. Yanlış bir komut, eksik bir bağımlılık veya hatalı bir yol, kapsayıcının hemen kapanmasına neden olabilir.
docker inspect çıktısındaki "Entrypoint" ve "Cmd" alanlarını kontrol edin. Kapsayıcıyı interaktif modda başlatıp (docker run -it bash) komutları manuel olarak çalıştırmayı deneyerek sorunu teşhis edebilirsiniz.
6.3. Ortam Değişkenleri ve Yapılandırma Dosyaları
Uygulamalar genellikle ortam değişkenleri veya yapılandırma dosyaları aracılığıyla yapılandırılır. Bu değişkenlerin veya dosyaların yanlış ayarlanması, uygulamanın hatalı çalışmasına veya hiç başlamamasına neden olabilir.
docker inspect | grep -A 10 "Env" komutuyla kapsayıcıya iletilen ortam değişkenlerini kontrol edin. Yapılandırma dosyalarının kapsayıcı içinde doğru yolda ve doğru içerikle bulunduğundan emin olmak için docker exec kullanarak kapsayıcı içine bağlanıp kontrol edin.
7. Sık Karşılaşılan Hata Mesajları ve Çözümleri
Docker ile çalışırken belirli hata mesajları sıkça karşımıza çıkar. Bu bölümde, en yaygın olanlardan bazılarına ve bunların olası çözümlerine değineceğiz.
7.1. "Error response from daemon: driver failed programming external connectivity"
Bu hata genellikle port eşleme sorunları veya ana makinede zaten kullanılan bir portu Docker'ın kullanmaya çalışması durumunda ortaya çıkar. Ağ yapılandırması veya güvenlik duvarı kuralları da bu hataya neden olabilir.
- Ana makinede portun başka bir servis tarafından kullanılıp kullanılmadığını kontrol edin (örn:
sudo netstat -tulpn | grep). - Farklı bir ana makine portu kullanmayı deneyin.
- Güvenlik duvarı kurallarınızın Docker'ın portları açmasına izin verdiğinden emin olun.
7.2. "Error: No such container" veya "No such image"
Bu hata, belirtilen kapsayıcı veya imaj adının/ID'sinin bulunamadığı anlamına gelir. Genellikle yazım hatalarından veya yanlış bir ID kullanılmasından kaynaklanır.
docker ps -aveyadocker imageskomutlarıyla doğru adı veya ID'yi doğrulayın.- Kapsayıcının veya imajın gerçekten var olup olmadığını kontrol edin.
7.3. "Cannot connect to the Docker daemon. Is the docker daemon running on this host?"
Bu, Docker daemon'unun çalışmadığı veya Docker istemcisinin daemon'a bağlanamadığı anlamına gelir. Genellikle daemon'un durması veya izin sorunları nedeniyle oluşur.
sudo systemctl status dockerile daemon'un durumunu kontrol edin.- Daemon çalışmıyorsa
sudo systemctl start dockerile başlatın. - Kullanıcınızın
dockergrubunda olduğundan emin olun (sudo usermod -aG docker $USERve yeniden oturum açın).
7.4. "Exited (137) / Exited (1)"
Bir kapsayıcının "Exited (137)" durumu genellikle bellek yetersizliği (OOM - Out Of Memory) nedeniyle işletim sistemi tarafından sonlandırıldığını gösterir. "Exited (1)" ise genellikle kapsayıcı içindeki uygulamanın kendi içinde bir hata nedeniyle sonlandığını belirtir.
- Exited (137) için: Kapsayıcıya daha fazla bellek tahsis edin (
--memorybayrağı). Uygulamanızın bellek kullanımını optimize edin. - Exited (1) için: Kapsayıcının loglarını (
docker logs) detaylıca inceleyin. Uygulama kodundaki hataları, eksik bağımlılıkları veya yanlış yapılandırmaları arayın.docker inspectileEntrypointveCmdkomutlarını kontrol edin.
Sonuç
Docker kapsayıcılarında sorun gidermek, sistem yöneticileri ve geliştiriciler için kaçınılmaz bir görevdir. Bu makalede ele aldığımız temel komutlar, log analizi, ağ, depolama, kaynak yönetimi ve imaj/yapılandırma hatalarına yönelik yaklaşımlar, sorunları etkili bir şekilde teşhis etmenize ve çözmenize yardımcı olacaktır. Unutmayın ki her sorunun kendine özgü bir çözümü olsa da, sistematik bir yaklaşım ve doğru araçları kullanmak, hata ayıklama sürecini büyük ölçüde hızlandırır. Düzenli olarak Docker ortamınızı izlemek, logları kontrol etmek ve en iyi uygulamaları takip etmek, potansiyel sorunları henüz ortaya çıkmadan önlemenize yardımcı olacaktır. Docker'ın sunduğu esneklik ve güçle birlikte, bu sorun giderme becerileri, uygulamalarınızın sorunsuz bir şekilde çalışmasını sağlamak için vazgeçilmezdir.
SSS (Sık Sorulan Sorular)
S1: Docker kapsayıcım neden anında duruyor (Exited)?
Kapsayıcınızın anında durmasının birkaç nedeni olabilir. En yaygın olanları, kapsayıcının başlangıç komutunun (ENTRYPOINT/CMD) bir hatayla karşılaşması, uygulamanın bağımlılıklarının eksik olması, bellek yetersizliği (Exited 137) veya yapılandırma sorunlarıdır. Sorunu anlamak için ilk olarak docker logs komutunu kullanarak kapsayıcının loglarını incelemelisiniz.
S2: Bir kapsayıcıya bağlanamıyorum veya dışarıdan erişemiyorum, ne yapmalıyım?
Bu genellikle ağ veya port eşleme sorunlarından kaynaklanır. İlk olarak docker ps komutuyla kapsayıcının port eşlemelerinin doğru yapıldığından emin olun (örn: 0.0.0.0:8080->80/tcp). Ana makinenin güvenlik duvarının ilgili portu engellemediğinden emin olun. Kapsayıcı içinden dışarıya erişemiyorsanız, DNS ayarlarını ve Docker ağ yapılandırmasını kontrol edin.
S3: Docker imajları ve kapsayıcıları çok fazla disk alanı kaplıyor, nasıl temizleyebilirim?
Docker'ın kullandığı disk alanını temizlemek için docker system prune komutunu kullanabilirsiniz. Bu komut, durmuş kapsayıcıları, kullanılmayan ağları ve dangling imajları siler. Daha agresif bir temizlik için docker system prune -a komutunu kullanabilirsiniz; bu, kullanılmayan tüm imajları da siler. Ancak dikkatli olun, geri dönüşü olmayan bir işlemdir.
S4: Docker kapsayıcım yavaş çalışıyor, performans sorunları yaşıyorum. Nasıl teşhis edebilirim?
Kapsayıcı performans sorunlarını teşhis etmek için docker stats komutunu kullanarak CPU, bellek ve I/O kullanımını izleyin. Yüksek CPU veya bellek kullanımı, uygulamanızda bir verimsizliğe işaret edebilir. Kapsayıcıya daha fazla kaynak (--memory, --cpus) tahsis etmeyi deneyebilir veya uygulamanızın kodunu optimize edebilirsiniz. Ayrıca, yavaş disk I/O'su da bir neden olabilir.
