Dockerfile Nedir ve Neden Önemlidir?
Temel Dockerfile Yapısı
kopyala# Temel imajı al FROM node:14 # Çalışma dizini oluştur WORKDIR /app # package.json ve package-lock.json dosyalarını kopyala COPY package*.json ./ # Bağımlılıkları yükle RUN npm install # Uygulama dosyalarını kopyala COPY . . # Uygulamanın çalışacağı portu belirle EXPOSE 3000 # Uygulama başlatma komutu CMD ["npm", "start"]
Yukarıdaki örnek, bir Node.js uygulaması için yazılmış bir Dockerfile’dır. Temel olarak, bu dosya aşağıdaki adımları içerir:
1. FROM komutu, temel bir imaj seçer. Burada Node.js 14 sürümü kullanılmaktadır.
2. WORKDIR komutu, konteyner içinde bir çalışma dizini belirler.
3. COPY komutları, gerekli dosyaları konteynere kopyalar.
4. RUN komutu, bağımlılıkları yüklemek için kullanılır.
5. EXPOSE komutu, uygulamanın dinleyeceği portu belirtir.
6. CMD komutu, konteyner çalıştırıldığında hangi komutun çalışacağını belirtir.
Dockerfile’daki İleri Seviye Teknikler
Aşamalı build, Dockerfile içerisinde birden fazla aşama kullanarak gereksiz dosyaları ve bağımlılıkları son imajda bulundurmaz. Bu, imaj boyutunun küçülmesine yardımcı olur.
kopyala# 1. Aşama: Build aşaması FROM node:14 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . # 2. Aşama: Final imajı FROM node:14 WORKDIR /app COPY --from=builder /app /app EXPOSE 3000 CMD ["npm", "start"]
Yukarıdaki örnekte, uygulama önce `builder` aşamasında derlenir ve sonrasında yalnızca gerekli dosyalar, ikinci aşamaya kopyalanır. Bu sayede yalnızca gerekli dosyalar son imajda yer alır ve imaj boyutu küçülür.
Dockerfile’ın bulunduğu dizinde `.dockerignore` dosyasını kullanarak, konteynerin içine kopyalanmasını istemediğiniz dosyaları belirtebilirsiniz. Bu, imajın gereksiz dosyalarla şişmesini engeller.
Örneğin, `.git`, `node_modules`, `log` dosyaları gibi istemediğiniz klasörleri bu dosyaya ekleyebilirsiniz:
kopyala.git node_modules *.log
Docker, her komut için bir önbellek (cache) tutar. Eğer bağımlılıkları kurmak gibi işlemleri daha optimize hale getirmek isterseniz, Docker’ın cache mekanizmasından yararlanabilirsiniz.
Örneğin, `npm install` komutunu yalnızca `package.json` ve `package-lock.json` dosyaları değiştiğinde çalıştırmak için şu şekilde yazabilirsiniz:
kopyalaCOPY package*.json ./ RUN npm install COPY . .
Bu şekilde, `npm install` komutu yalnızca bu iki dosya değiştiğinde yeniden çalıştırılır, diğer değişikliklerde Docker cache’i kullanarak işlemi hızlandırır.
Dockerfile Yazarken Dikkat Edilmesi Gereken İpuçları
2. Yalnızca Gereksiz Dosyaları Kopyalamayın: `.dockerignore` dosyasını kullanarak gereksiz dosyaların imaja eklenmesini engelleyin.
3. Aşamalı Build’leri Kullanın: Özellikle büyük uygulamalarda aşamalı build’ler kullanarak yalnızca gerekli dosyaları son imajda bulundurun.
Sonuç: Dockerfile ile Verimli Konteynerler
Eğer Docker’ı projelerinizde daha verimli kullanmak istiyorsanız, Dockerfile yazmayı öğrenmek ve doğru uygulamalar kullanmak çok önemli. Artık Dockerfile yazmaya hazırsınız!