Docker
Docker; kodu, kitaplıkları ve model ağırlıklarını dizüstü bilgisayarlarda, GPU sunucularında, CI çalıştırıcılarında ve uç cihazlarda aynı şekilde çalışan kapsayıcı görüntülerinde paketler.
Docker, uygulamaları kapsayıcılarda oluşturmak, paylaşmak ve çalıştırmak için kullanılan açık kaynaklı bir platformdur: kapsayıcılar, kodu, kütüphaneleri ve sistem paketlerini içeren kendi dosya sistemlerine sahip yalıtılmış süreçlerdir ve ana makinenin işletim sistemi çekirdeğini paylaşırlar. Daha sonra adını Docker, Inc. olarak değiştiren dotCloud şirketi, platformu Mart 2013'te açık kaynaklı hâle getirdi; komut satırı aracı, katmanlı görüntü biçimi ve herkese açık kayıt defteri, Linux kapsayıcılarını geliştiricilerin gündelik araçlarından biri yaptı. Makine öğreniminde bir Docker görüntüsü, tam Python sürümünü, CUDA kütüphanelerini, PyTorch derlemesini ve model ağırlıklarını sabitler; böylece model bir dizüstü bilgisayarda, GPU sunucusunda, sürekli entegrasyon çalıştırıcısında ve uç cihazda aynı şekilde davranır.
Docker Nasıl Çalışır#
Bir Dockerfile, görüntüyü oluşturan adımları listeler: başlangıçta kullanılacak bir temel görüntü, paketleri yükleyen komutlar, kopyalanacak dosyalar ve başlangıçta çalıştırılacak komut. Her RUN, COPY veya ADD yönergesi salt okunur bir katman ekler; sonraki derleme, bir yönerge ya da onun giriş dosyalarından biri değişene kadar önbelleğe alınmış katmanları yeniden kullanır. Böylece erken yüklenen bağımlılıklar önbellekte kalırken uygulama kodu saniyeler içinde yeniden derlenir. Görüntü, bu katman yığınına üst verilerin eklenmiş hâlidir. Kapsayıcı ise görüntünün üzerinde ince bir yazılabilir katman bulunan çalışan örneğidir; veriler bağlanmış bir birime yazılmadığı sürece kapsayıcı silindiğinde bu katman da silinir.
docker komutu, her kapsayıcıyı containerd'ye ve düşük seviyeli runc çalışma zamanına devreden arka plan hizmeti Docker Engine ile iletişim kurar. Bunlar, kapsayıcının süreçlerini, ağını ve dosya sistemini yalıtmak için Linux ad alanlarını; CPU ve bellek kullanımını sınırlamak içinse cgroups'u kullanır. Görüntüler Docker Hub, GitHub Container Registry, NVIDIA NGC ve her bulut sağlayıcısının kendi kayıt defteri gibi kayıt defterleri üzerinden paylaşılır. Görüntüler, Open Container Initiative görüntü biçimini izler; bu nedenle Podman, containerd ve Kubernetes görüntüleri değiştirmeden çalıştırabilir.
Ultralytics, CUDA GPU'ları, CPU'lar, ARM64 kartlar, NVIDIA Jetson cihazları ve AMD GPU'ları dâhil her donanım hedefi için resmî Docker görüntüleri yayımlar; yeniden üretilebilir derlemeler için her görüntü Ultralytics sürüm numarasıyla da etiketlenir. Aşağıda kullanılan hafif latest-python görüntüsü Python, PyTorch, ultralytics paketi ve YOLO26 nano ağırlıklarını zaten içerir; bu nedenle projenin Dockerfile'ına yalnızca kendi kodunu eklemen yeterlidir:
# Official Ultralytics CPU image with Python, PyTorch, ultralytics, and yolo26n.pt
FROM ultralytics/ultralytics:latest-python
# Install extra dependencies in their own layer, cached until requirements.txt changes
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the application last, so code edits rebuild only this layer
COPY app.py .
# Command every container runs when it starts
CMD ["python", "app.py"]docker build -t yolo-app . bu dosyayı ve yanındaki dosyaları bir görüntüye dönüştürür; docker run --rm yolo-app ise bu görüntüden bir kapsayıcı başlatır. Görüntüyü bir kayıt defterine gönderdiğinde, başka herhangi bir makine aynı ortamı çekip çalıştırabilir; örneğin bir model sunma API'si veya her gece çalışan bir çıkarım işi olarak.
Makine Öğrenimi için Docker#
Kapsayıcılar GPU'lara NVIDIA Container Toolkit üzerinden erişir. NVIDIA sürücüsü ana makinede kalır, görüntü ise yalnızca sürücü tarafından desteklenmesi gereken CUDA kullanıcı alanı kütüphanelerini içerir. Linux'ta Docker 28.2 ve sonraki sürümlerde CDI varsayılan olarak etkindir; bu nedenle --device nvidia.com/gpu=all, GPU'ları CDI cihazları olarak ister ve eski --gpus all bayrağının ana makine systemd'yi yeniden yüklediğinde kaybedebileceği GPU erişimini uzun süre çalışan kapsayıcılarda korur.
Eğitim için iki ayar daha önemlidir. PyTorch veri yükleyici çalışanları, grupları eğitim sürecine /dev/shm içindeki paylaşılan bellek üzerinden iletir; Docker bu belleği varsayılan olarak 64 MB ile sınırlar. Bu nedenle eğitim kapsayıcıları --ipc=host veya daha büyük bir --shm-size ile çalıştırılır. Veri kümeleri ve çıktılar bağlanmış birimlerde tutulmalıdır; çünkü denetim noktalarını kapsayıcının içine yazan bir eğitim çalıştırmasının çıktıları, kapsayıcı kaldırıldığında kaybolur. latest yerine bir sürüm etiketi ya da görüntü özeti sabitlemek, dağıtık eğitim işinin veya model dağıtımının her makinede aynı görüntüyü kullanmasını sağlar; hem NVIDIA Triton Inference Server gibi çıkarım sunucuları hem de Vertex AI gibi yönetilen hizmetler modelleri kapsayıcı görüntüleri olarak çalıştırır.
Docker, Sanal Makineler ve Kubernetes Karşılaştırması#
- Sanal makineler: Bir hipervizör donanımı taklit eder ve her VM kendi konuk çekirdeğini başlatır. Bu, iş yüklerini daha güçlü biçimde yalıtır ve herhangi bir konuk işletim sisteminin kullanılmasına olanak tanır; ancak her VM için tam bir işletim sistemi görüntüsü gerekir ve başlatma süresi uzar. Kapsayıcılar ana makinenin Linux çekirdeğini paylaştığından, macOS ve Windows'taki Docker Desktop bunları hafif bir Linux VM içinde çalıştırır.
- Docker Compose: Çıkarım API'si, önbellek ve metrik toplayıcı gibi aynı ana makinede birlikte çalışan birden çok kapsayıcıyı tanımlar.
- Kubernetes: Kapsayıcıları bir kümede zamanlar, arızalananları yeniden başlatır ve çoğaltma sayısını trafiğe göre ölçeklendirir. Kubernetes 1.24, Docker Engine için yerleşik bağdaştırıcısı olan dockershim'i kaldırdı; bu nedenle kümeler kapsayıcıları containerd veya CRI-O üzerinden çalıştırır. Docker ile oluşturulmuş görüntüler standart OCI görüntüleri oldukları için burada da çalışır.










