Container Lifecycle — create, start, stop, restart, rm
İlk üç bölümde image ve Dockerfile dünyasını öğrendik. Şimdi container'ların kendisine odaklanacağız. Bir container nasıl doğar, nasıl yaşar, nasıl ölür? Hangi durumlardan (state) geçer? Onu nasıl izler, durdurur ve yeniden başlatırız?
Bir container'ı canlı bir organizma gibi düşün. Doğar (create), hayata başlar (start), aktif olarak çalışır (running), gerektiğinde uyutulabilir (pause), durdurulabilir (stop), ve sonunda ölebilir (remove). Bu yaşam döngüsünü anlamak, container'ları etkili yönetmenin temelidir.
Container Durumları (States)
Bir container şu durumlardan birinde olabilir:
Created — Container oluşturuldu ama henüz başlamadı. Tüm yapılandırma hazır, process henüz çalışmıyor.
Running — Ana process (PID 1) aktif olarak çalışıyor. Container iş yapıyor.
Paused — Tüm process'ler donduruldu (SIGSTOP). Bellek durumu korunuyor ama CPU kullanmıyor.
Exited — Ana process sona erdi. Container dosya sistemi hâlâ mevcut ama hiçbir process çalışmıyor.
Restarting — Container yeniden başlatılıyor. Restart policy tarafından tetiklenmiş olabilir.
Removing — Container siliniyor.
Dead — Container silinmeye çalışıldı ama başarısız oldu (genellikle kaynak sorunu).
create start pause
[Created] ──→ [Running] ──→ [Paused]
│ ↑ │
│ └─────────┘ unpause
│ stop/kill
↓
[Exited] ──→ [Removing] ──→ (yok)
↑ remove
│ restart
↓
[Restarting]Container Oluşturma ve Başlatma
docker run — Hepsi Bir Arada
docker run aslında iki komutu birleştiriyor: docker create + docker start. Çoğu zaman doğrudan run kullanırız:
# Ön planda çalıştır (logları görürsün, Ctrl+C ile durdurursun)
docker run --name web nginx:1.25-alpine
# Arka planda çalıştır (detached mode)
docker run -d --name web nginx:1.25-alpine
# İnteraktif mod (shell açmak için)
docker run -it --name test ubuntu:22.04 bashdocker create + docker start — Ayrı Ayrı
Bazen container'ı oluşturup daha sonra başlatmak isteyebilirsin:
# Sadece oluştur (process başlamaz)
docker create --name web -p 80:80 nginx:1.25-alpine
# Container "Created" durumunda
docker start web
# Şimdi "Running" durumundaBu pattern, container yapılandırmasını önceden hazırlayıp, uygun zamanda başlatmak istediğinde kullanışlı.
Container'ı İzleme
docker ps — Çalışan Container'lar
# Çalışan container'lar
docker ps
# Tüm container'lar (durmuş olanlar dahil)
docker ps -a
# Sadece ID'ler
docker ps -q
# Özel format
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"docker logs — Container Logları
# Tüm loglar
docker logs web
# Son 50 satır
docker logs --tail 50 web
# Canlı takip (tail -f gibi)
docker logs -f web
# Zaman damgalı
docker logs -t web
# Belirli zamandan itibaren
docker logs --since 2024-01-15T10:00:00 web
docker logs --since 30m web # Son 30 dakikadocker stats — Canlı Kaynak Kullanımı
docker stats
# CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
# web 0.50% 25MiB / 1.94GiB 1.26% 5kB / 2kB 0B / 0B
# db 2.30% 180MiB / 1.94GiB 9.06% 15kB / 8kB 50MB / 20MB
# Tek container
docker stats web
# Anlık görüntü (stream değil)
docker stats --no-streamdocker inspect — Detaylı Bilgi
# Tüm bilgi (JSON)
docker inspect web
# Belirli bilgi
docker inspect --format '{{.State.Status}}' web
# running
docker inspect --format '{{.NetworkSettings.IPAddress}}' web
# 172.17.0.2
docker inspect --format '{{.State.StartedAt}}' web
# 2024-01-15T10:30:00.123456789Zdocker top — Container İçindeki Process'ler
docker top web
# UID PID PPID CMD
# root 1234 1233 nginx: master process
# nginx 1235 1234 nginx: worker process
# nginx 1236 1234 nginx: worker processContainer İçine Girmek
Çalışan bir container'a bağlanmanın iki yolu var:
docker exec — Yeni Process Çalıştır
# Shell aç
docker exec -it web sh
docker exec -it web bash # bash varsa
# Tek komut çalıştır
docker exec web cat /etc/nginx/nginx.conf
docker exec web ls -la /app
# Farklı kullanıcı ile
docker exec -u root web whoamiexec yeni bir process başlatır — ana process'i etkilemez. Debug ve yönetim için kullan.
docker attach — Ana Process'e Bağlan
docker attach web
# Ana process'in stdout/stderr'ine bağlanırsın
# Ctrl+P, Ctrl+Q ile çıkarsın (container durmaz)
# Ctrl+C ile çıkarsan container durabilir!attach mevcut process'e bağlanır. exec kadar güvenli değil — genellikle exec tercih et.
Container Durdurma ve Silme
docker stop — Nazik Durdurma
docker stop web
# 1. SIGTERM gönderir (nazik: "lütfen kapat")
# 2. 10 saniye bekler
# 3. Hâlâ çalışıyorsa SIGKILL gönderir (zorla: "kapandın!")
# Bekleme süresini ayarla
docker stop -t 30 web # 30 saniye bekle
docker stop -t 0 web # Hemen SIGKILL (stop = kill)Bu yüzden exec form CMD önemli! Shell form'da SIGTERM ulaşmaz, 10 saniye boşa beklenir.
docker kill — Zorla Durdurma
docker kill web # SIGKILL — anında öldür
docker kill -s SIGUSR1 web # Özel sinyal gönderdocker rm — Container'ı Sil
docker rm web # Durmuş container'ı sil
docker rm -f web # Çalışan container'ı zorla sil (stop + rm)
docker rm -v web # Anonymous volume'ları da silToplu Temizlik
# Durmuş tüm container'ları sil
docker container prune
# WARNING! This will remove all stopped containers.
# Filtreyle sil
docker container prune --filter "until=24h" # 24 saatten eski
docker container prune --filter "label=temp" # "temp" label'lı
# Tüm container'ları durdur
docker stop $(docker ps -q)
# Tüm container'ları sil
docker rm -f $(docker ps -aq)Restart Policy — Otomatik Yeniden Başlatma
Container çöktüğünde ne olsun? Restart policy bunu belirler.
# Hiçbir zaman yeniden başlatma (varsayılan)
docker run --restart=no myapp
# Hata durumunda yeniden başlat (max 5 deneme)
docker run --restart=on-failure:5 myapp
# Her zaman yeniden başlat (docker stop hariç)
docker run --restart=unless-stopped myapp
# Kesinlikle her zaman (Docker daemon restart dahil)
docker run --restart=always myapp`unless-stopped` vs `always`: Docker daemon yeniden başladığında always container'ı otomatik başlatır, unless-stopped ise sen durdurup daemon restart olduysa başlatmaz. Production'da genellikle unless-stopped kullanılır.
Restart Davranışını İzleme
docker inspect --format '{{.RestartCount}}' web
# 3
docker inspect --format '{{.State.StartedAt}}' web
# Son başlama zamanıExit Code'lar
Container'ın ana process'i sonlandığında bir exit code döner. Bu code, container'ın neden durduğunu anlamak için kritik:
docker run --rm alpine echo "hello"
echo $? # 0 — başarılı
docker run --rm alpine cat /nonexistent
echo $? # 1 — hata
docker run --rm alpine sh -c "exit 42"
echo $? # 42 — özel hata koduYaygın exit code'lar: 0 başarılı, 1 genel hata, 137 SIGKILL (OOM killer veya docker kill), 143 SIGTERM (docker stop), 126 izin hatası, 127 komut bulunamadı.
# Exit code kontrol
docker inspect --format '{{.State.ExitCode}}' web
# 137 → OOM killer mı? Bellek limitini kontrol etdocker pause / unpause
Container'ı dondurmak istiyorsan — process'ler askıya alınır ama bellek durumu korunur:
docker pause web
docker ps
# STATUS: Up 5 minutes (Paused)
docker unpause web
# Kaldığı yerden devam ederContainer Dosya Sistemi
docker cp — Dosya Kopyalama
# Container'dan host'a
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
# Host'tan container'a
docker cp ./config.json web:/app/config.jsondocker diff — Değişiklikleri Gör
docker diff web
# C /var (Changed)
# A /var/log/app (Added)
# D /tmp/old (Deleted)docker commit — Container'dan Image Oluştur
docker commit web my-custom-nginx:v1⚠️ Bunu production'da kullanma! Her zaman Dockerfile ile image oluştur — tekrarlanabilir, version-controlled.
Bu Derste Ne Öğrendik?
Container yaşam döngüsü: Created → Running → Paused/Exited → Removing.
docker run=create+start.docker logsile izle,docker execile içine gir.docker stopSIGTERM gönderir (nazik),docker killSIGKILL (zorla). 10 saniye timeout.Restart policy ile otomatik recovery:
unless-stoppedproduction için ideal.Exit code 137 = OOM/kill, 143 = graceful stop. Exit code ile root cause analizi yap.
Container dosya sistemi geçici —
docker cpile dosya taşı ama kalıcı veri için volume kullan.
Bir sonraki derste container'lar arası ağ bağlantılarını öğreneceğiz.
AI Asistan
Sorularını yanıtlamaya hazır