Docker untuk Laravel membuat setiap anggota tim menjalankan versi PHP, MySQL, Redis, dan layanan lain yang sama persis, tanpa memasangnya satu per satu di laptop. Cara tercepat adalah Laravel Sail, lapisan Docker resmi dari Laravel. Kalau butuh kontrol lebih, kamu bisa menulis docker-compose.yml sendiri. Panduan ini membahas keduanya.
Kenapa Pakai Docker untuk Laravel
- Versi seragam. Tidak ada lagi bug yang hanya muncul di laptop dengan PHP berbeda.
- Onboarding cepat. Anggota tim baru cukup clone repo dan menjalankan satu perintah.
- Bersih. Database dan layanan lain tidak berceceran di sistem operasi utama.
- Mendekati production. Layanan yang dipakai di server bisa disimulasikan di laptop.
Prasyarat: Docker Desktop di Windows atau Mac, atau Docker Engine di Linux. Di Windows, gunakan WSL2 dan simpan proyek di dalam filesystem Linux (misalnya ~/projects), bukan di C:\, karena akses file lintas sistem jauh lebih lambat.
Cara 1: Laravel Sail
Pasang di proyek yang sudah ada
composer require laravel/sail --dev
php artisan sail:install
Pilih layanan yang dibutuhkan, misalnya mysql, redis, dan mailpit. Sail membuat compose.yaml dan menyesuaikan .env.
Atau mulai proyek baru langsung dengan Sail
curl -s "https://laravel.build/toko-app?with=mysql,redis,mailpit" | bash
cd toko-app
./vendor/bin/sail up -d
Perintah ini membuat proyek Laravel baru beserta konfigurasi Docker untuk layanan yang disebut di parameter with. Unduhan pertama memakan waktu karena image Docker harus diambil, tapi setelah itu menyalakan ulang hanya butuh beberapa detik.
Jalankan
./vendor/bin/sail up -d
# alias agar lebih singkat (tambahkan ke ~/.bashrc atau ~/.zshrc)
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
Perintah harian
sail artisan migrate
sail composer require spatie/laravel-permission
sail npm run dev
sail test
sail mysql # masuk ke konsol MySQL
sail shell # masuk ke kontainer aplikasi
sail down # hentikan semua layanan
Email yang dikirim aplikasi tertangkap di Mailpit, biasanya bisa dibuka di http://localhost:8025.
Cara 2: Docker Compose Sendiri
Cocok kalau kamu ingin struktur yang lebih mirip production, misalnya Nginx dan PHP-FPM terpisah.
# compose.yaml
services:
app:
build: .
volumes:
- .:/var/www/html
depends_on: [mysql, redis]
nginx:
image: nginx:alpine
ports: ["8080:80"]
volumes:
- .:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on: [app]
mysql:
image: mysql:8.4
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysql-data:/var/lib/mysql
ports: ["3307:3306"]
redis:
image: redis:7-alpine
volumes:
mysql-data:
# Dockerfile
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y git unzip libzip-dev libpng-dev \
&& docker-php-ext-install pdo_mysql zip gd bcmath
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
Di .env, host database adalah nama service, bukan localhost:
DB_HOST=mysql
DB_PORT=3306
REDIS_HOST=redis
Error yang Sering Muncul
| Gejala | Penyebab umum | Perbaikan |
|---|---|---|
| "Connection refused" ke database | DB_HOST=127.0.0.1 | Ganti dengan nama service, misalnya mysql |
| Port 3306 sudah dipakai | MySQL lokal masih berjalan | Hentikan MySQL lokal atau petakan ke port lain seperti 3307 |
Permission denied di storage/ | Pemilik file berbeda antara host dan kontainer | Atur user kontainer, atau chmod -R 775 storage bootstrap/cache |
| Aplikasi sangat lambat di Windows | Proyek di C:\ | Pindahkan ke filesystem WSL2 |
Perubahan .env tidak terbaca | Konfigurasi ter-cache | php artisan config:clear |
Tips Tim
- Commit
compose.yamldanDockerfile, jangan commit.env. - Tulis langkah setup di README dan uji dengan clone bersih.
- Kunci versi image, misalnya
mysql:8.4, bukanlatest, agar semua orang memakai versi yang sama. - Gunakan volume bernama untuk data database agar tidak hilang saat kontainer dihapus.
Kesalahan yang Sering Terjadi
- Memakai konfigurasi development untuk production. Image production sebaiknya tanpa tools development, kode disalin ke image (bukan volume), dan dependensi tanpa paket dev.
- Menyimpan password production di compose. Gunakan environment variable atau secret.
- Menghapus volume tanpa sadar dengan
docker compose down -v, yang ikut menghapus data database lokal.
Langkah Berikutnya
Setelah environment development rapi, siapkan server production dengan panduan deploy Laravel ke VPS Ubuntu. Untuk kebiasaan coding yang menjaga proyek tetap rapi, baca Laravel 12 best practices.