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ı
# 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:
# İ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:
# .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)
# 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
# Ç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.