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

GejalaPenyebab umumPerbaikan
"Connection refused" ke databaseDB_HOST=127.0.0.1Ganti dengan nama service, misalnya mysql
Port 3306 sudah dipakaiMySQL lokal masih berjalanHentikan MySQL lokal atau petakan ke port lain seperti 3307
Permission denied di storage/Pemilik file berbeda antara host dan kontainerAtur user kontainer, atau chmod -R 775 storage bootstrap/cache
Aplikasi sangat lambat di WindowsProyek di C:\Pindahkan ke filesystem WSL2
Perubahan .env tidak terbacaKonfigurasi ter-cachephp artisan config:clear

Tips Tim

  • Commit compose.yaml dan Dockerfile, jangan commit .env.
  • Tulis langkah setup di README dan uji dengan clone bersih.
  • Kunci versi image, misalnya mysql:8.4, bukan latest, 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.