Dockerfile Nedir?
Dockerfile, Docker konteynerları oluştururken kullanılan bir betik dosyasıdır. Bir Dockerfile, konteynerın nasıl yapılandırılacağını, hangi yazılımların yükleneceğini ve hangi komutların çalıştırılacağını belirten talimatları içerir. Bu dosya, genellikle bir uygulamanın veya servisin çalışması için gerekli tüm adımları içerir ve Docker imajlarını oluşturmak için kullanılır.
Temel Dockerfile Yapısı
Bir Dockerfile yazmaya başladığınızda, temel komutları ve yapı taşlarını bilmek önemlidir. Şimdi, bir Dockerfile’ın nasıl yazıldığını adım adım inceleyelim.
# Base image
FROM python:3.9-slim
# Set working directory
WORKDIR /app
# Copy files
COPY . /app
# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Expose port
EXPOSE 5000
# Run application
CMD ["python", "app.py"]
```
Bu basit Dockerfile’ı detaylıca inceleyelim:
1. FROM: Bu komut, hangi Docker imajını temel alacağınızı belirtir. `python:3.9-slim` gibi bir Python imajı kullanıyoruz.
2. WORKDIR: Çalışma dizinini belirler. Konteynerın içerisindeki `/app` klasörüne gidiyoruz.
3. COPY: Dışarıdaki dosyaları konteynerın içine kopyalar. Burada, proje dosyalarımızı `/app` klasörüne kopyalıyoruz.
4. RUN: Komutları çalıştırmak için kullanılır. Burada, Python bağımlılıklarını yüklemek için `pip` komutunu kullanıyoruz.
5. EXPOSE: Konteynerın dış dünyaya hangi portları açacağını belirtir.
6. CMD: Konteyner başlatıldığında çalışacak komutu belirler. Burada, `python app.py` komutunu kullanıyoruz.
İleri Seviye Dockerfile Teknikleri
Dockerfile yazmanın temelini öğrendiniz, ancak gelişmiş seviyeye adım atmak için daha fazlasını öğrenmelisiniz. İleri seviyede kullanabileceğiniz bazı teknikler:
Multistage build, daha verimli Docker imajları oluşturmak için kullanılan bir tekniktir. Bu yöntem, her aşama için farklı imajlar kullanarak, gereksiz dosyaların son imaja dahil edilmemesini sağlar. Bu sayede daha küçük ve hızlı Docker imajları elde edebilirsiniz.
```dockerfile
# Build Stage
FROM node:16 AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
# Final Stage
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
```
Bu örnekte, ilk aşama sadece uygulamayı derlerken, ikinci aşama sadece derlenen dosyaları kopyalar ve Nginx üzerinden sunar. Bu sayede son imaj daha küçük olur.
# 2. Cache Kullanımı
Docker, `RUN` komutlarının her birini önceden cache’ler. Bu özellik, Dockerfile’da daha önce yapılan değişikliklerin tekrar çalıştırılmasını engeller. Ancak, gereksiz cache kullanımı da imaj boyutunun artmasına neden olabilir. O yüzden, özellikle bağımlılık yüklemelerinde `COPY` komutunu doğru sırayla kullanmak önemlidir.
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
```
Bu sırayla `COPY` komutlarını yazmak, sadece bağımlılıklar değiştiğinde `RUN` komutunu tekrar çalıştırır. Proje dosyaları değiştiğinde ise tekrar bağımlılıkları yüklemez.
# 3. ARG ve ENV Kullanımı
`ARG` ve `ENV` komutları, Dockerfile’da ortam değişkenlerini tanımlamanıza olanak tanır. `ARG`, build zamanında kullanılacak değişkenleri tanımlarken, `ENV` ise konteyner çalışırken erişilebilecek ortam değişkenlerini tanımlar.
ARG NODE_ENV=production
ENV NODE_ENV $NODE_ENV
```
Bu sayede, build ve runtime sırasında ortam değişkenlerini kullanabilirsiniz.
# 4. Docker Compose ile Entegre Kullanım
Birden fazla konteyneri bir arada çalıştırmanız gerektiğinde Docker Compose devreye girer. Bu araç, Dockerfile’ı daha geniş bir uygulama yapısına entegre etmenizi sağlar.
Dockerfile yazmak, başta karmaşık gibi görünebilir, ancak zamanla daha verimli ve esnek konteynerlar oluşturmak için çok faydalıdır. Temel komutlarla başlayarak, multistage build ve cache yönetimi gibi ileri seviye tekniklerle Docker imajlarınızı daha verimli hale getirebilirsiniz. Dockerfile yazmak, sadece bir konteyner oluşturmanın ötesine geçer; aynı zamanda uygulamanızın taşınabilirliğini ve sürdürülebilirliğini artıran bir beceri haline gelir.