Dockerfile Nedir?
Dockerfile yazarken genellikle yapılandırma talimatları kullanılır ve her bir satır, Docker'a yapılacak bir işlemi anlatır. Bu yazıda, önce temel Dockerfile yazımını öğrenip, ardından ileri seviyeye geçeceğiz.
Temel Dockerfile Yapısı
kopyala# Temel imaj seçimi FROM node:14 # Çalışma dizini oluşturuluyor WORKDIR /app # Paketler yükleniyor COPY package.json . RUN npm install # Uygulama dosyaları kopyalanıyor COPY . . # Sunucu çalıştırılıyor CMD ["npm", "start"]
Bu Dockerfile'da, uygulamanın çalışması için gereken temel adımlar yer almaktadır:
1. FROM: İmajın tabanını belirler. Burada, `node:14` ifadesi, Node.js'in 14. sürümünü içeren bir Docker imajını kullanacağımızı belirtir.
2. WORKDIR: Çalışma dizinini tanımlar. `/app` dizini altında çalışmaya başlayacağız.
3. COPY: Dosya veya klasörleri konteynıra kopyalar. İlk olarak `package.json` dosyasını kopyalıyoruz, ardından tüm uygulama dosyalarını.
4. RUN: Komut çalıştırır. `npm install`, gerekli bağımlılıkları yükler.
5. CMD: Konteynır başladığında çalıştırılacak komut. Bu örnekte, uygulamanın başlatılmasını sağlıyoruz.
Dockerfile’da İleri Seviye Teknikler
# 1. Katmanları Optimize Etmek
Örneğin:
kopyala# İleri düzeyde optimize edilmiş Dockerfile FROM node:14 WORKDIR /app # Bağımlılıkları önce yükleyip, ardından uygulama dosyalarını kopyala COPY package.json package-lock.json ./ RUN npm install COPY . . CMD ["npm", "start"]
Bu şekilde, `COPY package.json package-lock.json ./` ve `RUN npm install` adımlarını ayırarak, yalnızca bağımlılık dosyalarında bir değişiklik olduğunda bu katmanları yeniden oluşturmasını sağlarız. Böylece, uygulama dosyalarında değişiklik olsa bile, bağımlılıklar yeniden yüklenmez ve build süresi kısalır.
# 2. .dockerignore Dosyasını Kullanmak
Örneğin:
kopyala# .dockerignore dosyasına ekleme node_modules *.log .dockerignore Dockerfile
Bu dosya sayesinde, `node_modules`, `.log` dosyaları veya Dockerfile kendisi gibi gereksiz dosyalar imajda yer almaz.
# 3. Çok Aşamalı Build (Multi-Stage Builds)
kopyala# Birinci aşama: Derleme aşaması FROM node:14 AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . # İkinci aşama: Çalıştırma aşaması FROM node:14 WORKDIR /app COPY --from=build /app /app CMD ["npm", "start"]
Bu Dockerfile'da, iki farklı aşama bulunmaktadır. İlk aşama (build), uygulamayı derlerken ikinci aşama sadece gerekli dosyaları alır ve uygulamayı çalıştırır. Bu sayede, yalnızca çalışma için gerekli olan dosyalar Docker imajına dahil edilir, build aşamasındaki dosyalar ise dışarıda bırakılır.
# 4. Env Variables (Çevresel Değişkenler) Kullanmak
kopyala# Çevresel değişken kullanımı ENV NODE_ENV=production FROM node:14 WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . CMD ["npm", "start"]
`ENV` komutuyla çevresel değişkeni ayarlayabilir ve bu değişkeni uygulama içerisinde kullanabilirsiniz.
Sonuç
Dockerfile yazarken sadece temel adımları değil, aynı zamanda uygulamanızın daha hızlı ve daha verimli çalışmasını sağlayacak optimizasyonları da göz önünde bulundurmalısınız. Unutmayın, iyi bir Dockerfile, sadece bir uygulamanın değil, aynı zamanda bir yazılım geliştirme sürecinin de başarısını etkiler.