Dockerfile Nedir ve Neden Önemlidir?
Temel Dockerfile Yapısı
# 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.
# 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:
.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:
COPY 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!