PHP12 Jan 2025

Docker Compose untuk FrankenPHP, MySQL, dan PhpMyAdmin

Docker Compose adalah alat yang sangat berguna untuk mengelola aplikasi multi-container. Dalam artikel ini, kita akan membuat sebuah file Docker Compose untuk mengatur FrankenPHP sebagai server web, MySQL sebagai basis data, dan PhpMyAdmin sebagai alat manajemen basis data.

Ahmad Sanusi

Ahmad Sanusi

4 min read · 2,306 views

Docker Compose untuk FrankenPHP, MySQL, dan PhpMyAdmin

Docker Compose FrankenPHP, MySQL, dan PhpMyAdmin: Panduan Lengkap untuk PHP Modern (Update 2026)

FrankenPHP menjadi salah satu web server PHP modern yang semakin populer karena menggabungkan PHP dan Caddy dalam satu aplikasi yang cepat, ringan, dan mudah dikonfigurasi. Dibandingkan kombinasi Nginx + PHP-FPM atau Apache + PHP, FrankenPHP menawarkan performa tinggi dengan konfigurasi yang lebih sederhana.

Pada artikel ini kita akan membuat lingkungan pengembangan menggunakan Docker Compose yang terdiri dari:

  • FrankenPHP sebagai web server dan runtime PHP.
  • MySQL sebagai database.
  • PhpMyAdmin sebagai alat administrasi database.

Konfigurasi ini cocok digunakan untuk CodeIgniter 3, CodeIgniter 4, Laravel, Symfony, WordPress, maupun aplikasi PHP kustom.

Mengapa Menggunakan FrankenPHP?

FrankenPHP menawarkan beberapa keunggulan dibandingkan stack PHP tradisional:

  • Performa tinggi berbasis Caddy.
  • Mendukung HTTP/2 dan HTTP/3 secara bawaan.
  • Mudah digunakan bersama Docker.
  • Mendukung mode worker untuk performa lebih tinggi.
  • Cocok untuk aplikasi PHP modern.
  • Konfigurasi lebih sederhana dibandingkan Nginx + PHP-FPM.

Prasyarat

Sebelum memulai, pastikan sistem Anda telah memiliki:

  • Docker Engine terbaru.
  • Docker Compose V2.
  • Git (opsional).
  • Terminal Linux, macOS, atau Windows.

Pastikan instalasi berhasil dengan menjalankan:


docker --version
docker compose version

Struktur Direktori

Buat struktur proyek sebagai berikut:


project-folder/
│
├── docker-compose.yml
├── .env
│
├── app/
│   └── index.php
│
└── mysql/

Membuat File .env

Simpan konfigurasi database ke dalam file .env agar lebih aman dan mudah dikelola.


MYSQL_ROOT_PASSWORD=rootpassword

MYSQL_DATABASE=frankenphp_db

MYSQL_USER=frankenphp_user

MYSQL_PASSWORD=userpassword

File Docker Compose

Buat file docker-compose.yml berikut:


services:

  frankenphp:
    image: dunglas/frankenphp
    container_name: frankenphp

    restart: unless-stopped

    ports:
      - "8080:80"

    volumes:
      - ./app:/app/public

    depends_on:
      mysql:
        condition: service_healthy

  mysql:
    image: mysql:8.4

    container_name: mysql

    restart: unless-stopped

    env_file:
      - .env

    ports:
      - "3306:3306"

    volumes:
      - mysql_data:/var/lib/mysql

    healthcheck:
      test: ["CMD","mysqladmin","ping","-h","localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  phpmyadmin:
    image: phpmyadmin:latest

    container_name: phpmyadmin

    restart: unless-stopped

    ports:
      - "8081:80"

    environment:
      PMA_HOST: mysql

    depends_on:
      mysql:
        condition: service_healthy

volumes:
  mysql_data:

Membuat File PHP

Untuk memastikan FrankenPHP berjalan dengan baik, buat file:


app/index.php

Isi dengan kode berikut:


<?php

phpinfo();

Menjalankan Docker Compose

Masuk ke direktori proyek lalu jalankan:


docker compose up -d

Docker akan mengunduh image yang diperlukan dan menjalankan seluruh container secara otomatis.

Memeriksa Status Container

Gunakan perintah berikut:


docker compose ps

Semua service seharusnya berada pada status running atau healthy.

Mengakses Layanan

FrankenPHP

Buka browser:


http://localhost:8080

Jika berhasil, halaman phpinfo() akan muncul.

PhpMyAdmin

Buka:


http://localhost:8081

Gunakan kredensial:

  • Server: mysql
  • Username: frankenphp_user
  • Password: userpassword

Menghubungkan PHP ke MySQL

Di dalam container FrankenPHP, host database adalah nama service Docker yaitu:


mysql

Contoh koneksi PDO:


$pdo = new PDO(
    "mysql:host=mysql;dbname=frankenphp_db",
    "frankenphp_user",
    "userpassword"
);

Menggunakan CodeIgniter 3 atau CodeIgniter 4

Jika Anda menggunakan CodeIgniter:

  • Copy source code ke folder app.
  • Atur konfigurasi database menggunakan host mysql.
  • Pastikan ekstensi PHP yang dibutuhkan tersedia.

Contoh konfigurasi database:


hostname = mysql
database = frankenphp_db
username = frankenphp_user
password = userpassword

Menggunakan Laravel

Untuk Laravel, konfigurasi pada file .env:


DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=frankenphp_db
DB_USERNAME=frankenphp_user
DB_PASSWORD=userpassword

Melihat Log Container

Saat terjadi masalah, gunakan:


docker compose logs

docker compose logs frankenphp

docker compose logs mysql

Backup Database MySQL

Membuat backup:


docker exec mysql \
mysqldump -u root -p frankenphp_db > backup.sql

Restore database:


docker exec -i mysql \
mysql -u root -p frankenphp_db < backup.sql

Menghentikan Container

Untuk menghentikan seluruh layanan:


docker compose down

Untuk menghentikan sekaligus menghapus volume:


docker compose down -v

Troubleshooting Umum

Port 3306 Sudah Digunakan

Biasanya terjadi karena MySQL lokal sudah berjalan.

Solusi:

  • Matikan MySQL lokal.
  • Ubah port menjadi 3307:3306.

PhpMyAdmin Tidak Bisa Login

Pastikan:

  • Container MySQL sehat (healthy).
  • Password sesuai file .env.
  • Database berhasil dibuat.

Container Restart Terus

Periksa log menggunakan:


docker compose logs

Biasanya disebabkan konfigurasi environment yang salah atau volume yang korup.

Kesimpulan

Docker Compose memudahkan pengelolaan lingkungan pengembangan PHP modern. Dengan menggabungkan FrankenPHP, MySQL, dan PhpMyAdmin dalam satu konfigurasi, Anda dapat membangun lingkungan pengembangan yang cepat, konsisten, dan mudah dipindahkan ke berbagai server.

Stack ini sangat cocok untuk pengembangan aplikasi CodeIgniter 3, CodeIgniter 4, Laravel, WordPress, maupun aplikasi PHP berskala besar yang membutuhkan kemudahan deployment menggunakan Docker.

Ahmad Sanusi

Written by

Ahmad Sanusi

Senior Full-Stack Developer with 15+ years of experience in building scalable digital solutions.

Responses

No responses yet. Be the first to share your thoughts.

All articles