Çoğu Laravel Docker eğitimi, 800MB boyutunda bir imaj üreten bir Dockerfile sunar. Ancak benim imajım sadece 120MB. İşte bu nasıl mümkün oldu ve neden önemli?
Tek Aşamalı Dockerfile’ın Sorunu
Tek Aşamalı Dockerfile’ın Sorunu
Composer, Node.js, npm ve tüm geliştirme bağımlılıklarını tek bir katmanda kurduğunuzda, her bir araç üretim imajınıza dahil olur. Bu durumda, imajınız gereksiz yere gigabaytlarca yazılım taşır ve bu yazılımların üretim sunucusunda hiçbir yeri yoktur.
Çözüm: Çok Aşamalı Yapılar
Çözüm: Çok Aşamalı Yapılar
Docker, tek bir Dockerfile içinde birden fazla aşama tanımlamanıza olanak tanır. Aşama 1, Composer’ı kurar, npm’i çalıştırır ve Vite varlıklarınızı derler. Aşama 2 tamamen temiz başlar, sadece derlenmiş çıktıyı kopyalar ve başka hiçbir şeyi taşımaz.
# Aşama 1: builder — her şeyi kurar, varlıkları derler
FROM php:8.3-cli AS builder
RUN apt-get update && apt-get install -y git nodejs npm \
&& curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader
COPY package.json package-lock.json ./
RUN npm ci && npm run build
COPY . .
# Aşama 2: production — temiz başlar, yalnızca derlenmiş çıktıyı kopyalar
FROM php:8.3-fpm-alpine AS production
RUN apk add --no-cache nginx supervisor
COPY --from=builder /app /var/www/html
EXPOSE 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
Sonuç
Sonuç
| Tek Aşamalı | Çok Aşamalı | |
|---|---|---|
| İmaj boyutu | ~800MB | ~120MB |
| Üretimde kurulu araçlar | Evet (güvenlik riski) | Hayır |
| Deploy hızı | Yavaş | Hızlı |
Her Aşamada Ne Olmalı
Her Aşamada Ne Olmalı
Aşama 1 ihtiyacı olanlar: Composer, Node.js, npm, git, PHP uzantıları için geliştirme başlıkları. Aşama 2 ihtiyacı olanlar: PHP-FPM, Nginx, Supervisor ve derlenmiş uygulama. Başka hiçbiri değil.
COPY Sırasının Önemli Olması
COPY Sırasının Önemli Olması
composer.json dosyasını, diğer dosyalardan önce kopyalayın. Docker, her katmanı önbelleğe alır — eğer PHP dosyalarınız değişmezken composer.json değişmezse, Docker tüm paketlerin yeniden kurulumunu atlar. Bu, her bir derlemeden 2–3 dakika tasarruf sağlar.
COPY composer.json composer.lock ./ # bağımlılıklar değişmediği sürece önbelleğe alınacak
RUN composer install --no-dev
COPY . . # kod değişikliklerinde yalnızca bu katman tekrar çalışır
Kendiniz Deneyin
Kendiniz Deneyin
Basit bir Dockerfile ile bir kez derleyin, ardından çok aşamalı olanla derleyin. docker images komutunu çalıştırın ve boyutları karşılaştırın. Bu fark, Docker’a bakış açınızı sonsuza dek değiştirecektir.
Bütün bu yığın için — Docker, GitHub Actions CI/CD, Kubernetes ve SQLite’in üretim veritabanı olarak kullanımı hakkında 50 sayfa kapsamlı bir kılavuz yazdım. Tam kurulum için profilimdeki bağlantıyı bulabilirsiniz.
Kaynak: Orijinal Makale


