← Blog sayfasına dön

Blog

Üretim Hazırlıklı Web Barındırma için Docker Compose'da Ustalaşmak

Bu kılavuz, uygulamalarınızı üretim ortamında dağıtmak ve yönetmek için Docker Compose'un nasıl kullanılacağını kapsar. Optimizasyondan güvenli ağ oluşturmaya kadar en iyi uygulamaları öğrenin.

Özet

Web uygulamalarını üretimde güvenilir bir şekilde dağıtmak, genellikle birbirine bağlı birden çok hizmetin yönetimini içerir. Docker Compose, basit bir YAML dosyası kullanarak karmaşık uygulamaları tanımlamanıza ve çalıştırmanıza olanak tanıyarak güçlü bir çözüm sunar. Bu makale, Docker Compose'u üretim hazırlıklı barındırma için kullanma konusunda size rehberlik eder ve izolasyon, tekrarlanabilirlik ve verimlilik için en iyi uygulamalara odaklanır. Docker dosyalarınızı optimize etmekten, kapsayıcılarınızı güvence altına almaya, sağlık kontrolleri uygulamaya ve doğru barındırma ortamını seçmeye kadar her şeyi kapsayacağız. Bu tekniklerde ustalaşarak, yaygın dağıtım zorluklarının üstesinden gelebilir ve web uygulamalarınızın sorunsuz ve güvenli bir şekilde çalışmasını sağlayabilirsiniz.

"Benim Makinemde Çalışıyor"dan Üretim Hazırlığına: Docker Compose Dağıtım Şablonunuz

Kalıcı "benim makinemde çalışıyor" sorunu, geliştiricileri hayal kırıklığı yaratan dağıtım döngülerine ve kararsız üretim ortamlarına yol açarak rahatsız eder. Konteynerleştirme teknolojisine sahip Docker, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir birimlere paketleyerek ilgi çekici bir çözüm sunar. Ancak, modern web uygulamaları nadiren tek bir bileşenden oluşur; genellikle birlikte çalışan veritabanları, önbellekler, API'ler ve ön uç hizmetleri içerirler. İşte Docker Compose'un, çoklu konteyner Docker uygulamalarını tanımlamak, düzenlemek ve yönetmek için akıcı bir yol sağlayarak parladığı yer burasıdır.

Bu kılavuz, tutarlılık, izolasyon ve verimlilik sağlayarak üretim hazırlıklı web uygulamalarını dağıtmak için Docker Compose'u kullanmanın temel adımları ve en iyi uygulamaları boyunca size yol gösterecektir. Sağlam bir üretim dağıtımının inceliklerini ele almak için temel kurulumların ötesine geçeceğiz.

Üretim İçin Docker Compose'un Gücü

Docker konteynerleri, ana bilgisayar işletim sisteminin çekirdeğini paylaşır ancak izole edilmiş kullanıcı alanlarında çalışır. Bu izolasyon, uygulamalar ve bağımlılıkları arasındaki çakışmaları önleyerek, uygulamanızın geliştirme, test ve üretim ortamlarında aynı şekilde davranmasını sağlar. Docker Compose, tüm uygulama yığınınızı - tüm hizmetlerini, ağlarını ve birimlerini - tek bir docker-compose.yml dosyasında tanımlamanıza olanak tanıyarak bunu bir adım öteye taşır.

Bu beyan yaklaşımı, üretim barındırma için birkaç önemli avantaj sunar:

  • Tekrarlanabilirlik: Uygulama yığınınızın Docker yüklü herhangi bir makinede tutarlı bir şekilde yeniden oluşturulabilmesini sağlar.
  • Basitleştirilmiş Yönetim: Birden çok konteyneri tek bir komutla (docker-compose up, docker-compose down) düzenler.
  • İzolasyon: Her hizmet kendi konteynerinde çalışır, müdahaleyi en aza indirir.
  • Verimlilik: Konteynerler, geleneksel sanal makinelerden daha hafiftir, bu da daha iyi kaynak kullanımı sağlar.

Adım 1: Yalın ve Verimli Dockerfile'lar Oluşturma

Başarılı bir Docker dağıtımının temeli, iyi optimize edilmiş Dockerfile'larda yatar. Üretim için bu, görüntü boyutunu ve derleme sürelerini en aza indirirken güvenliği ve bakımı en üst düzeye çıkarmak anlamına gelir.

  • Resmi Temel Görüntüleri Kullanın: Resmi, minimal temel görüntülerle başlayın (örneğin, Nginx, Node.js, Python'un alpine varyantları). Bunlar genellikle iyi bakımlı ve daha küçüktür.
  • Çok Aşamalı Derlemeler: Bu üretim için çok önemlidir. Uygulamanızı derlemek veya oluşturmak için bir oluşturucu aşaması kullanın, ardından yalnızca gerekli artefaktları temiz, minimal bir çalışma zamanı görüntüsüne kopyalayın. Bu, son görüntü boyutunu önemli ölçüde azaltır ve üretimde gerekmeyen derleme araçlarını kaldırır.
    # Çok aşamalı derleme ile örnek Dockerfile
    FROM node:18-alpine AS builder
    WORKDIR /app
    COPY package*.json ./ 
    RUN npm install
    COPY . .
    RUN npm run build
    
    FROM nginx:stable-alpine
    COPY --from=builder /app/build /usr/share/nginx/html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    
  • Katmanları En Aza İndirin: Bir Dockerfile'daki her komut bir katman oluşturur. Katman sayısını azaltmak için ilgili komutları && kullanarak birleştirin.
  • Temizleme: Gerekli olmayan dosyaları, paket yöneticisi önbelleklerini (örneğin, npm cache clean --force, apt-get clean) ve artık gerekmeyen geçici dosyaları temizleyin.
  • Kök Olmayan Kullanıcı: Gelişmiş güvenlik için uygulama işlemlerinizi konteyner içinde kök olmayan bir kullanıcı olarak çalıştırın. USER komutunu kullanın.

Adım 2: Üretim İçin docker-compose.yml Dosyanızı Yapılandırma

docker-compose.yml dosyanız, çoklu konteyner uygulamanızın şablonudur. Üretim için sağlam ve iyi yapılandırılmış olması gerekir.

  • Hizmetleri Açıkça Tanımlayın: Her farklı bileşen (web sunucusu, uygulama arka ucu, veritabanı, önbellek) ayrı bir hizmet olmalıdır.
    version: '3.8'
    services:
      web:
        build: .
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/conf.d/default.conf
        depends_on:
          - api
        networks:
          - app-network
    
      api:
        build: ./api
        expose:
          - "5000"
        environment:
          DATABASE_URL: postgresql://user:password@db:5432/mydatabase
        networks:
          - app-network
    
      db:
        image: postgres:14-alpine
        volumes:
          - db_data:/var/lib/postgresql/data/
        environment:
          POSTGRES_DB: mydatabase
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        networks:
          - app-network
    
    volumes:
      db_data:
    
    networks:
      app-network:
    
  • Belirli Görüntü Etiketleri Kullanın: Görüntüler için latest etiketini kullanmaktan kaçının. Tahmin edilebilir dağıtımlar sağlamak ve beklenmedik kesintili değişiklikleri önlemek için belirli sürümlere sabitleyin (örneğin, nginx:1.23.3-alpine, postgres:14.5-alpine).
  • depends_on vs. Sağlık Kontrolleri: depends_on, bir hizmetin diğerinden sonra başlamasını sağlarken, bağımlı hizmetin bağlantıları kabul etmeye hazır olduğunu garanti etmez. Diğer hizmetler bağlanmaya çalışmadan önce kritik hizmetler (veritabanları gibi) için sağlık kontrolleri uygulayın.
  • Ortam Değişkenleri: Hizmetlerinizi yapılandırmak için ortam değişkenlerini (environment anahtarı) kullanın. Bu, hassas bilgileri Dockerfile'larınızdan uzak tutar ve yapılandırmayı dinamik hale getirir. Üretim için .env dosyalarını veya daha gelişmiş sır yönetimi çözümlerini düşünün.
  • Ağ Oluşturma: Hizmetleriniz için özel ağlar (networks anahtarı) tanımlayın. Bu, daha iyi izolasyon sağlar ve hizmetlerin hizmet adlarını kullanarak iletişim kurmasına olanak tanır (örneğin, api tarafından db:5432 adresinden db'ye erişilebilir). Yalnızca ana bilgisayardan veya dış dünyadan erişilmesi gereken bağlantı noktaları için ports kullanın ve dahili bağlantı noktaları için expose kullanın.
  • Kalıcılık İçin Birimler: Veritabanları veya kullanıcı yüklemeleri gibi kalıcı veriler için adlandırılmış birimler (volumes anahtarı) kullanın. Bu, konteynerler durdurulduğunda veya yeniden oluşturulduğunda verilerin kaybolmamasını sağlar.

Adım 3: Sağlık Kontrollerini Uygulama

Üretim ortamları dayanıklılık gerektirir. Docker'ın sağlık kontrol özelliği, Docker'ın bir konteynerin sağlıklı olup olmadığını nasıl belirleyeceğini tanımlamanıza olanak tanır. Bu, düzenleme ve yük dengeleme için kritiktir.

docker-compose.yml dosyanızdaki hizmet tanımınıza bir healthcheck bölümü ekleyin:

services:
  # ... diğer hizmetler
  db:
    image: postgres:14-alpine
    # ... diğer yapılandırmalar
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s

Bu, Docker'a her 30 saniyede bir pg_isready komutunu çalıştırmasını söyler. 5 kez başarısız olursa, konteyner sağlıksız olarak işaretlenir. start_period, sağlık kontrolleri başlamadan önce konteynerin başlaması için biraz süre tanır.

Adım 4: Docker Dağıtımınızı Güvenli Hale Getirme

Üretimde güvenlik çok önemlidir. Birkaç uygulama, Docker'lı web uygulamalarınızın güvenliğini artırabilir:

  • Saldırı Yüzeyini En Aza İndirin: Minimal temel görüntüleri kullanın ve yalnızca gerekli paketleri yükleyin. Gereksiz bağlantı noktalarını ve hizmetleri kaldırın.
  • Görüntüleri Düzenli Olarak Güncelleyin: Bilinen güvenlik açıklarını gidermek için temel görüntülerinizi ve uygulama bağımlılıklarınızı güncel tutun. Mümkünse bu işlemi otomatikleştirin.
  • Görüntüleri Güvenlik Açıkları İçin Tarayın: Dağıtmadan önce görüntülerinizi bilinen güvenlik kusurları için taramak üzere Trivy veya Docker Scout gibi araçları kullanın.
  • Konteyner Ayrıcalıklarını Sınırlayın: Konteynerleri gerekli en az ayrıcalıkla çalıştırın. Mümkün olduğunda konteynerleri kök olarak çalıştırmaktan kaçının. Uygulanabilir olduğunda salt okunur kök dosya sistemleri kullanın.
  • Hassas Verileri Güvence Altına Alın: Dockerfile'larınıza veya docker-compose.yml dosyanıza asla sırları (API anahtarları, veritabanı parolaları) kodlamayın. Ortam değişkenlerini, Docker sırlarını veya özel bir sır yönetimi aracını kullanın.
  • Ağ Bölümlendirmesi: Hizmetleri izole etmek için Docker ağlarını kullanın. Yalnızca kesinlikle gerekli olan bağlantı noktalarını açın.

Adım 5: Doğru Barındırma Ortamını Seçme

Docker Compose dağıtımı basitleştirse de, altta yatan altyapı önemlidir. Üretim için şunları göz önünde bulundurun:

  • KVM Sanallaştırmalı VPS: KVM (Kernel-based Virtual Machine) sanallaştırması sunan sağlayıcılar, genellikle OpenVZ veya LXC'ye kıyasla Docker konteynerlerini çalıştırmak için daha iyi kaynak izolasyonu ve performans sağlar. Bu, konteynerlerinizin gürültülü komşulardan gereksiz yere etkilenmemesini sağlar.
  • Yönetilen Docker Barındırma: Bazı sağlayıcılar, önceden yapılandırılmış ortamlar ve konteyner düzenleme desteği sunan yönetilen Docker barındırma konusunda uzmanlaşmıştır. Bu, operasyonel yükü azaltabilir.
  • Bulut Sağlayıcıları (AWS, GCP, Azure): Bunlar, Docker için yapılandırılabilen sağlam konteyner hizmetleri (EKS, GKE, AKS gibi) ve esnek VPS seçenekleri (EC2, Compute Engine, Sanal Makineler) sunar. Ölçeklenebilirlik, güvenilirlik ve gelişmiş ağ özellikleri sağlarlar.
  • Kaynak Tahsisi: Barındırma planınızın uygulama yığınınız için yeterli CPU, RAM ve disk G/Ç sağladığından emin olun. Kaynak kullanımını yakından izleyin.

Adım 6: Üretim Hususları: İzleme, Günlük Kaydı ve Ölçeklendirme

Dağıtım sadece başlangıçtır. Üretim hazırlıklı bir uygulama için sağlam izleme, günlük kaydı ve ölçeklendirme stratejisine ihtiyacınız vardır.

  • Günlük Kaydı: Konteynerlerinizi stdout ve stderr'e günlük kaydı yapacak şekilde yapılandırın. Analiz ve hata ayıklamayı kolaylaştırmak için tüm konteynerlerinizden günlükleri toplamak üzere merkezi bir günlük kaydı çözümü (örneğin, ELK yığını, Grafana Loki, bulut sağlayıcı günlük hizmetleri) kullanın.
    services:
      # ...
      api:
        # ...
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
    
  • İzleme: Uygulama performansı izleme (APM) araçları ve altyapı izleme uygulayın. CPU/bellek kullanımı, ağ trafiği, istek gecikmesi ve hata oranları gibi temel metrikleri izleyin. Prometheus ve Grafana gibi araçlar popüler seçeneklerdir.
  • Ölçeklendirme: Durumsuz uygulamalar için ölçeklendirme genellikle hizmetinizin birden çok örneğini çalıştırmayı içerir. Docker Compose'un kendisi öncelikle tek ana bilgisayar dağıtımları içindir. Çoklu ana bilgisayar ölçeklendirme ve düzenleme için, sonunda Docker Swarm veya Kubernetes gibi araçlara bakacaksınız. Ancak, daha büyük bir küme içindeki bireysel düğümleri yönetmek için hala Docker Compose'u kullanabilirsiniz.
  • CI/CD Entegrasyonu: Kod değişikliklerinin verimli ve güvenilir bir şekilde entegre edilmesini ve dağıtılmasını sağlayan CI/CD araçlarını (örneğin, Jenkins, GitLab CI, GitHub Actions) kullanarak derleme, test ve dağıtım işlem hattınızı otomatikleştirin.

Sonuç

Docker Compose, çoklu konteyner web uygulamalarını yönetmek için vazgeçilmez bir araçtır ve dağıtım sürecini endişe kaynağı olmaktan akıcı, tekrarlanabilir bir iş akışına dönüştürür. Dockerfile optimizasyonu, docker-compose.yml yapılandırması, güvenlik, sağlık kontrolleri ve uygun barındırma seçimi konularındaki en iyi uygulamalara uyarak, üretim hazırlıklı uygulamaları güvenle oluşturabilir ve dağıtabilirsiniz. Üretimin devam eden bir süreç olduğunu unutmayın; sürekli izleme, düzenli güncellemeler ve net bir ölçeklendirme stratejisi, sağlam ve güvenilir bir web varlığını sürdürmenin anahtarıdır. Bu ilkelere bağlı kalın ve "benim makinemde çalışıyor" ikilemini kalıcı olarak aşmaya hazır olacaksınız.

Sources (5)