Docker, uygulamaları container'lar (kapsayıcılar) içinde paketleyip çalıştırmayı sağlayan açık kaynaklı bir platformdur. "Benim bilgisayarımda çalışıyor" sorununu ortadan kaldırır — çünkü container, uygulamanın ihtiyaç duyduğu her şeyi (kod, runtime, kütüphaneler, sistem araçları) içerir ve her ortamda aynı şekilde çalışır.
Container vs Sanal Makine (VM)
Container'lar ve sanal makineler farklı soyutlama seviyelerinde çalışır:
- Sanal Makine: Tam bir işletim sistemi çalıştırır. Hypervisor üzerinde konuk OS + uygulama bulunur. GB düzeyinde bellek tüketir, dakikalar içinde başlar
- Container: Ana makine çekirdeğini paylaşır. Sadece uygulama ve bağımlılıkları içerir. MB düzeyinde, saniyeler içinde başlar
Container'lar daha hafif, hızlı ve kaynak açısından verimlidir. Ancak sanal makineler güçlü izolasyon gerektiren durumlarda hâlâ tercih edilir.
Temel Docker Kavramları
- Image (Görüntü): Container'ın şablonu. Salt okunurdur. Katmanlı (layered) dosya sistemi kullanır
- Container: Image'ın çalışan bir örneği. Yazılabilir bir katman eklenir
- Dockerfile: Image oluşturma talimatlarını içeren metin dosyası
- Registry: Image'ların depolandığı yer (Docker Hub, GitHub Container Registry vb.)
Dockerfile Anatomisi
Dockerfile, bir image'ın nasıl oluşturulacağını adım adım tanımlar:
# Temel image
FROM node:20-alpine
# Çalışma dizini
WORKDIR /app
# Bağımlılık dosyalarını kopyala
COPY package.json package-lock.json ./
# Bağımlılıkları yükle
RUN npm ci --only=production
# Uygulama kodunu kopyala
COPY . .
# Portu belirt
EXPOSE 3000
# Uygulamayı başlat
CMD ["node", "server.js"]
Önemli Dockerfile Talimatları
FROM— temel image'ı belirler (her Dockerfile FROM ile başlamalı)WORKDIR— sonraki komutların çalışacağı dizinCOPY— dosyaları ana makineden image'a kopyalarRUN— image oluşturma sırasında komut çalıştırırEXPOSE— container'ın dinleyeceği portu belirtir (dokümantasyon amaçlı)CMD— container başlatıldığında çalışacak varsayılan komutu tanımlarENV— ortam değişkeni tanımlar
Temel Docker Komutları
# Image oluştur
docker build -t myapp:1.0 .
# Container başlat
docker run -d -p 3000:3000 --name myapp myapp:1.0
# Çalışan container'ları listele
docker ps
# Tüm container'ları listele (durmuş dahil)
docker ps -a
# Container loglarını gör
docker logs myapp
# Container'a bağlan
docker exec -it myapp sh
# Container'ı durdur ve sil
docker stop myapp
docker rm myapp
# Image'ları listele
docker images
# Image sil
docker rmi myapp:1.0
Docker Compose
Docker Compose, birden fazla container'ı tek bir YAML dosyasında tanımlayıp yönetmenizi sağlar. Çoklu servis mimarileri için idealdir:
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
volumes:
- ./src:/app/src
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
pgdata:
# Tüm servisleri başlat
docker compose up -d
# Logları takip et
docker compose logs -f
# Servisleri durdur
docker compose down
# Servisleri durdur ve volume'ları sil
docker compose down -v
Volumes (Kalıcı Veri)
Container'lar silindiğinde içindeki veriler kaybolur. Kalıcı veri için volume kullanılır:
# Named volume (Docker yönetir)
docker run -v pgdata:/var/lib/postgresql/data postgres
# Bind mount (ana makine dizinini bağla)
docker run -v $(pwd)/src:/app/src myapp
# Sadece okunur bağlama
docker run -v $(pwd)/config:/app/config:ro myapp
Networking
Docker container'lar arası iletişim için ağ altyapısı sağlar:
- bridge: Varsayılan ağ. Aynı host üzerindeki container'lar iletişim kurabilir
- host: Container, host'un ağını doğrudan kullanır
- none: Ağ bağlantısı yok
Docker Compose'da tanımlanan servisler otomatik olarak aynı ağa eklenir ve birbirlerini servis adıyla (hostname olarak) bulabilir.
En İyi Uygulamalar
- Alpine tabanlı küçük base image'lar tercih edin
.dockerignoredosyası ile gereksiz dosyaları hariç tutun- Katman önbelleğinden yararlanın — sık değişen dosyaları Dockerfile'ın sonuna koyun
- Container'da root kullanıcı yerine özel bir kullanıcı oluşturun
- Multi-stage build ile üretim image boyutunu küçültün
Docker Compose dosyanızı kolayca oluşturmak mı istiyorsunuz? SiteScripti'nin Docker Compose Oluşturucu aracıyla popüler servis yapılandırmalarını birkaç tıkla hazırlayabilirsiniz.
Bu konuyla ilgili araçlarımızı da deneyin: Docker Compose Oluşturucu, ENV Generator, cURL Builder