0Pricing
PHP Academy · Pelajaran

Membuat Aplikasi PHP Menjadi Kontainer

Tulis Dockerfile PHP yang siap digunakan di produksi.

Membuat Aplikasi PHP Menjadi Kontainer adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.

Mengapa Menggunakan Kontainer untuk PHP

Mengirimkan PHP secara konsisten berarti membekukan versi penafsir yang tepat, ekstensi, dan pustaka OS bersama kode Anda. Citra Docker memberikan setiap lingkungan—laptop, CI, dan produksi—php -v yang sama serta kumpulan ext-* yang sama.

Dalam pelajaran ini, kita membuat citra siap produksi: PHP-FPM, hanya ekstensi yang diperlukan, konfigurasi yang disetel, pengguna non-root, dan pemeriksaan kesehatan.

Dasar FPM vs Apache

Citra PHP resmi tersedia dalam beberapa varian. Untuk aplikasi web produksi di belakang nginx/traefik, pilih php:8.3-fpm-alpine (kecil) atau php:8.3-fpm (Debian, glibc—lebih sedikit kejutan terkait pustaka asli).

  • cli — pekerja, antrean, tugas terjadwal
  • fpm — pengelola proses FastCGI, dipasangkan dengan nginx
  • apache — Apache bawaan, praktis tetapi lebih berat

Sematkan versi kecilnya. Jangan pernah menggunakan :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 Ekstensi

Jangan pernah menjalankan apt install php-xxx di dalam citra ini—gunakan pembantu bawaan docker-php-ext-install, docker-php-ext-configure, dan pecl. Skrip install-php-extensions (mlocati) adalah jalan pintas yang telah menjadi standar untuk mengambil tajuk pengembangan yang tepat bagi 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 \
        bcmath

Composer dalam Citra

Salin biner Composer dari citra resminya, bukan dengan mengambil penginstal menggunakan curl. Jalankan composer install dengan --no-dev dan --optimize-autoloader untuk produksi, lalu salin hanya composer.json/composer.lock terlebih dahulu agar lapisan dependensi dapat disimpan dalam tembolok secara terpisah dari perubahan 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-authoritative

Menyetel php.ini

Citra dasar menyediakan templat php.ini-production dan php.ini-development. Aktifkan templat produksi, lalu letakkan penggantian Anda sendiri ke dalam conf.d—direktori tersebut digabungkan terakhir sehingga pengaturan Anda yang berlaku.

Nilai produksi utama: opcache.enable=1, opcache.validate_timestamps=0 (kode yang tidak berubah dalam citra), dan memory_limit yang wajar.

# 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.ini

Berkas Penggantian OPcache

Inilah peningkatan produksi terbesar. Dengan validate_timestamps=0, PHP tidak pernah memeriksa berkas pada setiap permintaan—tetapi itu berarti Anda MUST membangun ulang citra untuk menerapkan perubahan (dan memang itulah yang kita inginkan dari kontainer yang tidak dapat diubah).

; 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-data

Menjalankan tanpa Hak Root

Citra tersebut sudah mendefinisikan www-data. Menjalankan FPM sebagai root hanya memperluas permukaan serangan tanpa manfaat. Tetapkan kepemilikan jalur yang dapat ditulisi (tembolok dan catatan), lalu alihkan pengguna dengan USER sebelum CMD.

Apakah master FPM tetap mengikat porta istimewa? Tidak—FPM mendengarkan pada porta 9000 (tanpa hak istimewa), sehingga penggunaan pengguna non-root berjalan dengan 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 Kesehatan

Orkestrator memerlukan sinyal bahwa FPM benar-benar aktif, bukan sekadar prosesnya ada. cgi-fcgi dapat melakukan ping ke titik akhir FPM /status atau /ping. Aktifkan pm.status_path dan ping.path di kumpulan 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 1

Menyusun Dockerfile

Berikut Dockerfile produksi satu tahap yang koheren. Pada pelajaran berikutnya, kita membaginya menjadi beberapa tahap untuk menghapus alat pembangunan. Perhatikan urutannya: dependensi → konfigurasi → kode sumber → pemuat otomatis → pengalihan 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"]

Memverifikasi Proses Pembangunan

Setelah membangun, lakukan pemeriksaan kewajaran terhadap hal-hal yang benar-benar masuk ke dalam citra: versi PHP, ekstensi yang dimuat, dan bahwa validasi OPcache dinonaktifkan. Skrip CLI singkat memastikan kontrak waktu proses yang menjadi dependensi 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'));
?>

Kerapian Konteks Pembangunan

Sebuah .dockerignore menjaga konteks pembangunan tetap kecil dan mencegah rahasia atau ukuran berlebih dari dependensi vendor bocor ke dalam citra serta merusak tembolok. Kecualikan vendor, VCS, file env, dan peralatan lokal.

# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*

Pemeriksaan Singkat

Mengapa opcache.validate_timestamps=0 ditetapkan dalam citra produksi?

Rangkuman

Anda telah membangun citra PHP-FPM produksi: basis 8.3-fpm-alpine yang versinya dipatok, hanya memasang ekstensi yang diperlukan melalui skrip penginstal, menyalin Composer dan dependensi yang disimpan dalam tembolok ke lapisannya sendiri, mengaktifkan php.ini produksi dengan penggantian OPcache, beralih ke www-data, dan menambahkan pemeriksaan kesehatan FPM.

Kebiasaan utama: patok versi, simpan lapisan dependensi dalam tembolok, jalankan tanpa pengguna root, nonaktifkan validasi stempel waktu, dan jaga konteks pembangunan tetap ringkas dengan .dockerignore.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Aplikasi PHP Menjadi Kontainer” gratis?

Ya — teks lengkap “Membuat Aplikasi PHP Menjadi Kontainer” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Aplikasi PHP Menjadi Kontainer”?

Tulis Dockerfile PHP yang siap digunakan di produksi. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai PHP Academy?

Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Membuat Aplikasi PHP Menjadi Kontainer” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membuat Aplikasi PHP Menjadi Kontainer
  2. Build Multi-Tahap dan Optimasi
  3. Docker Compose untuk Tumpukan Lokal
  4. CI/CD dengan GitHub Actions
← Kembali ke PHP Academy