Docker ile Konteynerization: Modern Uygulama Dağıtımı

Docker, 2013 yılında dotCloud tarafından geliştirilen ve hızla endüstri standardı haline gelen bir konteynerizasyon platformudur. Uygulamaları ve bağımlılıklarını paketleyerek, geliştirme ortamının üretim ortamıyla aynı olmasını sağlar.

Konteyner Nedir?

Konteyner, uygulamanın ve bağımlılıklarının tek bir paket halinde çalıştırılmasıdır. Virtual Machine’den daha hafiftir ve daha hızlı başlar.

# Basit bir Node.js Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "index.js"]

Neden Docker?

Avantajlar

  • Portability: Her yerde aynı şekilde çalışır
  • Consistency: Geliştirme ortamı = üretim ortamı
  • Isolation: Uygulamalar birbirini etkilemez
  • Resource Efficiency: VM’den daha az kaynak kullanır
  • Scalability: Yatay genişleme kolaydır

“Docker, uygulamanın çalıştığı ortamdan tamamen soyutlanmasını sağlar.” - Solomon Hykes (Docker Kurucusu)

Temel Komutlar

Image Yönetimi

# Image çekme
docker pull node:18-alpine

# Image listeleme
docker images

# Image oluşturma
docker build -t benim-app:1.0 .

# Image silme
docker rmi benim-app:1.0

Container Yönetimi

# Container çalıştırma
docker run -d -p 3000:3000 --name benim-container benim-app

# Container listeleme
docker ps

# Container logları görüntüleme
docker logs benim-container

# Container içine girme
docker exec -it benim-container sh

# Container durdurma
docker stop benim-container

# Container silme
docker rm benim-container

Dockerfile

Dockerfile, image nasıl oluşturulacağını tanımlar.

# Multi-stage build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Production image
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --production
EXPOSE 3000
CMD ["node", "dist/index.js"]

Docker Compose

Docker Compose, birden fazla container’ı tanımlamanıza ve yönetmenize olanak tanır.

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/myapp
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=mysecretpassword

volumes:
  postgres_data:
# Docker Compose komutları
docker-compose up
docker-compose down
docker-compose logs -f
docker-compose ps

Best Practices

Image Boyutunu Küçültme

  • Alpine Linux kullanın
  • Multi-stage build uygulayın
  • Gereksiz dosyaları silin
  • .dockerignore kullanın
# .dockerignore
node_modules
npm-debug.log
.git
.env
test

Security

  • Güvenli base image’lar kullanın
  • Container’ı root olarak çalıştırmayın
  • Düzenli olarak image’ları güncelleyin

Production

# Production-ready Dockerfile
FROM node:18-alpine

RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

WORKDIR /app

COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production

COPY --chown=nodejs:nodejs . .

USER nodejs

EXPOSE 3000

CMD ["node", "index.js"]

Kubernetes ile Entegrasyon

Docker konteynerlerini Kubernetes ile orchestrate edebilirsiniz:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: benim-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: benim-app
  template:
    metadata:
      labels:
        app: benim-app
    spec:
      containers:
      - name: benim-app
        image: benim-app:1.0
        ports:
        - containerPort: 3000

Öğrenme Yolu

  1. Temel Docker komutları
  2. Dockerfile yazma
  3. Docker Compose kullanımı
  4. Multi-stage builds
  5. Kubernetes temelleri

Kaynaklar