Konuyu Açan #1
SQL Docker Compose ile MySQL Yapılandırması

Bu yazı, Docker Compose kullanarak MySQL’i güvenli ve sürdürülebilir bir şekilde nasıl yapılandırabileceğinizi adım adım ele alır. Sık karşılaşılan konfigürasyon problemlerini, veri kalıcılığı, ağ izolasyonu ve temel güvenlik önlemleriyle birlikte açıklamaya odaklanır.


Bir konteyner ortamında MySQL çalıştırmak, yalnızca bir image çekip çalıştırmaktan ibaret değildir. Uygulamanın üretim düzeyinde çalışması için kalıcı veri, uygun ağ politikaları ve yeniden başlatma stratejileri gerekir. Aşağıda, tipik bir geliştirme ve basit üretim çekirdeğini kapsayan bir Docker Compose yapılandırması ve üzerinden dikkat edilmesi gereken noktaları bulacaksınız.

  • Veri kalıcılığı: Veritabanı klasörü için bir volüm tanımlayın ve host makinaya bağlayın. Bu sayede konteyner yeniden başlatılsa bile veriler korunur. Örnek hedef yol: ./mysql_data.
  • Güvenli konfigürasyon: MySQL için kök kullanıcı şifresi ve temel güvenlik ayarlarını environment değişkenleriyle belirtin. Karmaşık bir parola kullanın; üretimde .env dosyası ile gizli bilgiyi yönetin.
  • Ağ ve izolasyon: Sadece gerekli hizmetler için özel bir ağ tanımlayın. Böylece MySQL’a yalnızca belirli uygulamalar bağlanabilir.
  • Yedekleme stratejisi: Veritabanı dump’lerini belirli aralıklarla almak üzere ayrı bir iş akışı veya zamanlanmış görev ekleyin.
  • Back-end entegrasyonu: Uygulama servisinizin MySQL’e erişimini DB_HOST, DB_PORT, DB_USER, DB_PASSWORD gibi değişkenlerle sağlayın ve bağlantı havuzlamasına dikkat edin.


Örnek basit bir docker-compose.yml şu kapsamı gösterir (gerçek üretimde şifreleri güvenli bir şekilde yönetin):

KOD
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
version: '3.8'
services:
  mysql:
    image: mysql:8.0
    container_name: my_mysql
    environment:
      MYSQL_ROOT_PASSWORD: yourStrongRootPass
      MYSQL_DATABASE: appdb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    volumes:
[list]
[*]./mysql_data:/var/lib/mysql
[/list]
    ports:
[list]
[*]"3306:3306"
[/list]
    networks:
[list]
[*]appnet
[/list]
    restart: unless-stopped

  app:
    image: your-app-image
    container_name: app
    environment:
      DB_HOST: mysql
      DB_PORT: 3306
      DB_DATABASE: appdb
      DB_USER: appuser
      DB_PASSWORD: apppass
    depends_on:
[list]
[*]mysql
[/list]
    networks:
[list]
[*]appnet
[/list]
    restart: unless-stopped

networks:
  appnet:
    driver: bridge


Bu yapılandırmada dikkat edilmesi gereken noktalar:
  • Verilerinizin sürekliliği için MySQL konteyneri, ./mysql_data klasörünü /var/lib/mysql olarak kullanır. Bu, konteyner silinse bile verinin host tarafında kalmasını sağlar.
  • Root hesabı ve ek kullanıcılar için parolaları güvenli şekilde yönetin; doğrudan yaml içine yazmak yerine .env üzerinden alınması daha güvenlidir.
  • app servisi, mysql servisine bağımlı olarak çalışır; böylece MySQL başlatılmadan uygulama başlamaya çalışmaz.
  • Ağ izolasyonu önemli: yalnızca gerekli servisler aynı özel ağa bağlandığı için dışarıdan doğrudan erişim sınırlı olur.


Güvenlik ve sürdürülebilirlik açısından ek öneriler:
  • MySQL konfigürasyonunu özel bir my.cnf dosyasında belirleyin ve container ile paylaşın.
  • Üretimde TLS ile bağlantıyı zorunlu kılmayı düşünün; bu, istemci ile sunucu arasındaki veriyi şifreler.
  • Yedeklemeler için volume snapshot veya düzenli dump mekanizmalarını planlayın; restore senaryolarını da test edin.
  • Çevre değişkenlerini CI/CD süreçlerinde güvenli şekilde yönetin; sadece gerekli yetkide erişim verin.


Bu yapılandırmayı kendi proje gereksinimlerinizle nasıl uyarladığınızı ve hangi güvenlik adımlarını eklemek istediğinizi paylaşabilir misiniz? Özellikle hangi senaryolarda veritabanı güvenliği ve yedekleme stratejileri üzerinde durmak istersiniz?

Yanıt vermek için giriş yapmış olmalısınız.

Bu konuyu görüntüleyen kullanıcılar (Toplam: 2, Üyeler: 2, Misafirler: 0)
Toplam: 2 (üyeler: 2, misafirler: 0)
0 alıntı seçildi