Binaan Berbilang Peringkat dan Pengoptimuman
Kecilkan imej dan asingkan binaan daripada masa jalan.
Binaan Berbilang Peringkat dan Pengoptimuman ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Mengapa Berbilang Peringkat
Imej satu peringkat membawa Composer, kebergantungan binaan, pengepala pembangunan dan folder tests/ ke dalam produksi. Binaan berbilang peringkat membolehkan anda menyusun atau memasang dalam peringkat pembina yang lengkap, kemudian menyalin hanya artifak siap ke dalam peringkat masa jalan yang ringkas.
Hasilnya: imej lebih kecil, permukaan serangan lebih kecil, muat turun lebih pantas dan tiada pengkompil dihantar ke produksi.
Peringkat Bernama
Setiap FROM ... AS name memulakan peringkat baharu. Peringkat kemudian boleh menyalin fail daripada peringkat terdahulu menggunakan COPY --from=name. Hanya peringkat akhir menjadi imej anda; peringkat perantara dibuang tetapi kekal dalam cache.
# 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 . .Memisahkan Kebergantungan Binaan
Penyusunan sambungan memerlukan autoconf, gcc dan pengepala pembangunan — tiada satu pun diperlukan dalam masa jalan. Gunakan pemasang dalam peringkat pembina, kemudian salin fail .so yang telah dikompil dan fail konfigurasi conf.d yang sepadan ke dalam peringkat masa jalan yang bersih.
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/Susunan Penyimpanan Lapisan dalam Cache
Docker menyimpan lapisan dalam cache dari atas ke bawah dan membatalkan semua lapisan di bawah lapisan yang berubah. Susun daripada yang paling jarang hingga yang paling kerap berubah:
- Pangkalan + sambungan (jarang)
composer.lock+ pemasangan (sekali-sekala)- Kod sumber aplikasi (setiap komit)
- Pembuangan pemuatan automatik (setiap komit)
Ini bermakna perubahan pada kod sahaja menggunakan semula seluruh lapisan vendor dalam cache.
# 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 --optimizeLekapan Cache BuildKit
Dengan BuildKit (DOCKER_BUILDKIT=1), anda boleh melekapkan cache berterusan yang kekal antara binaan tanpa dimasukkan ke dalam imej. Ini sangat sesuai untuk cache global Composer supaya binaan berulang tidak perlu memuat turun semula pakej.
# 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-distMengukur Saiz Imej
Periksa pecahan lapisan untuk mencari lebihan saiz. docker history menunjukkan saiz yang ditambahkan oleh setiap arahan; alat seperti dive menunjukkan ruang yang terbuang. Matlamatnya ialah peringkat masa jalan tanpa pengkompil, tanpa Composer dan tanpa kebergantungan pembangunan.
# 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:latestMenanggalkan Kandungan daripada Peringkat Akhir
Peringkat masa jalan hendaklah NOT mengandungi Composer, skrip pemasangan sambungan atau koleksi ujian anda. Salin vendor dan kod sumber daripada peringkat pembina; jangan sekali-kali jalankan composer dalam peringkat akhir. Jika anda mesti menjalankannya di situ, buang pemasang selepas digunakan.
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"]Had Distroless / Scratch
PHP tidak boleh dijalankan pada scratch yang benar-benar kosong — ia memerlukan libc dan pustaka dikongsi. Had praktikal minimum ialah alpine (musl) atau Debian minimum bergaya distroless. Alpine ialah pilihan paling kecil, tetapi berhati-hati terhadap pustaka natif yang menjangkakan glibc; jika anda mengalami kesalahan pelanggaran segmen dengan NSS/ICU, beralih kepada php:8.3-fpm-bookworm.
# 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-bookwormMenyasarkan Peringkat
Satu Dockerfile boleh digunakan untuk pembangunan dan produksi melalui --target. Tambahkan peringkat dev di atas peringkat masa jalan yang menambah semula kebergantungan pembangunan Composer dan Xdebug; bina dengan --target=runtime untuk produksi dan --target=dev secara tempatan.
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 .Menaakul tentang Saiz Lapisan
Gambaran mental ringkas membantu anda meramalkan tingkah laku cache. Petikan CLI ini mensimulasikan kesilapan klasik pertumbuhan lapisan tanpa had berbanding pertumbuhan yang dihadkan, dan menerangkan sebab penggabungan pembersihan dalam RUN yang sama penting.
<?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";
?>Gabungkan dan Bersihkan dalam Satu RUN
Setiap RUN ialah lapisan; memadamkan fail dalam lapisan kemudian tidak mengecilkan imej kerana lapisan terdahulu masih menyimpan bait tersebut. Pasang, gunakan dan bersihkan dalam satu RUN supaya fail sementara tidak pernah direkodkan dalam imej.
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/*Semakan Ringkas
Mengapakah kebergantungan binaan mesti dibuang dalam RUN yang sama ketika ia dipasang?
Ulang Kaji
Binaan berbilang peringkat memastikan pengkompil dan kebergantungan pembangunan tidak masuk ke dalam produksi. Anda telah mempelajari cara menamakan peringkat dan menyalin artifak menggunakan COPY --from, menyusun lapisan daripada yang paling kurang hingga paling mudah berubah untuk cache, menggunakan lekapan cache BuildKit untuk Composer, mengukur saiz dengan docker history/dive, memilih alpine atau glibc dengan sengaja, menyasarkan peringkat pembangunan atau produksi dan menggabungkan pemasangan serta pembersihan dalam satu RUN.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “Binaan Berbilang Peringkat dan Pengoptimuman” percuma?
Ya — teks penuh “Binaan Berbilang Peringkat dan Pengoptimuman” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Binaan Berbilang Peringkat dan Pengoptimuman”?
Kecilkan imej dan asingkan binaan daripada masa jalan. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Binaan Berbilang Peringkat dan Pengoptimuman” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Menjadikan Aplikasi PHP sebagai Kontena
- Binaan Berbilang Peringkat dan Pengoptimuman
- Docker Compose untuk Timbunan Tempatan
- CI/CD dengan GitHub Actions