← Kursa Dön
📄 Text · 30 min

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 bash

docker 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" durumunda

Bu 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 dakika

docker 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-stream

docker 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.123456789Z

docker 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 process

Container İç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 whoami

exec 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önder

docker 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 sil

Toplu 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 kodu

Yaygı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 et

docker 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 eder

Container 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.json

docker 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 logs ile izle, docker exec ile içine gir.

  • docker stop SIGTERM gönderir (nazik), docker kill SIGKILL (zorla). 10 saniye timeout.

  • Restart policy ile otomatik recovery: unless-stopped production için ideal.

  • Exit code 137 = OOM/kill, 143 = graceful stop. Exit code ile root cause analizi yap.

  • Container dosya sistemi geçici — docker cp ile dosya taşı ama kalıcı veri için volume kullan.

Bir sonraki derste container'lar arası ağ bağlantılarını öğreneceğiz.