Kurs

Uçtan uca bir makine öğrenimi problemi üzerinde çalıştığınızı ve en iyi modellerle en uygun çözüme ulaştığınızı hayal edin. Ancak kodunuzu mühendislik ekibine gönderdiğinizde, sizin makinenizde çalışan kod, farklı işletim sistemi ve değişen kütüphane sürümlerine sahip olabilecek sunucularında çalışmıyor gibi görünüyor.
Özeninize ve sıkı çalışmanıza rağmen bu sinir bozucu durum bazen yaşanabilir. Çoğu geliştirici bunu en az bir kez deneyimler. Peki çözüm nedir? İşte burada Docker devreye girer. Docker kullanarak projeniz için net ve tutarlı bir ortam tanımlayabilir, böylece kodunuzun altında yatan ortam veya kurulumdan bağımsız olarak sorunsuz çalışmasını sağlayabilirsiniz.
Bu eğitim, Docker ve ilgili kavramlarını tanıtacak ve veri bilimciler için önemini açıklayacak. Ayrıca bu yazı aracı kurmanıza ve örneklerle bir sonraki projenizde kullanmanıza yardımcı olacak. Son olarak — Docker kullanırken sektör genelinde izlenecek en iyi uygulamaları öğrenecek ve Docker ile ilgili tüm sorularınıza yanıt bulacaksınız.
Docker, Konteyner ve İmajlar Nedir?
Docker, uygulamaları oluşturmak, çalıştırmak ve dağıtmak için bir platformdur.
Konteynerler, bir uygulamayı çalıştırmak için gereken her şeyi içeren, hafif, bağımsız ve çalıştırılabilir paketlerdir; buna kod, çalışma zamanı, kütüphaneler, ortam değişkenleri ve yapılandırma dosyaları dahildir.
Docker İmajı, bir konteyner oluşturmak için gerekli tüm talimatları içeren salt okunur bir dosyadır. Çalışma zamanında yeni konteynerler oluşturmak ve başlatmak için kullanılırlar.
Docker, geliştiricilerin uygulamalarını bağımlılıklarıyla birlikte bir konteynere paketlemesine yardımcı olur; bu konteyner, Docker yüklü herhangi bir makinede çalıştırılabilir.
Bir bakıma, yeni bir proje için size yeni bir makine verilmiş gibidir. Gerekli paketleri kurar, gerekli dosyaları makineye kopyalar ve betikleri çalıştırırsınız. Bu yeni makineyi başka yere de gönderebilirsiniz. Abartısız bir örnek, ama fikri veriyor.
Docker konteynerleri Sanal Makinelerden nasıl farklıdır?
Konteynerleri tanımlar tanımlamaz, her iki teknoloji de aynı fiziksel makinede birden fazla izole ortamın çalışmasına izin verdiğinden, sanal makinelerden nasıl ayrıldığını merak edersiniz.
Aşağıdaki görselde mimari farklara bir göz atın ve farkı tespit edip edemeyeceğinize bakın.

Yazarın görseli
Her sanal makine, farklı işletim sistemleri ve yapılandırmaları çalıştırabilen izole bir ortamdır. Bu aynı zamanda her VM’nin işletim sisteminin tam bir kopyasını gerektirdiği anlamına gelir; bu da çok fazla kaynak tüketebilir. Buna karşılık konteynerleştirilmiş uygulamalar, işletim sisteminin tam bir kopyasını gerektirmeden izole bir ortamda çalışır; bu da onları daha hafif ve verimli kılar.
Sanal makineler faydalı olmakla birlikte, uygulamaları dağıtmak için genellikle konteynerler yeterli ve idealdir.
Neden Veri Bilimciler için Docker?
Bir veri bilimci olarak neden Docker öğrenmeniz gerektiğini merak ediyor olabilirsiniz. Altyapı tarafıyla ilgilenecek DevOps ekipleri yok mu?
Yerinde bir soru — ancak bir DevOps ekibi olsa bile Docker veri bilimciler için son derece önemlidir. Docker’ın neden bu kadar faydalı olduğunu anlayalım.
DevOps ekibiyle entegrasyon
Bir DevOps ekibine sahip olmak, Docker kullanmanın faydalarını ortadan kaldırmaz; aksine geliştirme ve operasyon ekipleri arasındaki boşluğu kapatmaya da yardımcı olabilir. Veri bilimciler kodlarını paketlemek ve dağıtım ile ölçekleme için DevOps ekibine iletmek üzere Docker’ı kullanabilir. Daha yapılandırılmış bir veri bilimi ekibinde bunu yaşamanız muhtemeldir.
Tutarlı ortam ve yeniden üretilebilirlik
Veri bilimciler, kurulması ve sürdürülmesi gereken karmaşık bağımlılıklar ve yapılandırmalarla sıklıkla çalışırlar. Benzer sonuçlar elde etmek için ortamın aynı kalması gerekir. Docker, veri bilimcilerin gerekli tüm bağımlılıkların ve yapılandırmaların önceden yüklü olduğu tutarlı bir ortam oluşturmasına ve paylaşmasına olanak tanır; böylece başkaları tarafından kolayca tekrarlanabilir.
Taşınabilirlik
Docker konteynerleri; dizüstü bilgisayarlar, sunucular ve bulut platformları dahil, Docker yüklü herhangi bir ortamda çalışabilir. Bu da veri bilimcilerin çalışmalarını farklı ortamlar arasında kolayca taşımalarını sağlar.
Kaynak izolasyonu
Docker, aynı makinede her biri kendi izole kaynaklarına sahip birden fazla konteynerin çalışmasına izin verir. Bu, veri bilimcilerin kaynaklarını daha verimli yönetmesine ve diğer uygulamalarla çakışmaları önlemesine yardımcı olabilir. Birden fazla ML projeniz olduğunda bu özellik hayat kurtarıcı olabilir.
İş birliğini kolaylaştırma
Docker, veri bilimcilerin çalışmalarını konteynerler içinde, uzaktaki ekipler dahil herkesle paylaşmasına olanak tanır. Veri bilimciler için ekip olarak çalışmanın kritik bir parçası iş birliğidir ve Docker bunu yaparken sürtünmeyi azaltır.
Deneyimli veri bilimcilerin çoğu, Docker’ın yardımıyla veri bilimcilerin altyapının altında yatan ayrıntılarla uğraşmadan çalışmalarına odaklanabildikleri konusunda hemfikirdir.
Docker Eğitimi: Bir Sonraki Projenizde Docker Kullanımı
Docker’a ihtiyaç duyduğumuzu ortaya koyduğumuza göre, hızla Docker ile güncel hale gelelim. Önce makinemize Docker’ı kurmalı ve yaygın komutlara aşina olmalıyız.
Makinenize veya yerel sunucunuza Docker kurma
Docker; Linux, Windows ve Mac gibi tüm büyük işletim sistemleri için mevcuttur. Kurulum basittir ve en iyi resmi dokümantasyonda bulunur.
- Linux için Docker kurulum talimatları.
- Windows için Docker kurulum talimatları.
- Mac için Docker kurulum talimatları.
Eğer kendi imajlarınızı oluşturup Docker Hub’a göndermek istiyorsanız (aşağıdaki bazı komutlarda gösterildiği gibi), Docker Hub’da bir hesap oluşturmanız gerekir. Docker Hub’ı, geliştiricilerin Docker imajlarını depolayıp paylaşabildiği merkezi bir yer olarak düşünün.
Yaygın Docker komutlarına aşinalık kazanma
Docker’ı makinenizde (veya sunucuda) kurduktan sonra sıradaki adım, bazı Docker komutlarına aşina olmaktır. Resmi Docker dokümantasyonundan başvurmanız gereken komutların listesi burada.
Başlamanıza yardımcı olmak için, karşılaşmanız muhtemel en yaygın on Docker komutunu özetledik.
- docker run: Bu komut, bir imajdan konteyner çalıştırmak için kullanılır. -p bayrağı, ana makinedeki bir bağlantı noktasını konteynerdeki bir bağlantı noktasına eşler. Örneğin, aşağıdaki komut, "nginx" imajından bir konteyner çalıştırır ve ana makinedeki 80 numaralı bağlantı noktasını konteynerdeki 80 numaralı bağlantı noktasına eşler.
docker run -p 80:80 nginx- docker ps: Bu komut, çalışan tüm konteynerleri listelemek için kullanılır. Aynı makinede birden fazla izole konteyner çalıştığında kullanışlıdır.
docker ps- docker stop: Bu komut, çalışan bir konteyneri durdurmak için kullanılır.
docker stop <container_id>- docker rm: Bu komut, durdurulmuş bir konteyneri kaldırmak için kullanılır.
docker rm <container_id>- docker images: Bu komut, ana makinedeki tüm imajları listelemek için kullanılır. Bir konteyner oluşturmak için çalıştırmadan önce mevcut yerel imajları görmek açısından faydalıdır.
docker images- docker rmi: Bu komut, bir imajı kaldırmak için kullanılır.
docker rmi <image_id>- docker build: Bu komut, bir Dockerfile’dan imaj oluşturmak için kullanılır. -t bayrağı imajın adını belirtir ve sonda yer alan . nokta, derleme bağlamını (geçerli dizin) belirtir.
docker build -t my_image .- docker exec: Bu komut, çalışan bir konteyner içinde bir komut çalıştırmak için kullanılır.
docker exec -it <container_id> /bin/bash- docker pull: Bu komut, Docker Hub gibi bir kayıt defterinden imaj çekmek için kullanılır.
docker pull <image_name>- docker push: Bu komut, bir imajı bir kayıt defterine göndermek için kullanılır.
docker push <image_name>
Docker’ı kurmayı ve yaygın komutları öğrendiğimize göre, sıradaki hedefimiz bir makine öğrenimi uygulamasını dockerize etmek.
Docker sertifikası almak ister misiniz? Docker sertifikası alma rehberimize göz atın!
Basit Bir Makine Öğrenimi Uygulamasını Dockerize Etme
Eğer basit üç aşamalı bir yaklaşımı izlerseniz, herhangi bir makine öğrenimi uygulamasını dockerize etmek düşündüğünüzden daha kolaydır.

Yazarın görseli.
Basitliği korumak için başlangıç seviyesinde bir makine öğrenimi betiği ele alalım; amacımız bir betiği nasıl dockerize edebileceğinizi göstermek. Göreceğimiz örnek, iris veri kümesi üzerinde basit bir lojistik regresyon modeli kuruyor.
# Load the libraries
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Train a logistic regression model
clf = LogisticRegression()
clf.fit(X_train, y_train)
# Make predictions
y_pred = clf.predict(X_test)
# Print the accuracy of the model
accuracy_score = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy_score}')
1. Ortamı tanımlama
Başka bir yerde çoğaltabilmek için mevcut ortamı tam olarak bilmeniz gerekir. En kolay (ve en yaygın) yol, projenizin kullandığı tüm kütüphaneleri ve sürümlerini özetleyen requirements.txt dosyası oluşturmaktır.
Dosyanın içeriği şu şekildedir:
scikit-learn==1.2.0
Not: Daha karmaşık bir makine öğrenimi uygulaması NumPy, pandas, matplotlib ve diğerleri gibi daha fazla kütüphane kullanacaktır. Bu nedenle, yalnızca kütüphaneyi kurmak yerine requirements.txt dosyası oluşturmak daha mantıklı olur (buna daha sonra sektörün en iyi uygulamaları bölümünde değineceğiz.)
2. Bir Dockerfile yazın
Bir sonraki adımımız, ortamı oluşturup uygulamamızı bu ortamda çalıştırabilecek Dockerfile adlı bir dosya oluşturmaktır. Daha basit bir ifadeyle, ortamın nasıl olması gerektiğini, içeriğini ve diğer yürütme adımlarını belirten Docker için bir talimat kitabı gibidir.
FROM python:3.9
WORKDIR /src
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python","iris_classification.py"]
Bu Dockerfile, resmi Python imajını temel imaj olarak kullanır, çalışma dizinini ayarlar, requirements.txt dosyasını kopyalar ve bağımlılıkları kurar, uygulama kodunu kopyalar ve uygulamayı başlatmak için python iris_classification.py komutunu çalıştırır.
3. İmajı oluşturma
Yeniden üretilebilir bir ortam oluşturmanın son adımı, aynı yapılandırmalara sahip herhangi sayıda konteyner oluşturmak için çalıştırılabilen bir imaj (şablon olarak da bilinir) oluşturmaktır.
Dockerfile’ın bulunduğu aynı dizinde docker build -t <image-name> komutunu çalıştırarak imajı oluşturabilirsiniz.
Artık gördüğümüz basit makine öğrenimi uygulamasını dockerize ettiğinize göre, docker run komutunu kullanabilir, konteynerler oluşturabilir ve gerektiğinde durdurabilirsiniz. Daha önce bazı yaygın komutları ele almıştık.
Şimdi bilgimizi temelden sektör beklentilerine dönüştürelim.
Docker Kullanımı için Sektör Genelinde En İyi Uygulamalar
Temelleri anlamak başlamak için yeterlidir; ancak sektörde çalışırken en iyi uygulamaları takip etmek kritik önem taşır.
Katman sayısını düşük tutma
Dockerfile içindeki her talimat yeni bir katmanla sonuçlanır. Çok fazla katman, imajı büyük ve aktarımı yavaş hale getirebilir.
Aşağıdaki kod örneğine göz atın:
# Use the official Python image as the build image
FROM python:3.9
# Install the dependencies
RUN pip install pandas
RUN pip install matplotlib
RUN pip install seaborn
# Copy neccesary files
COPY my_script.py .
COPY data/ .
# Run the script
CMD ["python","my_script.py"]
Burada ne sorun görüyorsunuz? Birden çok run ve copy komutunun kullanımı gereksizdi. Bunu şöyle düzeltebiliriz:
# Use the official Python image as the build image
FROM python:3.9
# Install the dependencies using requirements.txt
COPY my_script.py requirements.txt data/ .
RUN pip install --no-cache-dir -r requirements.txt
# Run the script
CMD ["python","my_script.py"]
Bu kadar küçük bir dosyada bariz olsa da, ihtiyacımızdan daha büyük Dockerfile’lar yazdığımız çok olur. Benzer işlevler yapan veya aynı dosyayı değiştiren komutları gruplamak, bir Dockerfile’daki katmanları azaltmanın kolay bir yoludur.
Resmi imajları kullanma
Resmi imajlar, imaj yayıncısı tarafından bakımı yapılan ve desteklenen imajlardır. Bu imajlar genellikle diğer imajlardan daha kararlı ve güvenli kabul edilir.
İşi daha hızlı bitirme telaşıyla bazen dikkatsizce resmi olmayan bir imaj kullanırız. Mümkün olduğunda, kendi imajlarınız için temel olarak resmi imajları kullanın.
Performansı optimize etmek için çok aşamalı derlemeler
Docker’da çok aşamalı bir derleme, tek bir Dockerfile içinde birden fazla FROM talimatı kullanmanıza olanak tanır.
Uygulamayı derlemek için daha büyük bir imajı derleme imajı olarak kullanabilir, ardından gerekli dosyaları daha küçük bir çalışma zamanı imajına kopyalayabiliriz. Gereksiz dosyaları dahil etmeyerek, yalnızca performansı optimize etmekle kalmayıp uygulamayı daha güvenli hale getirerek, nihai imajın boyutunu da küçültürüz.
Sektörde tekrar tekrar kullanıldığı için bunu daha iyi anlamak üzere bir örneğe bakalım:
# Use the official Python image as the build image
FROM python:3.9 AS build
# Set the working directory
WORKDIR /app
# Copy the requirements.txt file
COPY requirements.txt ./
# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the application files
COPY . .
# Train the model
RUN python train.py
# Use the official Alpine Linux image as the runtime image
FROM alpine:3
# Set the working directory
WORKDIR /app
# Copy the model files from the build image
COPY --from=build /app/models /app/models
# Copy the requirements.txt file
COPY --from=build /app/requirements.txt /app
# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Run the application
CMD ["python","predict.py"]
Bu örneği parçaladığımızda, başlangıçta resmi Python imajının derleme imajı olarak kullanıldığını ve tüm bağımlılıkların bu aşamada kurulduğunu görürüz.
train.py dosyasını çalıştırdıktan sonra, oluşturulan model dosyalarını ve requirements.txt dosyasını, uygulamayı çalıştırmak için kullanacağımız daha küçük bir Alpine Linux çalışma zamanı imajına kopyalıyoruz. Çok aşamalı derleme kullanıp derleme bağımlılıklarını ve Python yorumlayıcısını nihai imaja dahil etmeyerek, nihai imaj boyutunu etkili biçimde çok daha küçük hale getirdik.
Veriyi kalıcı kılmak için volume kullanma
Bir konteyner içindeki veriler, konteyner durdurulup silindikten sonra mevcut değildir; ancak bazen deney sonuçlarını daha sonra başvurmak üzere tutmanız gerekir. Ayrıca birden fazla konteyner arasında veri paylaşmak da isteyebilirsiniz.
volume komutunu kullanarak verilerin konteynerin dışında kalıcı olmasını sağlarsınız. Bunu nasıl yapabileceğinize dair bir örnek:
# Use the official Python image as the base image
FROM python:3.9
# Set the working directory
WORKDIR /app
# Copy the requirements.txt file
COPY requirements.txt ./
# Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the application files
COPY . .
# Create a directory for storing data
RUN mkdir /app/data
# Define a volume for the data directory
VOLUME /app/data
# Run the application
CMD ["python","main.py"]
Docker imajlarını düzenleme ve versiyonlama
Birden fazla Docker imajıyla çalışmaya başladığınızda işler karışır ve bunları düzenleme ihtiyacı doğar. Bu uygulamalar organizasyondan organizasyona değişse de, Docker imajlarını düzenlemeye ilişkin yaygın uygulamalardan bazılarını özetleyebiliriz:
- Her imaj için tutarlı bir adlandırma kuralı izlemek. Örneğin, <registry>/<organization>/<image>:<version> biçimi. Bu, kayıt defterindeki imajları ve sürümlerini tanımlamaya yardımcı olur.
- Gerekmesi halinde önceki bir sürüme geri dönebilmeyi sağlamak için imaj versiyonlama uygulamalarını takip etmek esastır. Sürümün adlandırma kuralındaki rolünü gördünüz; sürüm majör sürüm>.<minör sürüm>.<yama sürümü> şeklinde genişletilebilir.
- İmajları latest, staging, production gibi anlamlı etiketlerle etiketlemek de imajları düzenlemeye ve yönetmeye yardımcı olur. Bu, dağıtım hattının farklı ortam ve aşamaları için tasarlanan imajları hızlıca belirlemenizi sağlar.
Kuruluşunuzla uyumlu hareket etmeniz önerilir; tüm ekibin aynı kuralı takip etmesi beklenir.
Sonuç
Bu yazı, veri bilimciler için Docker gibi araçlar kullanarak yeniden üretilebilir kodlar ve uygulamalar oluşturmanın önemini ele aldı. Veri bilimciler için Docker’ın öneminin ana hatlarıyla belirtilmesinden kuruluma yönelik talimatlara ve yaygın Docker komutlarına kadar değindik. Ardından, örnek kodlarla makine öğrenimi uygulamalarını nasıl dockerize edebileceğimizi ve Docker kullanırken takip edilmesi gereken sektör genelinde en iyi uygulamaları inceledik.
Daha fazla öğrenim için, temel unsurların çoğunu kapsayan Introduction to Docker kursumuzu alabilirsiniz. Ayrıca bu alanda çalışıyorsanız bir Docker sertifikası peşinde koşmayı da düşünebilirsiniz.
Çoğu veri bilimci istatistik, matematik, makine öğrenimi, derin öğrenme ve kodlama gibi temel becerilere odaklanır ancak sektörde beklenen yazılım mühendisliği en iyi uygulamalarını öğrenmeyi unutur.
Temel veri bilimi bilginizi sağlamlaştırmak istiyorsanız, projelerle rehberli öğrenim sunan Data Scientist with Python programına göz atın. Alternatif olarak, yazılım mühendisliği becerilerinizi tazelemeniz gerekiyorsa modülerlik, dokümantasyon ve otomatik test gibi temel kavramları kapsayan Python ile veri bilimciler için yazılım mühendisliği kursuna göz atın.
Veri Bilimciler için Docker SSS
Veri bilimciler Docker öğrenmeli mi?
Docker öğrenmek, veri bilimciler için faydalıdır; çünkü bağımlılıkları ve ortamları kolayca yönetmelerine olanak tanır ve kodlarının farklı sistemlerde tutarlı şekilde çalışmasını sağlar. Bu aynı zamanda yalnızca DevOps ekibine güvenmek zorunda kalmayacakları anlamına gelir.
Bir Docker konteynerinde Jupyter Notebook'u nasıl kullanırım?
Bir Docker konteynerinde Jupyter Notebook kullanmak için, yukarıdaki eğitime benzer şekilde yeni bir Dockerfile oluşturup RUN komutuyla Jupyter’ı kurabilirsiniz. Ardından CMD komutunu kullanarak Jupyter Notebook sunucusunu başlatın. Alternatif olarak, Docker Hub’dan Jupyter yüklü hazır imajları kullanabilirsiniz. İşte Jupyter Notebook’u, Docker üzerinden kullanım dahil, ayrıntılı bir kılavuz.
Docker kullanarak veri bilimi projelerimi nasıl paylaşabilirim?
Docker kullanarak veri bilimi projelerinizi bir konteyner kayıt defterine, örneğin Docker Hub’a, imajınızı göndererek paylaşabilirsiniz. Sonrasında başkaları imajı çekip projeyi kendi ortamlarında çalıştırabilir.
