Saat pertama kali mencoba FrankenPHP, penulis sangat terkesan dengan performanya. Ringan, cepat, modern, dan benar-benar membawa angin segar untuk ekosistem PHP. Namun penulis menemukan satu masalah, Docker image bawaan FrankenPHP tidak bisa langsung digunakan untuk Laravel.

Laravel membutuhkan beberapa ekstensi tambahan, penyesuaian direktori, dan optimasi tertentu agar berjalan dengan baik. Beberapa ekstensi penting seperti pdo_mysql, intl, hingga zip tidak tersedia secara default. Sehingga, saat mencoba menjalankan proyek Laravel, penulis diminta untuk memasang ekstensi PHP yang dibutuhkan.

Agar tidak terus membangun secara manual setiap kali memulai proyek baru, akhirnya penulis memutuskan membuat Docker image untuk FrankenPHP yang sudah siap pakai dan mendukung penuh Laravel. Berangkat dari tujuannya sederhana:

“Docker image yang cukup dibanguun sekali, dan proyek Laravel bisa langsung jalan tanpa konfigurasi tambahan.”

Dari situlah lahir image arifnd/frala, sebuah FrankenPHP image yang telah dikustomisasi, dioptimalkan, dan siap digunakan untuk Laravel versi 11+ maupun Laravel Octane.

Fitur Utama

  • Sudah terpasang Composer

  • Mendukung PHP 8.2, 8.3, 8.4, dan 8.5

  • Optimasi penuh untuk Laravel 11+

  • Dukungan lengkap untuk Laravel Octane

  • Performa tinggi karena menggunakan FrankenPHP berbasis Caddy

  • Sudah terpasang Ekstensi PHP wajib untuk Laravel:

    • intl

    • pcntl

    • pdo_mysql

    • pdo_pgsql

    • redis

    • zip

Image ini penulis buat agar Laravel bisa langsung berjalan tanpa patching, tanpa compile ulang, tanpa repot uji coba.

Cara Menggunakan

Menggunakan docker run

Install Dependensi Composer

Menggunakan image Composer:

docker run --rm -it -v $PWD:/app composer:latest install

Atau langsung melalui image ini:

docker run --rm -it -v $PWD:/app arifnd/frala composer install

Jika sudah memiliki Composer lokal:

composer install

Menjalankan Proyek

docker run -p 8000:80 \
  -v $(pwd):/app \
  arifnd/frala

Menggunakan Dockerfile

Contoh Dockerfile untuk Proyek Laravel

FROM arifnd/frala

ENV SERVER_NAME=:80

WORKDIR /app

COPY . .

RUN composer install \
    --prefer-dist \
    --no-progress \
    --no-interaction \
    --no-dev \
    --optimize-autoloader \
    && php artisan optimize \
    && chown -R www-data:www-data /app \
    && chmod -R 755 /app/storage /app/bootstrap/cache

Lalu Build dan Jalankan Image

docker build -t my-laravel-app .
docker run -p 8000:80 my-laravel-app

Menggunakan docker compose

Contoh compose.yaml untuk Laravel

services:
  app:
    image: arifnd/frala
    ports:
      - "8000:80"
    volumes:
      - .:/app
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
      - SERVER_NAME=:80

Menggunakan Laravel Octane

Jika ingin performa maksimal, bisa menjalankan Laravel menggunakan Octane dengan FrankenPHP:

services:
  frankenphp:
    image: arifnd/frala
    entrypoint: php artisan octane:frankenphp --workers=1 --max-requests=1
    ports:
      - "8000:8000"
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
      - SERVER_NAME=:80
    volumes:
      - .:/app

Dengan konfigurasi ini, Laravel berjalan cepat dan efisien, cocok untuk API atau aplikasi heavy load.

Dokumentasi lengkap untuk FrankenPHP via Docker⁠.

Membangun Image Sendiri

Bagi yang ingin membuat versi kustom lainnya, berikut berkas Dockerfile dasar yang dipakai:

FROM dunglas/frankenphp

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

RUN install-php-extensions \
    @composer \
    intl \
    pcntl \
    pdo_mysql \
    pdo_pgsql \
    redis \
    zip

Kesimpulan

Penulis membuat image ini karena Docker image bawaan FrankenPHP belum bisa langsung dipakai untuk Laravel, terutama bagi developer yang ingin proses cepat, minim konfigurasi, namun memiliki performa tinggi. Dengan image arifnd/frala, Anda bisa langsung menjalankan Laravel tanpa mengkhawatirkan ekstensi, permission, atau konfigurasi server. Jika Anda sedang membangun aplikasi Laravel modern, terlebih yang membutuhkan performa tinggi dengan Octane, image ini bisa menjadi alternatif untuk dicoba.