İçeriğe geç

Docker konteyneri hemen kapanıyor: nedeni nasıl bulunur ve düzeltilir

Orta 15 dk Güncellendi:

Kısa cevap

Bir Docker konteyneri hemen kapandığında önce `docker logs` ve çıkış kodunu kontrol edin. En yaygın nedenler yanlış başlatma komutu, hemen sonlanan uygulama, eksik yapılandırma veya izin ve ön planda çalışacak bir şeyi olmayan konteynerdir. Komutu veya entrypoint'i düzeltin ve hatayı görmek için konteyneri etkileşimli olarak başlatın.

Sorun nasıl anlaşılır

  • `docker ps` konteyneri göstermiyor, ancak `docker ps -a` onu Exited olarak listeliyor
  • Konteyner başlatılıyor ve saniyeler içinde kayboluyor
  • Günlüklerde hiçbir şey yok veya yalnızca başlangıçta bir hata mesajı var
  • Uygulama yerel olarak çalışıyor, ancak konteynerde hemen çıkıyor
  • Çıkış kodu 0, 1, 127 veya 137

En yaygın nedenler

Yanlış başlatma komutu veya entrypoint

Dockerfile'da veya `docker run` komutunda var olmayan bir komut belirtilmişse konteyner 127 koduyla çıkar. Yürütülebilir dosyanın yolu doğru mu ve komut Docker'ın beklediği biçimde mi kontrol edin.

Uygulama hemen sonlanıyor

Konteyner, ana süreç çalıştığı sürece yaşar. Uygulama yalnızca bir iş yapıp sonlanıyorsa veya arka planda başlatılmışsa konteyner kapanır. Ana sürecin ön planda kalması gerekir.

Eksik yapılandırma veya izin

Uygulama ortam değişkenleri, yapılandırma dosyası veya yazma izni yoksa çökebilir. Günlüklerde genellikle başlangıçta bir hata görülür, örneğin veritabanına erişilemiyor veya dosya yok.

Bağlantı noktası veya kaynaklar

Bağlantı noktası kullanımdaysa başlatma, bağlantı noktasının zaten kullanımda olduğu mesajıyla başarısız olabilir. Yeterli bellek yoksa veya süreç sınırlar nedeniyle sonlandırıldıysa konteyner çıkabilir.

Servisler arası bağımlılık

Docker Compose ortamında, bağımlı olduğu servis hazır değilse konteyner başlamayabilir veya çıkabilir. `depends_on` içindeki sırayı ve koşulları kontrol edin, bağımlı servisin gerçekten hazır olup olmadığını doğrulamak için healthcheck kullanın.

Adım adım çözüm

  1. 1

    Durumu ve çıkış kodunu kontrol edin

    Tüm konteynerleri, kapanmış olanlar dahil görmek için docker ps -a çalıştırın. STATUS sütununa ve çıkış koduna dikkat edin. 0 kodu sürecin normal sonlandığını, 1 genel bir hatayı, 127 var olmayan bir komutu, 137 ise genellikle bellek nedeniyle zorla durdurulduğunu gösterir.

  2. 2

    Günlükleri inceleyin

    docker logs <ad_veya_id> çalıştırın. Konteyner kapalıysa son yüz satırı görmek için --tail 100 ekleyin. Günlükler genellikle tam nedeni içerir, örneğin yapılandırma hatası veya komutun bulunamadığı mesajı.

  3. 3

    Konteyneri etkileşimli olarak başlatın

    Başlatma komutunu atlayıp kabuğa girin: docker run -it --entrypoint /bin/sh <imaj>. İmajda sh yoksa bash deneyin. Konteyner içinde uygulamayı elle çalıştırın ve normalde görmediğiniz hatayı görün.

  4. 4

    Komutu ve entrypoint'i kontrol edin

    Dockerfile'a ve docker run komutuna bakın. CMD veya ENTRYPOINT'in doğru biçimde olduğundan ve yürütülebilir dosyanın yolunun var olduğundan emin olun. docker compose kullanıyorsanız docker-compose.yml içindeki command alanını kontrol edin.

  5. 5

    Ana sürecin ön planda kaldığından emin olun

    Uygulama arka planda başlatılmamalı veya hemen sonlanmamalıdır. Bir betikse sonuna bir döngü ekleyin veya dinleyen bir sunucu başlatın. Yalnızca etkin kalması gereken konteynerler için geçici çözüm olarak tail -f /dev/null kullanın.

  6. 6

    Ortam değişkenlerini ve yapılandırmayı kontrol edin

    docker inspect <konteyner> çıktısını uygulamanın beklediğiyle karşılaştırın. Eksik değişkenleri -e ile veya environment bölümünde ekleyin. Yapılandırma dosyalarının doğru yola bağlandığından da emin olun.

  7. 7

    İzinleri ve sahipliği kontrol edin

    Uygulama bir birime veya klasöre yazıyorsa konteyner içindeki kullanıcının izni olduğundan emin olun. docker run komutuna --user ekleyin veya Dockerfile'ı uyarlayın. İzin hataları günlüklerde genellikle Permission denied olarak görülür.

  8. 8

    Healthcheck ve bağımlılıkları devre dışı bırakın

    Compose kullanıyorsanız konteynerin tek başına çalışıp çalışmadığını görmek için healthcheck ve depends_on satırlarını geçici olarak yorum satırı yapın. Ardından bunları tek tek geri açın ve davranışı izleyin.

  9. 9

    İmajı yeniden oluşturun

    Dockerfile'ı değiştirdiyseniz docker build --no-cache -t <ad> . çalıştırın ve konteyneri yeniden başlatın. Önbelleğe alınmış bir katman, sorunun nedeni olan değişikliği gizleyebilir.

Hiçbir şey yardımcı olmazsa

Uygulamanın daha ayrıntılı günlük kaydını açın ve çıktıyı canlı görmek için -d olmadan docker run ile başlatın. Konteynerin docker inspect içindeki State.OOMKilled alanı nedeniyle kapanıp kapanmadığını kontrol edin. Kubernetes veya başka bir orkestratör kullanıyorsanız olaylara ve yeniden başlatma sayısına bakın. Sorun uygulamanın kendisindeyse Docker'ı izole etmek için aynı ortam değişkenleriyle konteyner dışında çalıştırın. Birden çok servis içeren karmaşık durumlar için yalnızca bir servis içeren minimal bir docker-compose.yml oluşturup diğerlerini kademeli olarak eklemek yararlı olur.

Tekrarlanmaması için

  • Herhangi bir şeyi değiştirmeden önce her zaman `docker logs` ve çıkış kodunu kullanın.
  • Dockerfile'da `CMD` veya `ENTRYPOINT`'i açıkça belirtin ve yerel olarak test edin.
  • Durdurulmuş konteynerleri, kullanılmayan ağları ve başıboş imajları zaman zaman `docker system prune` komutuyla temizleyin; başlatmadan önce nelerin kaldırılacağını kontrol edin ve önemli verilerin yedeğini alın.
  • Sürekli çalışması gereken servisler için Compose dosyasında healthcheck ve `restart: unless-stopped` tanımlayın.

Ne zaman uzmana başvurmalı

Tüm adımları denediyseniz ve konteyner hala net bir neden olmadan çıkıyorsa veya sorun birden çok servisi ve üretim ortamını kapsıyorsa, yapılandırmayı ve günlükleri birlikte analiz etmek için IT desteğine başvurun.

Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVP

Sık sorulan sorular

Konteyner neden 0 çıkış koduyla kapanıyor?

0 çıkış kodu ana sürecin başarıyla sonlandığını gösterir, ancak bu konteynerin artık yapacak bir işi olmadığı anlamına da gelir. Çoğunlukla uygulama arka planda başlatılmıştır veya hemen sonlanmıştır. Çözüm, ana sürecin ön planda kalmasını sağlamaktır.

Günlüklerde görünmeyen hatayı nasıl görebilirim?

Konteyneri `docker run -it --entrypoint /bin/sh <imaj>` ile etkileşimli olarak başlatın ve uygulamayı elle çalıştırın. Böylece çıktıyı canlı görürsünüz. Ayrıca konteyneri geçici olarak `sleep 3600` komutuyla (gerekirse `--entrypoint` ile) başlatıp içine girerek test edebilirsiniz.

137 çıkış kodu ne anlama gelir?

137 kodu genellikle sürecin zorla kesildiğini, çoğunlukla bellek yetersizliği (OOM) nedeniyle olduğunu gösterir. `docker inspect` ve `State.OOMKilled` alanını kontrol edin. Belleği artırın veya uygulamayı optimize edin.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun