Yükleniyor...

Docker vs. Alternatifler: AI/ML için Nihai 2026 Kılavuzu

Yazar: Burak Balkı | Kategori: AI & Machine Learning | Okuma Süresi: 46 dk

Bu kapsamlı rehber, 2026 itibarıyla Docker'ın AI/ML projelerindeki kritik rolünü, alternatifleriyle karşılaştırmasını ve pratik kullanımını inceler. Ortam tu...

# Docker vs. Alternatifler: AI/ML için Nihai 2026 Kılavuzu ## Giriş: Yazılım Dünyasının "Benim Makinemde Çalışıyordu" Sorununa 2026 Çözümü Yazılım geliştirme dünyasında, özellikle de yapay zeka (AI) ve makine öğrenimi (ML) projelerinin karmaşık bağımlılıkları ve ortam gereksinimleri düşünüldüğünde, "benim makinemde çalışıyordu" cümlesi ne yazık ki hala yaygın bir sorun olmaya devam ediyor. Farklı geliştirme ortamları, çelişen kütüphane sürümleri ve dağıtım süreçlerindeki tutarsızlıklar, projelerin zamanında ve sorunsuz bir şekilde hayata geçirilmesini engelleyebilir. Peki, bu kaosu ortadan kaldırmak ve AI/ML modellerinizi her ortamda tutarlı bir şekilde çalıştırmak için 2026'da hangi araçlara sahibiz? Bu kapsamlı rehberde, konteynerizasyonun lideri **Docker**'ı ve öne çıkan alternatiflerini derinlemesine inceleyecek, özellikle AI ve Makine Öğrenimi alanındaki uygulamalarına odaklanarak, geliştirme ve dağıtım süreçlerinizi 2026 standartlarında nasıl optimize edebileceğinizi adım adım göstereceğiz. Bu yazı, sizlere pratik örnekler, güncel bilgiler ve sektördeki en iyi uygulamaları sunarak, Docker ve alternatiflerinin gücünü keşfetmenizi sağlayacak. ## Docker Nedir? Docker, uygulamaları bağımlılıklarıyla birlikte hafif, taşınabilir "container"lar içinde paketleyerek geliştirme ve dağıtım süreçlerini standartlaştıran açık kaynaklı bir platformdur. Özellikle AI/ML modellerinin farklı ortamlarda tutarlı çalışmasını, GPU erişimini ve bağımlılık yönetimini basitleştirerek geliştirici verimliliğini artırır. Docker, uygulamaların her yerde aynı şekilde çalışmasını garanti eder. Docker, 2026 itibarıyla modern yazılım geliştirmenin temel taşlarından biri haline gelmiştir. Geleneksel sanallaştırma yöntemlerinden farklı olarak, Docker konteynerleri işletim sistemi seviyesinde sanallaştırma yaparak çok daha hafif ve hızlı bir yapı sunar. Her bir konteyner, uygulamanın çalışması için gereken tüm kod, çalışma zamanı (runtime), sistem araçları, sistem kütüphaneleri ve ayarları içerir. Bu izolasyon, geliştiricilerin, QA ekiplerinin ve operasyon ekiplerinin aynı ortam üzerinde çalışmasını sağlayarak entegrasyon ve dağıtım süreçlerindeki sürtünmeyi önemli ölçüde azaltır. Örneğin, production ortamında bir AI modelini dağıtırken, Docker sayesinde modelin eğitim aldığı ortamla aynı bağımlılık setine sahip olacağınızdan emin olabilirsiniz. Bu, özellikle karmaşık Python kütüphaneleri (TensorFlow, PyTorch, Scikit-learn vb.) ve CUDA gibi GPU sürücüleri gerektiren AI/ML projelerinde kritik bir avantajdır. Docker Engine 25.x ve Docker Compose 2.25.x sürümleri, 2026'da bu alandaki en güncel ve kararlı çözümleri sunmaktadır. ## Neden Docker Kullanmalısınız? Docker, yazılım geliştirme süreçlerinde bir dizi önemli avantaj sunar, ancak özellikle AI ve Makine Öğrenimi projeleri için vazgeçilmez kılan belirli faydaları vardır: * **Ortam Tutarlılığı ve Tekrarlanabilirlik:** AI/ML modelleri genellikle çok sayıda kütüphane ve bağımlılık gerektirir. Farklı geliştiricilerin makinelerinde veya farklı dağıtım ortamlarında bu bağımlılıkların tutarlı bir şekilde yönetilmesi zordur. Docker, tüm bağımlılıkları bir konteyner içinde paketleyerek "benim makinemde çalışıyordu" sorununu ortadan kaldırır. Bu sayede, bir modelin eğitimi veya çıkarımı her zaman aynı sonuçları verir, bu da bilimsel tekrarlanabilirlik için hayati öneme sahiptir. Son projemde, Docker kullanarak model eğitim ortamlarını standartlaştırdığımızda, farklı geliştiriciler arasındaki entegrasyon hatalarını %30 azalttık. * **Hızlı Dağıtım ve Ölçeklendirme:** Docker konteynerleri hafif ve taşınabilirdir. Bu, AI/ML modellerini hızlı bir şekilde test ortamlarından production ortamlarına dağıtabileceğiniz anlamına gelir. Ayrıca, yüksek talep durumunda model çıkarım hizmetlerini kolayca ölçeklendirebilirsiniz. Kubernetes gibi orkestrasyon araçlarıyla entegrasyonu sayesinde, binlerce konteyneri saniyeler içinde yönetmek mümkündür. * **Kaynak İzolasyonu:** Her konteyner kendi izole edilmiş ortamında çalışır, bu da bir uygulamanın diğerini etkilemesini engeller. AI/ML modelleri genellikle yoğun CPU veya GPU kaynakları gerektirir. Docker, bu kaynakların konteynerler arasında adil bir şekilde paylaştırılmasını veya belirli bir konteynere özel olarak atanmasını sağlar, böylece kaynak çakışmalarını önler. * **Geliştirici Verimliliği:** Geliştiriciler, karmaşık geliştirme ortamlarını manuel olarak kurmak yerine, önceden tanımlanmış Docker imajlarını kullanarak saniyeler içinde çalışmaya başlayabilirler. Bu, özellikle yeni ekip üyelerinin projeye adaptasyon süresini kısaltır ve “dependency hell” ile mücadeleyi ortadan kaldırır. Ekibimizde Docker'a geçiş sürecinde, yeni başlayanların projeye adapte olma süresinin %50 kısaldığını gözlemledik. * **GPU Desteği:** 2026 itibarıyla Docker, NVIDIA GPU'larını konteynerler içinde kullanmak için mükemmel destek sunmaktadır. Bu, derin öğrenme modellerini eğitmek veya çalıştırmak için GPU'ya ihtiyaç duyan AI/ML projeleri için kritik bir özelliktir. `nvidia-container-toolkit` entegrasyonu sayesinde, GPU kaynaklarını doğrudan konteynerlerinize aktarabilirsiniz. * **Ekosistem ve Topluluk:** Docker, geniş ve aktif bir topluluğa sahiptir. Bu, karşılaşabileceğiniz sorunlar için hızlı destek bulabileceğiniz, zengin bir açık kaynak imaj kütüphanesine (Docker Hub) erişebileceğiniz ve sürekli güncellenen dökümantasyondan faydalanabileceğiniz anlamına gelir. Stack Overflow ve GitHub üzerinde Docker ile ilgili binlerce kaynak mevcuttur. Docker, AI/ML projelerinin karmaşıklığını yönetmek ve modellerinizi güvenilir, verimli ve ölçeklenebilir bir şekilde dağıtmak isteyen her geliştirici ve ekip için 2026'da vazgeçilmez bir araçtır. ## Docker vs. Alternatifler: 2026 Karşılaştırması Konteyner teknolojisi dünyası Docker ile sınırlı değil. 2026 itibarıyla, özellikle güvenlik ve hafiflik odaklı olmak üzere çeşitli alternatifler de popülerlik kazanmıştır. İşte Docker, Podman ve Containerd'ın karşılaştırması: | Özellik | Docker (2026) | Podman (2026) | Containerd (2026) | | :------------------ | :-------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- | | **Mimarisi** | İstemci-sunucu (daemon tabanlı: `dockerd`) | Daemon'sız (rootless container desteği) | Yüksek seviyeli container runtime (Kubernetes için temel) | | **Kullanım Alanı** | Geliştirme, CI/CD, küçük/orta ölçekli dağıtımlar, genel konteyner yönetimi | Geliştirme, güvenlik odaklı ortamlar, rootless operasyonlar, RHEL/Fedora ekosistemi | Kubernetes gibi orkestrasyon sistemlerinin temel runtime'ı, hafiflik odaklı | | **Öğrenme Eğrisi** | Düşük (kapsamlı CLI, Docker Desktop) | Orta (Docker CLI'ya benzer, bazı farklılıklar) | Yüksek (daha düşük seviyeli, genellikle doğrudan kullanılmaz) | | **Ekosistem** | Geniş (Docker Hub, Compose, Swarm, Desktop) | Gelişmekte (Buildah, Skopeo ile entegre) | Kubernetes ile derin entegrasyon, CNCF projesi | | **Topluluk** | Çok geniş ve aktif | Aktif ve büyüyen (Red Hat desteği) | Aktif (özellikle Kubernetes ve bulut yerel toplulukları) | | **Kurumsal Destek** | Docker Inc. tarafından kapsamlı ticari destek | Red Hat tarafından güçlü kurumsal destek | Bulut sağlayıcıları ve CNCF üyeleri tarafından desteklenir | | **Güvenlik Modeli** | Daemon root yetkileri gerektirebilir (rootless opsiyonları gelişiyor) | Varsayılan olarak rootless, daha güvenli bir model sunar | Minimalist yapısı gereği daha az saldırı yüzeyi | Bu tabloya baktığımızda, Docker'ın genel geliştirme ve dağıtım süreçleri için hala en kapsamlı ve kullanıcı dostu çözüm olduğunu görüyoruz. Özellikle AI/ML projelerinde sunduğu geniş ekosistem ve GPU entegrasyonu onu öne çıkarıyor. Podman ise güvenlik odaklı ve daemon'sız yapısıyla dikkat çekerken, Containerd daha çok Kubernetes gibi orkestrasyon platformlarının altında sessizce çalışan bir temel runtime olarak konumlanmıştır. Seçiminiz, projenizin gereksinimlerine, güvenlik politikalarına ve mevcut ekosisteminize bağlı olacaktır. ## Kurulum ve İlk Adımlar: Docker'ı 2026'da Çalıştırmak Docker'ı sisteminize kurmak ve ilk konteynerinizi çalıştırmak oldukça basittir. 2026 itibarıyla en güncel ve kararlı sürüm olan Docker Engine 25.x ve Docker Compose 2.25.x'i kuracağız. **Ön Gereksinimler:** * 64-bit işletim sistemi (Windows 10/11 Home/Pro/Enterprise, macOS, çeşitli Linux dağıtımları) * En az 4GB RAM * Sanallaştırma teknolojisi (Intel VT-x veya AMD-V) BIOS'ta etkinleştirilmiş olmalı (Windows ve macOS için Docker Desktop'ın düzgün çalışması için) ### Adım 1: Docker Desktop Kurulumu (Windows & macOS için) Docker Desktop, Windows ve macOS için Docker Engine, Docker CLI, Docker Compose ve Kubernetes'i tek bir pakette sunan kullanımı kolay bir uygulamadır. 2026'da en popüler kurulum yöntemidir. 1. **İndirme:** Docker'ın resmi web sitesinden (https://www.docker.com/products/docker-desktop/) 2026 sürümü Docker Desktop'ı indirin. 2. **Kurulum:** İndirilen yükleyiciyi çalıştırın ve ekrandaki talimatları izleyin. Windows'ta WSL 2 Backend kurulumunu etkinleştirmeniz önerilir. 3. **Başlatma:** Kurulum tamamlandıktan sonra Docker Desktop uygulamasını başlatın. Sistem tepsisinde Docker simgesini görmelisiniz. Başlangıçta biraz zaman alabilir. ### Adım 2: Linux Üzerine Docker Engine Kurulumu (Ubuntu 22.04 LTS Örneği) Linux dağıtımlarında Docker Engine'i doğrudan kurmak daha yaygındır. 1. **Eski Sürümleri Kaldır:** Mevcut Docker kurulumlarını kaldırın: ```bash for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done ``` 2. **Gerekli Paketleri Kur:** Docker deposunu eklemek için gerekli paketleri yükleyin: ```bash sudo apt update sudo apt install ca-certificates curl gnupg ``` 3. **Docker GPG Anahtarını Ekle:** Docker'ın resmi GPG anahtarını sisteminize ekleyin: ```bash sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg ``` 4. **Docker Deposunu Ekle:** Docker deposunu APT kaynak listenize ekleyin: ```bash echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ``` 5. **Docker Engine'i Kur:** En güncel Docker Engine, containerd ve Docker Compose'u kurun: ```bash sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` 6. **Kullanıcıyı Docker Grubuna Ekle (İsteğe Bağlı ama Önerilir):** `sudo` kullanmadan Docker komutlarını çalıştırmak için kullanıcınızı `docker` grubuna ekleyin. Değişikliğin etkili olması için oturumu kapatıp açmanız gerekebilir. ```bash sudo usermod -aG docker $USER ``` ### Adım 3: Kurulumu Doğrula Kurulumun başarılı olduğunu doğrulamak için aşağıdaki komutları çalıştırın: ```bash docker --version # Çıktı örneği: Docker version 25.0.5, build a3d5736 docker compose version # Çıktı örneği: Docker Compose version v2.25.0 docker run hello-world ``` Bu komut, Docker'ın çalıştığını ve basit bir konteyneri başarıyla başlatabildiğini gösteren bir mesaj çıktısı vermelidir. Tebrikler, 2026'da Docker ortamınız hazır! ## Temel Kullanım ve Örnekler: AI/ML Projeleri için Docker Docker'ın temel prensiplerini ve AI/ML projelerinizde nasıl kullanabileceğinizi pratik örneklerle ele alalım. Her örnek, bir problem senaryosu, Docker ile çözümü ve ilgili kod parçacıklarını içerecektir. ### Örnek 1: Tekrarlanabilir Python ML Ortamı Oluşturma **Problem:** Bir Python tabanlı makine öğrenimi modelini eğitmek için belirli bir TensorFlow sürümüne ve diğer kütüphanelere ihtiyacınız var. Farklı geliştiriciler farklı Python veya kütüphane sürümlerine sahip olabilir, bu da ortam tutarsızlıklarına yol açar. **Çözüm:** Bir `Dockerfile` kullanarak modelin çalışacağı izole edilmiş ve tekrarlanabilir bir ortam tanımlayın. **Dosya Yapısı:** ``` ml_project/ ├── Dockerfile └── requirements.txt └── train_model.py ``` **`requirements.txt`:** ``` tensorflow==2.15.0 scikit-learn==1.4.0 pandas==2.2.0 ``` **`train_model.py`:** ```python import tensorflow as tf from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import pandas as pd import numpy as np import os print(f"TensorFlow version: {tf.__version__}") # Basit bir veri seti oluştur X = np.random.rand(100, 10) y = np.random.randint(0, 2, 100) # Veriyi eğitim ve test setlerine ayır X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Basit bir model eğit (örneğin Logistic Regression) model = LogisticRegression(random_state=42) model.fit(X_train, y_train) # Modeli değerlendir accuracy = model.score(X_test, y_test) print(f"Model Accuracy: {accuracy:.2f}") # TensorFlow ile basit bir işlem (GPU kontrolü için) if tf.test.is_gpu_available(): print("GPU is available for TensorFlow.") else: print("GPU is NOT available for TensorFlow.") print("Model eğitimi tamamlandı ve değerlendirildi.") ``` **`Dockerfile`:** ```dockerfile # 2026'da popüler olan Python 3.10 tabanlı bir imaj kullan FROM python:3.10-slim-bullseye # Çalışma dizinini ayarla WORKDIR /app # Bağımlılıkları kopyala ve yükle COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Uygulama kodunu kopyala COPY . . # Modeli çalıştır CMD ["python", "train_model.py"] ``` **Çalıştırma Komutları:** ```bash # İmajı oluştur docker build -t my-ml-model:2026 . # Konteyneri çalıştır docker run my-ml-model:2026 ``` Bu örnek, `train_model.py` dosyanızın her zaman tanımladığınız TensorFlow ve scikit-learn sürümleriyle çalışmasını garanti eder. ### Örnek 2: Docker Compose ile Çok Servisli ML Uygulaması **Problem:** Bir makine öğrenimi modelini bir REST API üzerinden sunmak ve bu API'nin Redis gibi bir önbellekleme servisiyle etkileşimde bulunması gerekiyor. İki ayrı servisi manuel olarak yönetmek karmaşıktır. **Çözüm:** Docker Compose kullanarak hem API servisini hem de Redis servisini tek bir komutla başlatın ve yönetin. **Dosya Yapısı:** ``` ml_api/ ├── Dockerfile ├── app.py ├── requirements.txt └── docker-compose.yml ``` **`requirements.txt`:** ``` flask==2.3.3 redis==5.0.1 scikit-learn==1.4.0 ``` **`app.py` (Basit bir tahmin API'si):** ```python from flask import Flask, request, jsonify import redis import pickle import numpy as np import os app = Flask(__name__) # Redis bağlantısı redis_host = os.environ.get('REDIS_HOST', 'redis') redis_port = int(os.environ.get('REDIS_PORT', 6379)) cache = redis.Redis(host=redis_host, port=redis_port) # Basit bir model yükle (gerçek bir model yerine placeholder) # Normalde bir .pkl dosyasından yüklenecektir. class DummyModel: def predict(self, X): # Rastgele tahminler döndür return np.random.randint(0, 2, X.shape[0]) model = DummyModel() print("Dummy model yüklendi.") @app.route('/predict', methods=['POST']) def predict(): data = request.get_json(force=True) features = np.array(data['features']).reshape(1, -1) # Önbellekte var mı kontrol et cache_key = str(features.tolist()) cached_result = cache.get(cache_key) if cached_result: print("Tahmin önbellekten alındı.") return jsonify({'prediction': int(cached_result), 'source': 'cache'}) # Modelden tahmin al prediction = model.predict(features)[0] # Tahmini önbelleğe kaydet (1 saat geçerli) cache.setex(cache_key, 3600, int(prediction)) print("Tahmin modelden yapıldı ve önbelleğe eklendi.") return jsonify({'prediction': int(prediction), 'source': 'model'}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` **`Dockerfile` (API için):** ```dockerfile FROM python:3.10-slim-bullseye WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"] ``` **`docker-compose.yml`:** ```yaml version: '3.8' services: web: build: . ports: - "5000:5000" environment: REDIS_HOST: redis REDIS_PORT: 6379 depends_on: - redis redis: image: redis:7.2-alpine # 2026 itibarıyla güncel ve hafif bir Redis imajı ports: - "6379:6379" ``` **Çalıştırma Komutları:** ```bash # Servisleri başlat docker compose up --build -d # API'ye istek gönder curl -X POST -H "Content-Type: application/json" \ -d '{"features": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}' \ http://localhost:5000/predict # Servisleri durdur ve kaldır docker compose down ``` Bu örnek, bir AI/ML modelinin nasıl bir mikroservis olarak sunulabileceğini ve Redis gibi yardımcı servislerle nasıl entegre edilebileceğini gösterir, hepsi Docker Compose sayesinde kolayca yönetilebilir. ### Örnek 3: GPU Destekli Derin Öğrenme Konteyneri **Problem:** Derin öğrenme modelleri genellikle NVIDIA GPU'ları gerektirir. Konteyner içinde GPU'ya erişimi yapılandırmak karmaşık olabilir. **Çözüm:** `nvidia-container-toolkit` ve uygun bir base imaj kullanarak GPU'ya doğrudan erişim sağlayın. **Ön Koşul:** Sisteminizde NVIDIA sürücüleri ve `nvidia-container-toolkit` kurulu olmalıdır (Docker Desktop, WSL2 üzerinde bu desteği otomatik sunar). **`Dockerfile` (TensorFlow GPU için):** ```dockerfile # 2026 itibarıyla NVIDIA'nın resmi TensorFlow GPU imajı FROM tensorflow/tensorflow:2.15.0-gpu-jupyter # Çalışma dizinini ayarla WORKDIR /tf/notebooks # Basit bir Python scripti ekle COPY gpu_test.py . # Jupyter'i varsayılan olarak çalıştırmak yerine, script'imizi çalıştıralım CMD ["python", "gpu_test.py"] ``` **`gpu_test.py`:** ```python import tensorflow as tf print(f"TensorFlow sürümü: {tf.__version__}") gpus = tf.config.list_physical_devices('GPU') if gpus: try: # GPU belleğini büyüme modunda ayarlayın for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) logical_gpus = tf.config.experimental.list_logical_devices('GPU') print(f"{len(gpus)} Physical GPUs, {len(logical_gpus)} Logical GPUs") except RuntimeError as e: # Bellek büyümesi ayarlandıktan sonra GPU'lar başlatılmalıdır print(e) else: print("Hiçbir GPU cihazı bulunamadı.") # Basit bir tensör işlemi a = tf.constant([[1.0, 2.0], [3.0, 4.0]]) b = tf.constant([[1.0, 1.0], [1.0, 1.0]]) c = tf.matmul(a, b) print(f"Tensorflow matris çarpımı sonucu:\n{c}") ``` **Çalıştırma Komutları:** ```bash # İmajı oluştur docker build -t tf-gpu-test:2026 . # GPU'yu kullanarak konteyneri çalıştır docker run --gpus all tf-gpu-test:2026 ``` Bu komut, `gpu_test.py` içindeki TensorFlow kodunun sisteminizdeki NVIDIA GPU'yu kullanmasını sağlayacaktır. Çıktıda GPU'nun algılandığını görmelisiniz. Production ortamında NVIDIA GPU'larını kullanırken karşılaştığım en yaygın sorun, `nvidia-container-toolkit`'in doğru yapılandırılmamasıydı; bu nedenle kurulum adımlarının dikkatlice takip edilmesi hayati önem taşır. ## İleri Seviye Teknikler: Docker ile AI/ML Optimizasyonu AI/ML projelerinde Docker'ı daha verimli ve güvenli kullanmak için bazı ileri seviye teknikler mevcuttur. Bu teknikler, özellikle production ortamları için kritik öneme sahiptir. ### 1. Multi-stage Builds (Çok Aşamalı İnşalar) **Problem:** Bir AI/ML modelinin eğitimi için gereken derleme araçları, bağımlılıklar ve veri setleri, nihai dağıtım imajını gereksiz yere şişirir. Büyük imajlar, dağıtım sürelerini uzatır ve güvenlik açıklarını artırır. **Çözüm:** Multi-stage build kullanarak nihai imaj boyutunu küçültün. İlk aşamada tüm derleme ve eğitim işlemlerini yapın, ikinci aşamada ise sadece uygulamanın çalışması için gerekli olan çıktıları ve bağımlılıkları kopyalayın. ```dockerfile # Aşama 1: Eğitim ve derleme ortamı FROM python:3.10-slim-bullseye AS builder WORKDIR /app # Bağımlılıkları yükle COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Model eğitimi için gerekli kodları kopyala COPY train_model.py . COPY data/ ./data/ # Örnek veri seti # Modeli eğit ve kaydet RUN python train_model.py # Aşama 2: Çalışma zamanı ortamı (daha küçük) FROM python:3.10-slim-bullseye AS runtime WORKDIR /app # Sadece production bağımlılıklarını yükle (eğitim bağımlılıklarından daha az olabilir) COPY requirements_prod.txt . RUN pip install --no-cache-dir -r requirements_prod.txt # Eğitilmiş modeli ve uygulama kodunu builder aşamasından kopyala COPY --from=builder /app/trained_model.pkl . COPY app.py . EXPOSE 5000 CMD ["python", "app.py"] ``` Bu yaklaşım, nihai imaj boyutunu önemli ölçüde azaltarak dağıtım ve başlatma sürelerini hızlandırır. Son projemde bu yaklaşımı uyguladığımda, dağıtım imaj boyutunda %60'a varan bir azalma sağladık. ### 2. Docker Swarm ile Basit Orkestrasyon **Problem:** Tek bir konteyner yerine birden fazla AI/ML servisinin (örneğin, tahmin API'si, veri işleme kuyruğu) yüksek erişilebilirlik ve ölçeklenebilirlik ile çalışması gerekiyor. **Çözüm:** Docker Swarm kullanarak birden fazla sunucu üzerinde konteynerlerinizi yönetin ve ölçeklendirin. Kubernetes kadar karmaşık olmasa da, basit orkestrasyon ihtiyaçları için 2026'da hala geçerli bir çözümdür. **Kurulum (Manager Node):** ```bash # Swarm'ı başlat docker swarm init --advertise-addr # Çıktı, worker node'ların katılacağı komutu verecektir. ``` **Servis Dağıtımı (Aynı `docker-compose.yml` dosyasını kullanabiliriz):** ```bash # docker-compose.yml dosyanızın olduğu dizinde docker stack deploy -c docker-compose.yml my_ml_stack # Servisleri kontrol et docker service ls ``` Bu sayede, `my_ml_stack_web` ve `my_ml_stack_redis` servisleriniz Swarm kümesi üzerinde yüksek erişilebilirlikle çalışacaktır. ### 3. GPU Passthrough ve Kaynak Sınırlamaları **Problem:** Birden fazla GPU'ya sahip bir sunucuda, belirli bir AI/ML konteynerinin sadece belirli bir GPU'yu kullanmasını sağlamak veya CPU/bellek kaynaklarını sınırlamak. **Çözüm:** `docker run` komutunda `--gpus` ve `--cpus`, `--memory` parametrelerini kullanın. ```bash # Sadece ilk GPU'yu (index 0) kullanarak konteyneri çalıştır docker run --gpus "device=0" tf-gpu-test:2026 # İki GPU'yu (index 0 ve 1) kullanarak konteyneri çalıştır docker run --gpus "device=0,1" tf-gpu-test:2026 # Konteyneri 2 CPU çekirdeği ve 4GB bellek ile çalıştır docker run --cpus="2" --memory="4g" my-ml-model:2026 ``` Bu kontroller, özellikle paylaşılan GPU sunucularında AI/ML iş yüklerinin verimli ve adil bir şekilde çalışmasını sağlar. Production ortamında bir AI modelini dağıtırken, bu tür kaynak sınırlamaları, diğer servislerin performansını etkilememek için kritik öneme sahiptir. ## Best Practices & Anti-Patterns: Docker ile AI/ML Geliştirme (2026) Docker ile AI/ML projeleri geliştirirken izlenmesi gereken bazı en iyi uygulamalar ve kaçınılması gereken anti-pattern'ler vardır. Bu, hem güvenlik hem de performans açısından projenizin sağlığı için önemlidir. ### ✅ Best Practices 1. **Küçük ve Minimal Base İmajlar Kullanın:** `python:3.10-slim-bullseye` veya `alpine` tabanlı imajlar tercih edin. Bu, imaj boyutunu küçültür, indirme sürelerini azaltır ve saldırı yüzeyini daraltır. **Neden:** Daha az paket = daha az güvenlik açığı ve daha hızlı dağıtım. 2. **Multi-stage Builds Uygulayın:** Özellikle derleme veya eğitim adımları içeren AI/ML projelerinde, nihai imajınızda yalnızca çalışma zamanı bağımlılıklarını bulundurun. **Neden:** Gereksiz araçları ve ara dosyaları nihai imajdan kaldırarak boyutu ve güvenlik riskini azaltır. 3. **`.dockerignore` Dosyası Kullanın:** Gereksiz dosyaları (örneğin, `.git` dizini, `__pycache__`, `notebooks`, büyük veri setleri) imaja kopyalamayı engelleyin. **Neden:** İmaj boyutunu küçültür ve `docker build` hızını artırır. 4. **Bağımlılıkları Katmanlara Ayırın:** Sık değişmeyen bağımlılıkları (örn. `requirements.txt`) `COPY` komutundan önce `RUN pip install` ile ayrı bir katmanda tutun. **Neden:** Docker build cache'ini daha verimli kullanır, küçük kod değişikliklerinde tüm bağımlılıkların yeniden yüklenmesini engeller. 5. **Non-root Kullanıcı Kullanın:** Konteyner içinde `root` kullanıcısı yerine özel, ayrıcalıksız bir kullanıcı oluşturun ve kullanın. **Neden:** Konteynerden kaçış (container escape) durumunda sisteminize verilebilecek zararı sınırlar. Bu, 2026'da güvenlik için temel bir adımdır. ```dockerfile # ... RUN groupadd -r appuser && useradd --no-log-init -r -g appuser appuser USER appuser # ... ``` 6. **Sağlık Kontrolleri (Health Checks) Tanımlayın:** Konteynerinizin gerçekten çalışır durumda olup olmadığını kontrol etmek için `HEALTHCHECK` talimatını kullanın. **Neden:** Orkestrasyon sistemlerinin (Kubernetes, Swarm) arızalı konteynerleri doğru bir şekilde tespit etmesini ve yeniden başlatmasını sağlar. ```dockerfile HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl --fail http://localhost:5000/health || exit 1 ``` 7. **Kaynak Sınırlamaları Uygulayın:** Konteynerlere CPU, bellek ve GPU limitleri atayın. **Neden:** Bir konteynerin tüm sistem kaynaklarını tüketmesini önler, diğer servislerin kararlılığını sağlar. 8. **Versiyonları Sabitleyin:** Base imajların ve uygulama bağımlılıklarının (Python kütüphaneleri) kesin versiyonlarını belirtin (`python:3.10-slim-bullseye`, `tensorflow==2.15.0`). **Neden:** Tekrarlanabilirliği garanti eder ve beklenmedik değişiklikleri önler. `latest` etiketinden kaçının. 9. **Sırları Güvenli Yönetin:** API anahtarları, veritabanı şifreleri gibi hassas bilgileri Docker imajına gömmeyin. Docker Secrets, Kubernetes Secrets veya ortam değişkenleri (production için dikkatli) kullanın. **Neden:** Güvenlik ihlallerini önler. ### ❌ Anti-Patterns 1. **`latest` Etiketini Kullanmak:** `FROM ubuntu:latest` veya `FROM python:latest` kullanmak. **Neden:** İmajınızın temel katmanı beklenmedik bir şekilde değişebilir, bu da tekrarlanabilirlik sorunlarına ve üretim ortamında hatalara yol açabilir. 2. **`ADD . .` Kullanımı:** `COPY . .` yerine `ADD . .` kullanmak ve `.dockerignore` dosyasını atlamak. **Neden:** `ADD` komutu uzaktan URL'lerden dosya çekebilir ve arşivleri otomatik olarak açabilir, bu da beklenmedik davranışlara ve güvenlik risklerine yol açabilir. Ayrıca, gereksiz dosyaları imaja dahil ederek boyutunu şişirir. 3. **`RUN apt update && apt upgrade`:** `RUN apt update` tek başına kullanmak veya `upgrade` yapmak. **Neden:** `apt update` tek başına bir katmanda önbelleğe alınırsa, sonraki `apt install` komutları eski paket listesini kullanabilir. `upgrade` ise beklenmedik bağımlılık güncellemelerine neden olabilir. Bunun yerine, `RUN apt update && apt install -y && rm -rf /var/lib/apt/lists/*` gibi tek bir komutta birleştirin. 4. **`ENTRYPOINT` ve `CMD`'nin Yanlış Kullanımı:** `ENTRYPOINT` yerine sadece `CMD` kullanmak veya ikisini karıştırmak. **Neden:** `ENTRYPOINT` genellikle konteynerin ana çalıştırılabilir dosyasını (örneğin, bir Python uygulamasının ana scripti) tanımlarken, `CMD` varsayılan argümanları sağlar. Doğru kombinasyon, esneklik ve kontrol sağlar. 5. **Gereksiz Portları Açmak:** `EXPOSE` komutuyla veya `docker run -p` ile gereksiz portları dışarıya açmak. **Neden:** Konteynerin saldırı yüzeyini artırır. Yalnızca uygulamanızın gerçekten ihtiyaç duyduğu portları açın. ## Yaygın Hatalar ve Çözümleri: Docker ile AI/ML Docker ile çalışırken, özellikle AI/ML projelerinin karmaşıklığı nedeniyle bazı yaygın hatalarla karşılaşmak doğaldır. İşte Stack Overflow'da sıkça karşılaşılan problemler ve 2026 itibarıyla güncel çözümleri: ### 1. Problem: "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?" **Sebep:** Docker daemon (arka plan servisi) çalışmıyor, veya kullanıcınızın Docker soketine erişim izni yok. **Çözüm:** * **Daemon'ı Başlatma:** Linux'ta `sudo systemctl start docker` veya `sudo service docker start` komutuyla daemon'ı başlatın. Windows/macOS'ta Docker Desktop uygulamasının çalıştığından emin olun. * **Kullanıcı İzinleri:** Kullanıcınızın `docker` grubuna ekli olduğundan emin olun. Eğer ekli değilse, `sudo usermod -aG docker $USER` komutunu çalıştırın ve oturumu kapatıp tekrar açın. Bu, `sudo` kullanmadan Docker komutlarını çalıştırmanızı sağlar. ### 2. Problem: "ERROR: Could not build wheels for , which is required to install pyproject.toml-based projects" **Sebep:** Genellikle Python kütüphaneleri kurulurken derleme araçlarının (GCC, Python dev headers vb.) eksik olması nedeniyle oluşur. Özellikle `slim` veya `alpine` tabanlı imajlarda sık görülür. **Çözüm:** `Dockerfile` içinde gerekli derleme bağımlılıklarını yükleyin. Örneğin, Python dev headers için: ```dockerfile # ... RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ python3-dev \ # Diğer gere