Docker, yazılım uygulamalarını birbirinden bağımsız ve taşınabilir konteynerlerde çalıştırmak için kullanılan açık kaynaklı bir platformudur. Sanal makinelerden farklı olarak, konteynerler işletim sistemi seviyesinde izole edilir ve daha hafif kaynak kullanımı sağlar. Özellikle yapay zeka (YZ) projelerinde Docker; taşınabilirlik, tekrar üretilebilirlik ve bağımlılık yönetimi konularında büyük avantaj sağlar. Örneğin Docker, makine öğrenimi süreçlerinde ortaya çıkan “ortamı tekrardan yaratma” (environment reproducibility) ve bağımlılık yönetimi sorunlarını çözerek işbirliği ve dağıtımı kolaylaştırır. Yani bir yerde sorunsuz çalışan kod, Docker imajı ile başka sistemlerde de aynı şekilde çalıştırılabilir hale gelir.
Bu kavramlara ek olarak Dockerfile, bir imajın nasıl oluşturulacağını betimleyen metin dosyasıdır. Dockerfile içindeki FROM, RUN, COPY gibi komutlar ile bir imaj katman katman inşa edilir.
YZ projelerinde bağımlılık karmaşası sık görülen bir sorundur. Farklı projelerde Python, CUDA, C/C++ kütüphaneleri gibi birçok bileşen farklı versiyonlarda olabilir. Örneğin bir model TensorFlow 2 ile geliştirilirken, başka bir modeller Torch, scikit-learn, belirli GPU sürücüleri veya OpenCV gibi kütüphanelere ihtiyaç duyabilir. Bu farklılıklar, “bir ortamda çalışan kod başka ortamda neden çalışmıyor?” sorusunu gündeme getirir. Docker, bu sorunları her projenin kendine ait izole bir konteyner ortamında çözerek giderir. Konteyner içinde tüm bağımlılıklar ve ortam ayarları (örneğin Python versiyonu) sabitlenebilir. Böylece geliştirme, test ve üretim ortamları arasında tutarlılık sağlanır.
Sık karşılaşılan problemler şunlardır:
Docker, bu sorunları kendi içinde çözer. Örneğin, projenin ihtiyaç duyduğu tüm Python paketlerini requirements.txt veya environment.yml ile imaja dahil edilebilir. CUDA gerektiren uygulamalar için NVIDIA’nın hazır CUDA tabanlı imajlarından yararlanılabilir (örn. nvidia/cuda:12.8.1-cudnn). Böylece bağımlılık zinciri her seferinde tutarlı hale gelir. Sonuç olarak, farklı makinelerde de “aynı kod, aynı sonuç” garantisi elde edilir.
Basit bir Python tabanlı makine öğrenimi projesi için örnek bir Dockerfile aşağıda gösterilmiştir. Bu örnekte resmi Python imajı kullanılmış, öncelikle gerekli paketler kurulmuş, ardından proje dosyaları kopyalanıp çalıştırılmıştır:
Bu Dockerfile’da adım adım şu işlemler yapılır:
İmaj oluşturma: Dockerfile hazırlandıktan sonra bulunduğu klasörde şu komutla imaj inşa edilir:
Burada -t etiketi ile imaja bir isim ve etiket veriyoruz (örn. benim-yz-projem:latest). Nokta (.) son klasördeki Dockerfile’ı işaret eder. --no-cache bayrağı kullanılarak her seferinde temiz build yapılabilir; böylece eski katmanlar önbelleğe alınmaz ve bağımlılıklar güncel tutulur.
Container çalıştırma: Oluşturulan imajdan bir container ayağa kaldırmak için:
Komutuyla benim-yz-projem imajından arka planda (-d) bir konteyner başlatılır ve ml-container adı verilir. Eğer bir port yönlendirme gerekiyorsa örneğin:
şeklinde de kullanılabilir. Bu örnekte -p ile container’daki 8888 portu ana makineye bağlanırken, -v ile mevcut dizin container içindeki /app dizinine mount edilmiştir.
docker run komutu ile container başlatıldıktan sonra içinde otomatik olarak CMD komutu (örneğin python train.py) çalışır. Eğitim veya inference ile ilgili komutları konteynır çalışırken başlatarak işler yapılır.
Docker, Inc. “Best Practices for Writing Dockerfiles.” Docker Documentation. Erişim tarihi: 01.05.2025.https://docs.docker.com/build/building/best-practices/.
Medium. “Chapter 16: Docker for Data Science and Machine Learning.” Erişim tarihi: 01.05.2025.https://praneethreddybilakanti.medium.com/chapter-16-docker-for-data-science-and-machine-learning-8379cbe1d1db.
Medium. “End-to-End ML Pipeline Using Docker.” Erişim tarihi: 01.05.2025.https://medium.com/@sauravpattnaik2011/end-to-end-ml-pipeline-using-docker-fa4878abcc33.
Docker Image ve Container Kavramları
YZ Projelerinde Bağımlılık ve Ortam Problemleri
Örnek: Python Makine Öğrenimi Projesi için Dockerfile
docker build ve docker run Komutları