Docker untuk Developer Pemula

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: ap...

Docker untuk Developer Pemula

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

  1. 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.
  2. Di Linux (Ubuntu, Debian), pasang Docker Engine beserta plugin Compose dari repositori resmi Docker, bukan paket lama bawaan distro.
  3. Uji instalasi dengan docker run hello-world. Jika muncul pesan sambutan, Docker siap dipakai.
  4. Di Linux, tambahkan user Anda ke grup docker agar tidak perlu sudo setiap 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.json dan composer.lock disalin lebih dulu, sehingga lapisan composer install hanya dibangun ulang ketika dependensi berubah. Mengedit controller tidak memicu unduhan ulang seluruh vendor.
  • --host=0.0.0.0 wajib. Tanpa itu, artisan serve hanya 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:

  1. docker compose up -d --build untuk membangun image dan menyalakan layanan di background.
  2. docker compose exec app composer install, karena bind mount .:/var/www/html menimpa folder vendor yang ada di image dengan folder proyek lokal Anda.
  3. docker compose exec app php artisan key:generate lalu docker compose exec app php artisan migrate.
  4. Buka http://localhost:8000 di browser.

Perintah yang Akan Anda Pakai Setiap Hari

PerintahFungsi
docker compose up -dMenyalakan semua layanan di background
docker compose downMematikan dan menghapus container (volume tetap aman)
docker compose logs -f appMelihat log aplikasi secara langsung
docker compose exec app bashMasuk ke shell di dalam container
docker compose psMelihat status setiap layanan
docker image pruneMembersihkan image yang tidak terpakai
docker compose down -vMematikan 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), bukan latest.
  • Ada .dockerignore yang mengecualikan vendor, node_modules, .env, dan .git.
  • Password di compose.yaml hanya 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.

Yudhi
Ditulis oleh
Yudhi
Founder & Lead Developer, GudangCode

Yudhi adalah founder GudangCode dan developer Laravel dengan pengalaman membangun puluhan sistem informasi bisnis siap pakai — mulai dari POS, HRIS, hingga aplikasi manajemen. Ia menulis panduan dan artikel di GudangCode untuk membantu developer Indonesia menjalankan, memahami, dan men-deploy source code Laravel dengan benar.

Laravel PHP MySQL Sistem Informasi Bisnis
Lihat semua artikel Yudhi
Mau source code & aplikasi lengkapnya?

Daftar gratis untuk mengunduh aplikasi bisnis, sistem informasi, dan source code Laravel siap pakai.

Daftar Gratis & Download
Docker Pemula Teknologi & Development
📚 Free Learning Hub

Learn Coding for Free at DhieCoderWeb

Explore Laravel, PHP, JavaScript tutorials, source code, web development guides, and practical programming tips.

DhieCoderWeb
100+
Tutorials
Free
Learning
SEO
Tips
Visit Dhiecoderweb.com →

Dapatkan Akses Penuh Sekarang!

Bergabunglah menjadi member kami dan dapatkan akses eksklusif ke seluruh fitur unggulan aplikasi ini. Proses cepat, mudah, dan langsung bisa Anda gunakan.

Daftar Members Sekarang
Tim Support
Online
Isi data dulu untuk mulai chat:
Beri rating & testimoni sebelum menutup:
Live chat by gudangcode.com