Docker ve Containerization: Temel Kavramlar ve Kullanım
Docker, uygulamaları container'lar içinde paketleyerek tutarlı ve taşınabilir dağıtım sağlar. Bu rehberde Docker temellerini, Dockerfile yazımını ve container yönetimi anlatıyoruz.
Son güncelleme:Docker Nedir?
Docker, uygulamaları ve bağımlılıklarını container'lar içinde paketleyen bir platformdur. Container'lar, hafif ve izole edilmiş çalışma ortamlarıdır.
VM vs Container: Virtual Machine'ler tam bir işletim sistemi çalıştırır (GB'larca). Container'lar host OS kernel'ini paylaşır ve MB'larca yer kaplar.
Tutarlılık: 'Benim makinemde çalışıyor' sorununu çözer. Geliştirme, test ve production ortamları aynı container'ı kullanır.
Taşınabilirlik: Container'lar herhangi bir Docker destekleyen platformda (Linux, Windows, Mac, cloud) çalışır.
Docker Temel Kavramları
Image: Container'ın şablonu. Read-only katmanlar (layers) halinde saklanır. Dockerfile'dan build edilir.
Container: Image'in çalışan örneği (instance). Her container izole bir process olarak çalışır.
Dockerfile: Image'i nasıl build edeceğinizi tanımlayan metin dosyası. FROM, RUN, COPY, CMD gibi instruction'lar içerir.
Registry: Image'leri saklayan ve dağıtan repository. Docker Hub en popüler public registry'dir.
Volume: Container verilerini kalıcı olarak saklamak için kullanılan storage. Container silinse bile veri korunur.
Dockerfile Yazımı
FROM node:18-alpine: Temel image olarak Node.js 18 (Alpine Linux) kullanın. Alpine, küçük boyutlu base image'dir.
WORKDIR /app: Çalışma dizinini /app olarak ayarlayın. Tüm sonraki komutlar bu dizinde çalışır.
COPY package*.json ./: package.json ve package-lock.json'ı kopyalayın. RUN npm install ile bağımlılıkları yükleyin.
COPY . .: Tüm kaynak kodu kopyalayın. RUN npm run build ile production build oluşturun.
EXPOSE 3000: Container'ın 3000 portunu dinlediğini belirtin. CMD ["npm", "start"] ile container başladığında çalışacak komutu tanımlayın.
Temel Docker Komutları
docker build -t myapp:1.0 .: Dockerfile'dan image build edin. -t ile image'e tag (isim:versiyon) verin.
docker run -p 3000:3000 myapp:1.0: Container çalıştırın. -p ile host portunu container portuna map edin.
docker ps: Çalışan container'ları listele. docker ps -a: Tüm container'ları (durmuş olanlar dahil) listele.
docker stop <container_id>: Container'ı durdurun. docker rm <container_id>: Container'ı silin.
docker images: Lokal image'leri listele. docker rmi <image_id>: Image'i silin.
Docker Compose
Docker Compose, çoklu container uygulamalarını tanımlamak ve yönetmek için kullanılan bir araçtır. docker-compose.yml dosyası ile yapılandırılır.
Servisler: Her servis bir container'dır. web (frontend), api (backend), db (veritabanı) gibi servisler tanımlanır.
Volumes: Veri kalıcılığı için volume'lar tanımlanır. networks: Servisler arası iletişim için network'ler oluşturulur.
docker compose up: Tüm servisleri başlatın. docker compose down: Tüm servisleri durdurun ve kaldırın.
docker compose up -d: Arka planda (detached mode) çalıştırın. docker compose logs -f: Log'ları takip edin.
Best Practices
Küçük image'ler: Alpine veya distroless base image kullanın. Multi-stage build ile build bağımlılıklarını final image'dan çıkarın.
Layer caching: Sık değişmeyen katmanları (bağımlılıklar) önce, sık değişen katmanları (kod) sonra COPY edin. Bu, build cache'i optimize eder.
.dockerignore: Gereksiz dosyaları (node_modules, .git, logs) ignore edin. Bu, build context'i küçültür.
Security: Root user yerine non-root user kullanın. RUN adduser --disabled-password appuser ile kullanıcı oluşturun.
Health check: HEALTHCHECK instruction ile container sağlık kontrolü yapın. Docker, unhealthy container'ları otomatik olarak yeniden başlatır.