Çok Aşamalı Derlemeler ve İyileştirme
Görüntüleri küçültün ve derlemeyi çalışma zamanından ayırın.
Çok Aşamalı Derlemeler ve İyileştirme, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Çok Aşamalı Yapılar Neden Kullanılır
Tek aşamalı bir imaj Composer'ı, derleme bağımlılıklarını, geliştirme başlık dosyalarını ve tests/ klasörünüzü üretim ortamına taşır. Çok aşamalı derlemeler, kapsamlı bir derleyici aşamasında derleme ve yükleme yapmanıza, ardından yalnızca tamamlanmış çıktıları yalın bir çalışma zamanı aşamasına kopyalamanıza olanak tanır.
Sonuç: daha küçük imajlar, daha küçük saldırı yüzeyi, daha hızlı indirmeler ve üretime gönderilmeyen derleyiciler.
Adlandırılmış Aşamalar
Her FROM ... AS name yeni bir aşama başlatır. Daha sonraki aşamalar, önceki aşamalardan dosyaları COPY --from=name ile dışarı alabilir. Yalnızca son aşama imajınız olur; ara aşamalar atılır, ancak önbelleğe alınır.
# Stage 1: dependencies
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --prefer-dist --ignore-platform-reqs
# Stage 2: runtime
FROM php:8.3-fpm-alpine AS runtime
WORKDIR /app
COPY --from=vendor /app/vendor ./vendor
COPY . .Derleme Bağımlılıklarını Ayırma
Uzantıları derlemek için autoconf, gcc ve geliştirme başlık dosyaları gerekir; bunların hiçbiri çalışma zamanına ait değildir. Yükleyiciyi bir derleyici aşamasında kullanın, ardından derlenmiş .so dosyalarını ve bunlarla eşleşen conf.d ini dosyasını temiz bir çalışma zamanı aşamasına kopyalayın.
FROM php:8.3-fpm-alpine AS ext-builder
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions redis igbinary opcache intl
FROM php:8.3-fpm-alpine AS runtime
# Copy compiled extensions + their enable configs
COPY --from=ext-builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=ext-builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/Katman Önbelleğe Alma Sırası
Docker katmanları yukarıdan aşağıya önbelleğe alır ve değişen bir katmanın altındaki her şeyi geçersiz kılar. En seyrek değişenden en sık değişene doğru sıralayın:
- Temel imaj + uzantılar (seyrek)
composer.lock+ yükleme (ara sıra)- Uygulama kaynak kodu (her gönderimde)
- Otomatik yükleme dökümü (her gönderimde)
Bu sayede yalnızca koddaki bir değişiklik, önbelleğe alınmış bağımlılık katmanının tamamını yeniden kullanır.
# BAD: copying all source before composer install
# busts the vendor layer on every code change
COPY . .
RUN composer install
# GOOD: lock first, then source
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-autoloader
COPY . .
RUN composer dump-autoload --optimizeBuildKit Önbellek Bağlamaları
BuildKit (DOCKER_BUILDKIT=1) ile imajın içine girmeden derlemeler arasında varlığını sürdüren kalıcı bir önbellek bağlayabilirsiniz. Bu, Composer'ın genel önbelleği için idealdir; böylece tekrarlanan derlemelerde paketler yeniden indirilmez.
# syntax=docker/dockerfile:1
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
RUN --mount=type=cache,target=/tmp/composer-cache \
COMPOSER_CACHE_DIR=/tmp/composer-cache \
composer install --no-dev --prefer-distİmaj Boyutunu Ölçme
Şişkinliği bulmak için katman dağılımını inceleyin. docker history her yönergenin eklediği boyutu gösterir; dive gibi araçlar boşa harcanan alanı gösterir. Amaç; derleyiciler, Composer ve geliştirme bağımlılıkları içermeyen bir çalışma zamanı aşamasıdır.
# Compare sizes
docker images myapp
# Per-layer contribution
docker history --no-trunc --format '{{.Size}}\t{{.CreatedBy}}' myapp:latest
# Deep inspection of wasted bytes
dive myapp:latestSon Aşamayı Sadeleştirme
Çalışma zamanı aşaması Composer'ı, uzantı yükleyici betiğini veya sınama paketinizi İÇERMEMELİDİR. vendor ve kaynak kodunu derleyici aşamalarından kopyalayın; son aşamada hiçbir zaman composer çalıştırmayın. Yükleyiciyi orada çalıştırmanız gerekiyorsa kullandıktan sonra kaldırın.
FROM php:8.3-fpm-alpine AS runtime
WORKDIR /app
# bring extensions + vendor in from builders — no Composer here
COPY --from=ext-builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=ext-builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/
COPY --from=vendor /app/vendor ./vendor
COPY . .
USER www-data
CMD ["php-fpm"]Distroless / Scratch Sınırları
PHP gerçekten boş olan scratch üzerinde çalışamaz; libc ve paylaşılan kitaplıklara ihtiyaç duyar. Pratik alt sınır alpine (musl) veya distroless tarzı asgari Debian'dır. Alpine en küçük seçenektir, ancak glibc bekleyen yerel kitaplıklara dikkat edin; NSS/ICU ile bölümleme hataları alırsanız php:8.3-fpm-bookworm seçeneğine geri dönün.
# Smallest practical PHP runtime
FROM php:8.3-fpm-alpine
# If musl causes native-lib issues (e.g., some ICU edge cases),
# the glibc Debian slim variant is the safe fallback:
# FROM php:8.3-fpm-bookwormAşamaları Hedefleme
Tek bir Dockerfile, --target aracılığıyla geliştirme ve üretim ortamlarına hizmet edebilir. Çalışma zamanının üzerine, Composer geliştirme bağımlılıklarını ve Xdebug'ı yeniden ekleyen bir dev aşaması ekleyin; üretim için --target=runtime, yerel kullanım için --target=dev ile derleyin.
FROM runtime AS dev
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions xdebug @composer
USER root
RUN composer install # includes dev deps
# Build prod: docker build --target runtime -t app:prod .
# Build dev: docker build --target dev -t app:dev .Katman Boyutları Üzerine Akıl Yürütme
Kısa bir zihinsel model, önbellek davranışını öngörmenize yardımcı olur. Bu CLI parçacığı, sınırsız katman büyümesine yol açan klasik hatayla sınırlandırılmış bir katmanı benzetir ve temizleme işlemini aynı RUN içinde birleştirmenin neden önemli olduğunu gösterir.
<?php
// Simulate layer sizes (MB) for two strategies
$installSteps = [120, 8, 8, 8];
// Separate RUN per step keeps temp files in layers
$separate = array_sum($installSteps);
// Single RUN with cleanup removes temp files before commit
$combined = max($installSteps); // peak, then cleaned
echo "Separate layers total: {$separate} MB\n";
echo "Combined+cleanup: {$combined} MB\n";
echo 'Saved: ' . ($separate - $combined) . " MB\n";
?>Tek Bir RUN İçinde Birleştirin ve Temizleyin
Her RUN bir katmandır; dosyaları daha sonraki bir katmanda silmek imajı küçültmez, çünkü önceki katmanlar baytları hâlâ içerir. Geçici dosyaların kaydedilmemesi için yükleme, kullanma ve temizleme işlemlerini tek bir RUN içinde yapın.
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS && \
pecl install redis && \
docker-php-ext-enable redis && \
apk del .build-deps && \
rm -rf /tmp/pear /var/cache/apk/*Hızlı Kontrol
Derleme bağımlılıkları neden onları yükleyen RUN ile aynı RUN içinde kaldırılmalıdır?
Özet
Çok aşamalı derlemeler, derleyicileri ve geliştirme bağımlılıklarını üretim ortamının dışında tutar. Şunları öğrendiniz: aşamaları adlandırmayı ve yapıtları COPY --from ile kopyalamayı, önbelleğe alma için katmanları en az değişenden en çok değişene doğru sıralamayı, Composer için BuildKit önbellek bağlamalarını kullanmayı, boyutu docker history/dive ile ölçmeyi, alpine ile glibc arasında bilinçli seçim yapmayı, geliştirme ve üretim aşamalarını hedeflemeyi ve yükleme ile temizlemeyi tek bir RUN içinde birleştirmeyi.
Sıkça Sorulan Sorular
“Çok Aşamalı Derlemeler ve İyileştirme” dersi ücretsiz mi?
Evet — “Çok Aşamalı Derlemeler ve İyileştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Çok Aşamalı Derlemeler ve İyileştirme” dersinde ne öğreneceğim?
Görüntüleri küçültün ve derlemeyi çalışma zamanından ayırın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Çok Aşamalı Derlemeler ve İyileştirme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- PHP Uygulamasını Kapsayıcılaştırma
- Çok Aşamalı Derlemeler ve İyileştirme
- Yerel Yığınlar için Docker Compose
- GitHub Actions ile CI/CD