Menjadikan Aplikasi PHP sebagai Kontena
Tulis Dockerfile PHP yang sedia untuk pengeluaran.
Menjadikan Aplikasi PHP sebagai Kontena ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 1 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 Menggunakan Bekas untuk PHP
Menyediakan PHP secara konsisten bermaksud membekukan versi jurubahasa, sambungan dan pustaka OS yang tepat bersama kod anda. Imej Docker memberikan setiap persekitaran — komputer riba, CI dan produksi — php -v yang sama serta set ext-* yang sama.
Dalam pelajaran ini, kita membina imej yang sedia untuk produksi: PHP-FPM, hanya sambungan yang diperlukan, konfigurasi yang ditala, pengguna bukan root dan pemeriksaan kesihatan.
Asas FPM berbanding Apache
Imej PHP rasmi hadir dalam beberapa variasi. Untuk aplikasi web produksi di belakang nginx atau traefik, utamakan php:8.3-fpm-alpine (kecil) atau php:8.3-fpm (Debian, glibc — kurang kejutan dengan pustaka asli).
cli— pekerja, baris gilir dan tugas cronfpm— pengurus proses FastCGI, dipasangkan dengan nginxapache— Apache berbundel, mudah tetapi lebih berat
Tetapkan versi minor. Jangan sekali-kali gunakan :latest dalam produksi.
# Base image choice in your Dockerfile
FROM php:8.3-fpm-alpine AS base
# Why alpine? ~30MB base vs ~140MB Debian.
# Tradeoff: musl libc, occasional native-extension friction.Memasang Sambungan
Jangan sekali-kali menggunakan apt install php-xxx dalam imej ini — gunakan pembantu terbina dalam docker-php-ext-install, docker-php-ext-configure dan pecl. Skrip install-php-extensions (mlocati) ialah jalan pintas standard yang mendapatkan pengepala pembangunan yang betul untuk anda.
FROM php:8.3-fpm-alpine
# Grab the helper that resolves build deps automatically
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 \
pdo_mysql \
opcache \
intl \
zip \
redis \
bcmathComposer dalam Imej
Salin binari Composer daripada imej rasminya dan bukannya memuat turun pemasang menggunakan arahan curl. Jalankan composer install dengan --no-dev dan --optimize-autoloader untuk produksi, dan salin hanya composer.json/composer.lock terlebih dahulu supaya lapisan kebergantungan boleh disimpan dalam cache secara berasingan daripada perubahan kod sumber.
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
# Cache-friendly: deps layer invalidates only when lock changes
COPY composer.json composer.lock ./
RUN composer install \
--no-dev \
--no-scripts \
--no-autoloader \
--prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritativeMenala php.ini
Imej asas menyediakan templat php.ini-production dan php.ini-development. Aktifkan templat produksi, kemudian letakkan penggantian anda sendiri ke dalam conf.d — direktori itu digabungkan terakhir, jadi tetapan di dalamnya akan mengatasi tetapan lain.
Nilai produksi utama: opcache.enable=1, opcache.validate_timestamps=0 (kod tidak berubah dalam imej) dan memory_limit yang munasabah.
# Activate production ini
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# Custom overrides win because conf.d loads last
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/zz-app.iniFail Penggantian OPcache
Inilah peningkatan produksi terbesar. Dengan validate_timestamps=0, PHP tidak pernah memeriksa maklumat fail pada setiap permintaan — tetapi ini bermakna anda MUST membina semula imej untuk menerapkan perubahan (tepat seperti yang dikehendaki bagi bekas yang tidak berubah).
; docker/php/zz-app.ini
memory_limit = 256M
expose_php = Off
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 0
opcache.preload = /app/preload.php
opcache.preload_user = www-dataJalankan Tanpa Root
Imej itu sudah mentakrifkan www-data. Menjalankan FPM sebagai root meningkatkan permukaan serangan tanpa keperluan. Tetapkan pemilikan laluan yang boleh ditulis (cache, log) dan tukar pengguna dengan USER sebelum CMD.
Adakah induk FPM masih mengikat port berkeistimewaan? Tidak — FPM mendengar pada port 9000 (tanpa keistimewaan), jadi menjalankannya tanpa root adalah mudah.
# Make runtime-writable dirs owned by the runtime user
RUN chown -R www-data:www-data /app/var /app/storage 2>/dev/null || true
USER www-data
EXPOSE 9000
CMD ["php-fpm"]Pemeriksaan Kesihatan
Penyelaras memerlukan isyarat bahawa FPM benar-benar hidup, bukan sekadar prosesnya wujud. cgi-fcgi boleh melakukan ping kepada titik akhir FPM /status atau /ping. Aktifkan pm.status_path dan ping.path dalam himpunan FPM terlebih dahulu.
# In www.conf pool config:
; ping.path = /ping
; ping.response = pong
# Dockerfile HEALTHCHECK using cgi-fcgi
RUN install-php-extensions @composer >/dev/null 2>&1 || true
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1Menyusun Dockerfile
Berikut ialah Dockerfile produksi satu peringkat yang lengkap dan koheren. Dalam pelajaran seterusnya, kita akan memecahkannya kepada beberapa peringkat untuk membuang alat binaan. Perhatikan susunannya: kebergantungan → konfigurasi → kod sumber → pemuatan automatik → pertukaran pengguna.
FROM php:8.3-fpm-alpine
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 pdo_mysql opcache intl zip redis
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative && \
chown -R www-data:www-data /app/var
USER www-data
EXPOSE 9000
CMD ["php-fpm"]Mengesahkan Binaan
Selepas membina, lakukan semakan asas terhadap perkara yang sebenarnya dimasukkan ke dalam imej: versi PHP, sambungan yang dimuatkan, dan pastikan pengesahan OPcache dimatikan. Skrip CLI ringkas mengesahkan kontrak masa jalan yang diperlukan oleh aplikasi anda.
<?php
// Run inside the container: php verify.php
echo 'PHP ' . PHP_VERSION . PHP_EOL;
$required = ['pdo_mysql', 'opcache', 'intl', 'zip'];
foreach ($required as $ext) {
printf("%-12s %s\n", $ext, extension_loaded($ext) ? 'OK' : 'MISSING');
}
var_dump((bool) ini_get('opcache.enable'));
?>Kebersihan Konteks Binaan
.dockerignore memastikan konteks binaan anda kecil dan menghalang rahsia serta lebihan vendor daripada bocor ke dalam imej dan merosakkan cache. Kecualikan vendor, VCS, fail env dan alat pembangunan tempatan.
# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*Semakan Ringkas
Mengapakah opcache.validate_timestamps=0 ditetapkan dalam imej produksi?
Ulang Kaji
Anda telah membina imej PHP-FPM untuk produksi: pangkalan 8.3-fpm-alpine dengan versi khusus, memasang hanya sambungan yang diperlukan melalui skrip pemasang, menyalin Composer dan kebergantungan yang disimpan dalam cache pada lapisan masing-masing, mengaktifkan php.ini produksi dengan penggantian OPcache, bertukar kepada www-data dan menambah pemeriksaan kesihatan FPM.
Tabiat utama: tetapkan versi secara tepat, simpan lapisan kebergantungan dalam cache, jalankan sebagai bukan root, lumpuhkan pengesahan cap masa dan pastikan konteks binaan ringkas dengan .dockerignore.
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 “Menjadikan Aplikasi PHP sebagai Kontena” percuma?
Ya — teks penuh “Menjadikan Aplikasi PHP sebagai Kontena” 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 “Menjadikan Aplikasi PHP sebagai Kontena”?
Tulis Dockerfile PHP yang sedia untuk pengeluaran. 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 1 daripada 4.
Berapa lamakah pelajaran “Menjadikan Aplikasi PHP sebagai Kontena” 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