Anda baru bergabung di sebuah proyek Laravel, lalu menghabiskan setengah hari memasang PHP versi yang pas, ekstensi yang kurang, dan MySQL yang menolak koneksi. Atau sebaliknya: aplikasi berjalan mulus di laptop Anda, tetapi rusak di laptop rekan karena versi PHP-nya berbeda. Docker hadir untuk masalah seperti ini, dan artikel ini membahasnya dari nol sampai Anda bisa menjalankan proyek Laravel lengkap dengan database lewat satu perintah.
Fokusnya praktis. Kita tidak akan membahas orkestrasi skala besar seperti Kubernetes. Targetnya: Anda paham konsep dasarnya, bisa menulis Dockerfile sendiri, memakai Docker Compose untuk lingkungan pengembangan, dan tahu cara memperbaiki error yang paling sering muncul.
Konsep Dasar: Image, Container, Volume
Ada tiga istilah yang wajib Anda kuasai sebelum mengetik perintah apa pun.
- Image adalah cetakan yang tidak bisa diubah. Isinya sistem operasi minimal, runtime (misalnya PHP 8.3), ekstensi, dan kode aplikasi. Image dibangun dari sebuah resep bernama Dockerfile.
- Container adalah image yang sedang berjalan. Dari satu image Anda bisa menjalankan banyak container. Ketika container dihapus, semua perubahan di dalamnya ikut hilang, kecuali disimpan di volume.
- Volume adalah penyimpanan di luar container. Data database, file upload, dan sejenisnya harus disimpan di volume supaya tidak lenyap saat container dibuat ulang.
Perbedaan container dengan virtual machine juga perlu dipahami. VM menjalankan sistem operasi lengkap beserta kernel-nya sendiri, sehingga butuh RAM dan waktu boot yang besar. Container berbagi kernel dengan host dan hanya membawa yang dibutuhkan aplikasi, sehingga biasanya menyala dalam hitungan detik. Di Windows dan macOS, Docker Desktop tetap menjalankan VM Linux kecil di belakang layar, tetapi Anda tidak perlu mengurusnya.
Memasang Docker
- Di Windows atau macOS, pasang Docker Desktop dari situs resmi Docker. Di Windows, aktifkan backend WSL 2 karena jauh lebih cepat daripada Hyper-V untuk proyek PHP.
- Di Linux (Ubuntu, Debian), pasang Docker Engine beserta plugin Compose dari repositori resmi Docker, bukan paket lama bawaan distro.
- Uji instalasi dengan
docker run hello-world. Jika muncul pesan sambutan, Docker siap dipakai. - Di Linux, tambahkan user Anda ke grup
dockeragar tidak perlusudosetiap saat, lalu logout dan login kembali.
Catatan lisensi: Docker Desktop gratis untuk penggunaan pribadi, pendidikan, dan bisnis kecil, tetapi perusahaan di atas batas tertentu wajib berlangganan. Cek syarat terbarunya di situs Docker. Alternatif gratis seperti OrbStack (macOS) atau Rancher Desktop juga bisa dipertimbangkan.
Menulis Dockerfile untuk Proyek Laravel
Berikut Dockerfile minimal untuk lingkungan pengembangan Laravel 11 dengan PHP 8.3. Simpan di root proyek dengan nama Dockerfile tanpa ekstensi.
FROM php:8.3-cli
RUN apt-get update && apt-get install -y git unzip libzip-dev \
&& docker-php-ext-install pdo_mysql zip \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
COPY composer.json composer.lock ./
RUN composer install --no-interaction --no-scripts --no-autoloader
COPY . .
RUN composer dump-autoload --optimize
EXPOSE 8000
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
Beberapa hal yang perlu diperhatikan dari resep di atas:
- Urutan COPY disengaja. File
composer.jsondancomposer.lockdisalin lebih dulu, sehingga lapisancomposer installhanya dibangun ulang ketika dependensi berubah. Mengedit controller tidak memicu unduhan ulang seluruh vendor. --host=0.0.0.0wajib. Tanpa itu,artisan servehanya mendengarkan localhost di dalam container dan tidak bisa diakses dari browser Anda.- Composer diambil dari image resmi lewat
COPY --from, cara paling ringkas tanpa skrip instalasi tambahan.
Tambahkan juga file .dockerignore agar folder berat dan rahasia tidak ikut masuk ke image:
vendor
node_modules
.env
.git
storage/logs/*
Docker Compose: Aplikasi dan Database Sekaligus
Aplikasi nyata hampir selalu butuh lebih dari satu layanan. Docker Compose mendefinisikan semuanya dalam satu file compose.yaml:
services:
app:
build: .
ports:
- "8000:8000"
volumes:
- .:/var/www/html
environment:
DB_CONNECTION: mysql
DB_HOST: db
DB_PORT: 3306
DB_DATABASE: laravel
DB_USERNAME: laravel
DB_PASSWORD: secret
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: rootsecret
volumes:
- dbdata:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
retries: 10
volumes:
dbdata:
Perhatikan DB_HOST: db. Di dalam jaringan Compose, setiap layanan bisa dipanggil memakai namanya. Kesalahan klasik pemula adalah menulis 127.0.0.1, yang di dalam container berarti container itu sendiri, bukan database. Variabel environment yang diset Compose juga diprioritaskan Laravel di atas isi .env.
Jalankan semuanya:
docker compose up -d --builduntuk membangun image dan menyalakan layanan di background.docker compose exec app composer install, karena bind mount.:/var/www/htmlmenimpa folder vendor yang ada di image dengan folder proyek lokal Anda.docker compose exec app php artisan key:generatelaludocker compose exec app php artisan migrate.- Buka
http://localhost:8000di browser.
Perintah yang Akan Anda Pakai Setiap Hari
| Perintah | Fungsi |
|---|---|
docker compose up -d | Menyalakan semua layanan di background |
docker compose down | Mematikan dan menghapus container (volume tetap aman) |
docker compose logs -f app | Melihat log aplikasi secara langsung |
docker compose exec app bash | Masuk ke shell di dalam container |
docker compose ps | Melihat status setiap layanan |
docker image prune | Membersihkan image yang tidak terpakai |
docker compose down -v | Mematikan sekaligus menghapus volume (data database hilang) |
Kesalahan Umum dan Cara Memperbaikinya
1. "Connection refused" ke database
Biasanya karena DB_HOST masih 127.0.0.1, atau aplikasi mencoba konek sebelum MySQL siap. Ganti host menjadi nama layanan, dan pakai healthcheck plus condition: service_healthy seperti contoh di atas.
2. Port sudah dipakai
Jika XAMPP atau MySQL lokal masih berjalan di port 3306 atau 8000, Docker gagal memetakan port. Matikan layanan lokal itu atau ubah pemetaan menjadi misalnya "8080:8000".
3. Permission denied di folder storage
Di Linux, file yang dibuat container bisa dimiliki root. Jalankan docker compose exec app chmod -R 775 storage bootstrap/cache, atau atur user container agar sama dengan UID user Anda.
4. Data database hilang
Ini terjadi kalau Anda tidak memakai volume atau menjalankan down -v. Simpan data MySQL di named volume dan biasakan membuat dump sebelum eksperimen.
5. Image membengkak
Tanpa .dockerignore, folder node_modules dan .git ikut tersalin. Ukuran image bisa naik ratusan megabyte tanpa manfaat.
Kapan Docker Layak Dipakai, dan Kapan Tidak
Docker sangat membantu bila tim Anda lebih dari satu orang, proyek memakai beberapa layanan (MySQL, Redis, Meilisearch), atau Anda sering berpindah antarproyek dengan versi PHP berbeda. Untuk belajar Laravel di minggu-minggu pertama, setup lokal biasa justru lebih sederhana; panduan menyiapkan PHP, Composer, dan MySQL sudah cukup. Begitu pula kalau target deploy Anda shared hosting yang tidak mendukung container, proses rilisnya tetap mengikuti cara di panduan deploy Laravel ke shared hosting, sementara Docker hanya dipakai untuk pengembangan.
Perlu diketahui juga bahwa Laravel punya Laravel Sail, paket resmi yang membungkus Docker Compose dengan konfigurasi siap pakai. Sail cocok kalau Anda ingin cepat mulai, sementara menulis Dockerfile sendiri seperti di atas membuat Anda paham apa yang sebenarnya terjadi.
Checklist Sebelum Membagikan Setup Docker ke Tim
- Dockerfile memakai versi image yang spesifik (
php:8.3-cli), bukanlatest. - Ada
.dockerignoreyang mengecualikan vendor, node_modules, .env, dan .git. - Password di
compose.yamlhanya untuk pengembangan, tidak pernah dipakai di server produksi. - Data database tersimpan di named volume.
- README berisi tiga sampai lima perintah untuk menjalankan proyek dari nol.
- Semua anggota tim sudah mencoba setup dari clone bersih, bukan hanya Anda.
Mulailah dengan satu proyek kecil, jalankan docker compose up, dan biasakan membaca log ketika ada yang gagal. Setelah nyaman, Anda bisa menambahkan layanan lain seperti Redis untuk antrean. Untuk alat pendamping lainnya, lihat juga daftar tools gratis untuk developer web pemula. Jika Anda memakai source code Laravel dari GudangCode, file di atas bisa langsung ditaruh di root proyek dengan sedikit penyesuaian nama database.