Docker Nedir ve Neden Kullanmalıyız?
"Benim bilgisayarımda çalışıyor ama sunucuda çalışmıyor!" cümlesi, yazılım dünyasında çok sık duyulan bir şikâyettir. Docker, tam da bu sorunu ortadan kaldırmak için doğmuştur. Docker; uygulamalarınızı, tüm bağımlılıklarıyla birlikte bağımsız, taşınabilir paketler (konteyner) içinde çalıştırmanıza olanak tanır.
Sanal Makine vs Konteyner
Geleneksel sanal makinelerde her VM için tam bir işletim sistemi kurulumu gerekirken, Docker konteynerleri ana makinenin çekirdeğini paylaşır. Bu sayede çok daha hafif, hızlı ve verimlidirler.
| Özellik | Sanal Makine | Docker Konteyner |
|---|---|---|
| Başlangıç Süresi | Dakikalar | Saniyeler |
| Disk Boyutu | GB'larca | MB'larca |
| İzolasyon | Tam OS izolasyonu | Proses izolasyonu |
| Taşınabilirlik | Orta | Mükemmel |
Temel Docker Kavramları
- Image (Görüntü): Uygulamanızın "blueprint"i. Salt okunur bir şablon.
- Container (Konteyner): Image'ın çalışan bir örneği.
- Dockerfile: Image'ı nasıl oluşturacağınızı tanımlayan talimat dosyası.
- Docker Hub: Hazır image'ları bulabileceğiniz bulut deposu.
- Docker Compose: Birden fazla konteyneri koordineli şekilde yönetme aracı.
İlk Dockerfile'ınızı Yazın
Basit bir Node.js uygulamasını Docker ile paketleyelim:
# Temel image olarak resmi Node.js 20 Alpine kullan (en hafif versiyon)
FROM node:20-alpine
# Çalışma dizinini ayarla
WORKDIR /app
# Bağımlılık dosyalarını kopyala
COPY package*.json ./
# Bağımlılıkları yükle (sadece üretim bağımlılıkları)
RUN npm ci --only=production
# Uygulama kaynak kodunu kopyala
COPY . .
# Uygulamanın hangi portu dinlediğini belirt (dokümantasyon amaçlı)
EXPOSE 3000
# Konteyneri başlatma komutu
CMD ["node", "index.js"]
Docker Compose ile Çoklu Servis
Gerçek projelerde genellikle birden fazla servise ihtiyaç duyarsınız (uygulama sunucusu + veritabanı + cache). Docker Compose tam da bunun için var:
# docker-compose.yml
version: '3.9'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
- redis
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
Bu yapıyı docker compose up -d komutuyla ayağa kaldırdığınızda uygulamanız, PostgreSQL veritabanınız ve Redis cache'iniz tek seferde çalışmaya başlar.
Docker Desktop'u yükledikten sonra docker run hello-world komutuyla kurulumunuzu test edebilirsiniz. Her şey yolundaysa "Hello from Docker!" mesajı görürsünüz.
