Dockerfile Nedir?
Temel Dockerfile Yapısı
1. FROM: İmajın tabanını seçer. Örneğin, bir Python uygulaması geliştirecekseniz, Python'un resmi imajını kullanabilirsiniz.
2. RUN: Komutları çalıştırır. Uygulamanız için gerekli yazılımları yükleyebilirsiniz.
3. COPY: Dosyaları konteynıra kopyalar.
4. CMD: Konteynır başlatıldığında çalıştırılacak komutu belirtir.
İşte basit bir Dockerfile örneği:
# Temel imaj olarak Python kullanıyoruz
FROM python:3.8-slim
# Çalışma dizinini belirliyoruz
WORKDIR /app
# Gereksinim dosyasını kopyalayıp gerekli paketleri yüklüyoruz
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Uygulama dosyalarını kopyalıyoruz
COPY . .
# Uygulamayı çalıştırıyoruz
CMD ["python", "app.py"]
Yukarıdaki Dockerfile, bir Python uygulamasını çalıştırmak için temel adımları içeriyor. Başka bir yazılım dili kullanıyorsanız, `FROM` komutunda ilgili imajı seçmeniz yeterli olacaktır.
Dockerfile'da Temel Prensipler
1. Katmanlar ve Optimizasyon: Docker, her `RUN`, `COPY`, `ADD` komutunu ayrı bir katman olarak işler. Yani her komut yeni bir imaj katmanı oluşturur. Bu, imajın boyutunu artırabilir. Bu yüzden gereksiz komutlardan kaçının ve katmanları mümkün olduğunca azaltın. Örneğin, çok sayıda `RUN` komutunu tek bir komutta birleştirerek bu katman sayısını düşürebilirsiniz.
2. Cache Kullanımı: Docker, her adımda önbelleğe alır. Eğer bir adımda değişiklik yapılmadıysa, Docker önceden oluşturulan katmanı tekrar kullanacaktır. Bu, imaj oluşturma süresini kısaltır.
3. .dockerignore Kullanımı: Docker, imajı oluştururken hangi dosyaların kopyalanacağını belirler. `.dockerignore` dosyasını kullanarak gereksiz dosyaların imaja dahil olmasını engelleyebilirsiniz. Bu, imajınızın daha küçük ve hızlı olmasını sağlar.
Örnek bir `.dockerignore` dosyası:
__pycache__
*.pyc
*.pyo
*.git
node_modules
İleri Seviye Dockerfile Teknikleri
# 1. Çok Aşamalı Dockerfile (Multi-Stage Builds)
Çok aşamalı bir Dockerfile şu şekilde görünebilir:
# Geliştirme aşaması
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
# Üretim aşaması
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Bu yöntemde, ilk aşamada tüm geliştirme araçlarını ve bağımlılıkları yüklerken, ikinci aşamada sadece üretim için gerekli olan dosyalar kopyalanır. Bu sayede, daha küçük ve hızlı bir imaj elde edebilirsiniz.
# 2. Ortam Değişkenleri ile Konfigürasyon
Örnek:
# Ortam değişkeni tanımlıyoruz
ENV APP_ENV=production
ENV DB_HOST=localhost
# Ortam değişkenlerini kullanıyoruz
CMD ["sh", "-c", "echo $APP_ENV && echo $DB_HOST"]
Burada, `ENV` komutuyla ortam değişkenlerini tanımlıyoruz ve bu değişkenlere Dockerfile'daki diğer komutlarda erişebiliyoruz.
# 3. Çalışma Zamanı Performans Optimizasyonu
Örneğin, sadece gerekli olan dosyaları konteynıra kopyalayın ve mümkünse sadece belirli dosya türlerini kopyalayın:
COPY ./app /app
COPY ./config /config
Dockerfile'ın Güçlü Yönleri
Bu yazıda Dockerfile yazmaya dair temel bilgileri ve ileri seviye teknikleri öğrendiniz. Unutmayın, Dockerfile'lar sadece bir yazılımın her yerde çalışabilmesi için değil, aynı zamanda her ortama uygun ve ölçeklenebilir hale gelmesini sağlamak için çok önemli araçlardır.