Cara Setup Docker Compose untuk Laravel dan PostgreSQL
Cara setup Docker Compose untuk Laravel dan PostgreSQL adalah salah satu skill penting bagi developer yang ingin environment development-nya konsisten di semua mesin. Tidak ada lagi drama “di laptop gue jalan kok”. Artikel ini akan memandu kamu step-by-step dari nol.
Kenapa Docker Compose untuk Laravel?
Kalau kamu pernah setup XAMPP atau Laragon, kamu pasti tahu rasanya ketika versi PHP beda antara laptop dan server production. Atau ketika PostgreSQL di lokal pakai versi 14, tapi di server sudah versi 16.
Docker Compose menyelesaikan semua itu. Kamu definisikan semua service - PHP, Nginx, PostgreSQL - dalam satu file docker-compose.yml. Siapapun yang clone repo kamu tinggal jalankan satu perintah, dan environment langsung siap.
Keuntungan utamanya:
- Konsistensi - semua developer pakai environment yang sama persis
- Isolasi - project A pakai PHP 8.2, project B pakai PHP 8.3, tidak bentrok
- Reproducible - tinggal
docker compose up, selesai - Mirip production - bisa pakai image dan konfigurasi yang mendekati server asli
Struktur Project
Sebelum mulai, pastikan Docker dan Docker Compose sudah terinstall. Berikut struktur folder yang akan kita buat:
my-laravel-app/
├── docker/
│ ├── nginx/
│ │ └── default.conf
│ └── php/
│ └── Dockerfile
├── src/ # Laravel project
├── docker-compose.yml
└── .env
Folder docker/ berisi konfigurasi khusus untuk container. Folder src/ adalah tempat Laravel project kamu.
Membuat Dockerfile untuk PHP
Laravel butuh beberapa extension PHP yang tidak ada di image default. Buat file docker/php/Dockerfile:
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
libpq-dev \
libzip-dev \
unzip \
git \
curl \
&& docker-php-ext-install pdo_pgsql pgsql zip bcmath \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
USER www-data
Beberapa hal penting di sini:
pdo_pgsqldanpgsqladalah extension wajib untuk koneksi ke PostgreSQLbcmathsering dibutuhkan oleh package Laravel- Composer di-copy dari image resminya, jadi selalu dapat versi terbaru
USER www-datauntuk keamanan - container tidak jalan sebagai root
Konfigurasi Nginx
Buat file docker/nginx/default.conf:
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Perhatikan fastcgi_pass php:9000 - nama php di sini harus sesuai dengan nama service di docker-compose.yml.
Menulis docker-compose.yml
Ini bagian utamanya. Buat file docker-compose.yml di root project:
services:
php:
build:
context: .
dockerfile: docker/php/Dockerfile
volumes:
- ./src:/var/www/html
depends_on:
- postgres
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app-network
postgres:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_DB: ${DB_DATABASE:-laravel}
POSTGRES_USER: ${DB_USERNAME:-laravel}
POSTGRES_PASSWORD: ${DB_PASSWORD:-secret}
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-network
volumes:
pgdata:
networks:
app-network:
driver: bridge
Penjelasan Setiap Service
Service php - ini container utama yang menjalankan PHP-FPM. Volume ./src di-mount ke /var/www/html supaya perubahan kode langsung terdeteksi tanpa rebuild.
Service nginx - web server yang menerima request HTTP di port 8080 dan meneruskannya ke PHP-FPM. Kita pakai image nginx:alpine yang ringan.
Service postgres - database server. Data disimpan di named volume pgdata supaya tidak hilang ketika container di-restart. Environment variable dibaca dari file .env.
Setup Laravel
Sekarang kita install Laravel di folder src/. Jalankan dari root project:
docker compose run --rm php composer create-project laravel/laravel .
Perintah ini menjalankan Composer di dalam container PHP, jadi kamu tidak perlu install PHP atau Composer di mesin lokal.
Setelah Laravel terinstall, edit file src/.env untuk koneksi database:
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
Perhatikan DB_HOST=postgres - ini adalah nama service di docker-compose.yml, bukan localhost. Docker Compose otomatis membuat DNS internal berdasarkan nama service.
Menjalankan Semuanya
Saatnya menjalankan semua container:
docker compose up -d
Flag -d berarti detached mode - container jalan di background. Cek statusnya:
docker compose ps
Kamu harusnya melihat ketiga service running. Sekarang jalankan migration:
docker compose exec php php artisan migrate
Buka browser dan akses http://localhost:8080. Halaman welcome Laravel seharusnya muncul.
Tips Penting untuk Development
Hot Reload dengan Volume Mount
Karena kita sudah mount ./src ke container, setiap perubahan file PHP langsung terefleksi tanpa perlu rebuild. Tapi kalau kamu mengubah Dockerfile atau menambah extension PHP baru, kamu perlu rebuild:
docker compose up -d --build
Menjalankan Artisan Command
Semua perintah Artisan dijalankan via docker compose exec:
docker compose exec php php artisan make:model Product -m
docker compose exec php php artisan tinker
docker compose exec php php artisan queue:work
Supaya tidak capek mengetik panjang, tambahkan alias di .bashrc:
alias dart='docker compose exec php php artisan'
Sekarang cukup ketik dart migrate atau dart make:controller ProductController.
Akses PostgreSQL via CLI
Kalau butuh akses langsung ke database:
docker compose exec postgres psql -U laravel -d laravel
Debugging dengan Xdebug
Untuk menambahkan Xdebug, tambahkan baris berikut di Dockerfile:
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY docker/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
Buat file docker/php/xdebug.ini:
xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.start_with_request=yes
Troubleshooting Umum
Permission denied pada storage/ - ini masalah klasik. Jalankan:
docker compose exec php chmod -R 775 storage bootstrap/cache
Port 5432 sudah dipakai - kalau kamu punya PostgreSQL lokal yang sudah jalan, ubah port mapping di docker-compose.yml:
ports:
- "5433:5432"
Container postgres terus restart - biasanya karena volume lama punya konfigurasi user/password berbeda. Hapus volume dan buat ulang:
docker compose down -v
docker compose up -d
Hati-hati, flag -v menghapus semua data di volume. Pastikan kamu sudah backup kalau ada data penting.
Penutup
Setup Docker Compose untuk Laravel dan PostgreSQL memang butuh effort di awal. Tapi setelah docker-compose.yml siap, semua orang di tim bisa mulai development dalam hitungan menit. Tidak perlu lagi install PHP, Composer, PostgreSQL, atau Nginx secara manual.
Langkah selanjutnya yang bisa kamu eksplorasi:
- Tambahkan Redis untuk cache dan queue
- Setup multi-stage build untuk production image
- Integrasikan dengan GitHub Actions untuk CI/CD
Selamat mencoba, dan semoga workflow development kamu jadi lebih efisien!