Memuat...
👋 Selamat Pagi!

Apa Itu Docker dan Kenapa Developer PHP Harus Peduli

Docker bukan cuma buat DevOps. Developer PHP yang masih pakai XAMPP/Laragon wajib tahu kenapa Docker bisa selesaikan masalah environment development yang bikin...

Apa Itu Docker dan Kenapa Developer PHP Harus Peduli

Pernah nggak sih kamu ngalamin ini: project Laravel yang jalan mulus di laptop kamu, eh pas dipindah ke laptop teman atau di-deploy ke server malah error?

Atau pas onboarding developer baru, butuh seharian cuma buat setup environment development sampai bisa jalan?

Belum lagi drama "tapi di laptop gue jalan kok" yang bikin meeting jadi panas.

Kalau kamu masih pakai XAMPP atau Laragon, kemungkinan besar kamu pernah ngalamin masalah-masalah di atas.

Dan Docker hadir untuk menyelesaikan semua itu.

Masalah Environment Development yang Diselesaikan Docker

Mari kita bicara jujur tentang development environment.

XAMPP dan Laragon itu memang praktis untuk belajar PHP atau bikin project sederhana.

Tapi begitu project kamu mulai kompleks, atau mulai kerja bareng tim, masalahnya mulai bermunculan.

Versi PHP yang berbeda-beda

Project A butuh PHP 7.4, project B butuh PHP 8.1.

Di XAMPP, kamu harus install versi PHP terpisah dan ganti-ganti manual setiap pindah project.

Ribet dan rawan salah switch.

Dependency yang bentrok

Extension PHP yang dibutuh project satu bisa bentrok dengan project lain.

Atau worse, ekstensi yang kamu install buat satu project malah bikin project lain error.

Database yang campur aduk

Semua project pakai satu MySQL instance yang sama.

Kalau salah drop database, bye bye data project lain.

Susah replikasi environment production

Server production pakai Ubuntu 22.04 dengan konfigurasi tertentu.

Laptop kamu pakai Windows dengan XAMPP.

Beda environment = beda behavior = bug yang cuma muncul di production.

Setup yang lama buat developer baru

Developer baru join tim, harus install XAMPP, PHP, Composer, Node.js, MySQL, Redis, dan puluhan dependency lain.

Butuh setengah hari sampai seharian buat setup, belum testing kalau ada yang error.

Docker menyelesaikan semua masalah ini dengan satu konsep sederhana: containerization.

Konsep Container vs Virtual Machine yang Mudah Dipahami

Sebelum masuk ke Docker, kamu harus paham dulu apa itu container.

Banyak yang bingung antara container dan virtual machine (VM).

Mari kita bedah perbedaannya dengan analogi sederhana.

Virtual Machine: Rumah Terpisah

Bayangkan VM itu seperti kamu bikin rumah baru yang lengkap.

Setiap rumah punya fondasinya sendiri, temboknya sendiri, listriknya sendiri, airnya sendiri.

Kalau kamu mau bikin 5 rumah, ya kamu harus bangun 5 rumah lengkap dari nol.

Ini analog dengan VM yang harus install OS lengkap untuk setiap VM.

Berat, lambat, dan makan resource banyak.

Container: Kamar dalam Apartemen

Sekarang bayangkan container itu kayak kamar di apartemen.

Semua kamar berbagi fondasi yang sama, listrik yang sama, air yang sama (host OS).

Tapi setiap kamar tetap punya privasi dan bisa diatur sendiri-sendiri.

Mau bikin 10 kamar? Tinggal bangun sekat, jauh lebih cepat dan hemat resource.

Ini analog dengan container yang berbagi kernel OS yang sama tapi tetap terisolasi.

Kenapa Container Lebih Cocok untuk Development

Container jauh lebih ringan dari VM.

Sebuah container bisa start dalam hitungan detik, bukan menit.

Kamu bisa jalanin 10-20 container di laptop tanpa bikin lemot, coba kalau VM.

Dan yang paling penting: container itu portable.

Container yang jalan di laptop kamu dijamin jalan persis sama di laptop teman, di server staging, dan di production.

Karena container itu bundle lengkap: aplikasi + dependency + konfigurasi + runtime environment.

Komponen Utama Docker

Docker punya beberapa komponen yang perlu kamu pahami:

Docker Image: Blueprint atau cetakan untuk bikin container. Analoginya seperti installer aplikasi.

Docker Container: Instance yang jalan dari image. Analoginya aplikasi yang udah di-install dan sedang berjalan.

Dockerfile: File text berisi instruksi untuk bikin image. Seperti resep masakan.

Docker Compose: Tool untuk menjalankan multi-container sekaligus dengan satu command. Perfect untuk development environment yang butuh PHP, MySQL, Redis, dll bersamaan.

Docker Hub: Registry publik tempat kamu download image yang udah jadi. Kayak Google Play/App Store tapi untuk Docker image.

Setup Docker untuk Laravel Project Pertama Kali

Oke, cukup teorinya. Mari kita setup Docker untuk project Laravel.

Pertama, install Docker Desktop dulu di laptop kamu.

Download dari docker.com/products/docker-desktop sesuai OS kamu.

Install seperti aplikasi biasa, restart kalau diminta.

Setelah install, buka terminal dan cek:

docker --version
docker-compose --version

Kalau keluar versi number-nya, berarti instalasi berhasil.

Struktur Project Docker Laravel

Buat folder baru untuk project Laravel kamu:

mkdir laravel-docker-project
cd laravel-docker-project

Sekarang kita bikin Dockerfile untuk PHP dan aplikasi Laravel:

FROM php:8.2-fpm

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Set working directory
WORKDIR /var/www

# Copy existing application directory
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www-data:www-data . /var/www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

Dockerfile ini bikin image PHP 8.2 dengan extension yang dibutuhkan Laravel.

Konfigurasi Nginx

Bikin folder docker dan file docker/nginx/default.conf:

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

Konfigurasi ini bikin Nginx forward request PHP ke container PHP-FPM.

Docker Compose untuk Multi Service Development

Sekarang bagian paling powerful: Docker Compose.

Dengan Docker Compose, kamu bisa define semua service yang dibutuhkan project dalam satu file YAML.

Bikin file docker-compose.yml di root project:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: laravel-app
    container_name: laravel-app
    restart: unless-stopped
    working_dir: /var/www
    volumes:
      - ./:/var/www
    networks:
      - laravel

  webserver:
    image: nginx:alpine
    container_name: laravel-webserver
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www
      - ./docker/nginx:/etc/nginx/conf.d
    networks:
      - laravel

  db:
    image: mysql:8.0
    container_name: laravel-db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_PASSWORD: secret
      MYSQL_USER: laravel
    volumes:
      - dbdata:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - laravel

  redis:
    image: redis:alpine
    container_name: laravel-redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    networks:
      - laravel

networks:
  laravel:
    driver: bridge

volumes:
  dbdata:
    driver: local

File ini define 4 service:

app: Container PHP-FPM untuk jalanin Laravel.

webserver: Nginx sebagai web server.

db: MySQL untuk database.

redis: Redis untuk cache dan queue.

Semua service terhubung dalam network yang sama dan bisa komunikasi satu sama lain.

Jalankan Environment Docker

Sekarang tinggal jalanin:

docker-compose up -d

Command ini akan:

  1. Download semua image yang dibutuhkan (pertama kali agak lama).
  2. Build image custom untuk app.
  3. Start semua container di background.

Cek status container:

docker-compose ps

Kalau semua status "Up", berarti berhasil.

Install Laravel di Container

Sekarang masuk ke container app dan install Laravel:

docker-compose exec app bash

Kamu sekarang inside container. Install Laravel:

composer create-project laravel/laravel .

Set permission:

chown -R www-data:www-data /var/www
chmod -R 755 /var/www/storage

Konfigurasi Database Laravel

Edit file .env di project Laravel:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

Perhatikan DB_HOST=db, ini nama service di docker-compose.yml.

Docker Compose secara otomatis bikin DNS internal jadi container bisa manggil service lain pakai nama service.

Jalankan migration:

docker-compose exec app php artisan migrate

Buka browser ke http://localhost:8000, kalau muncul welcome page Laravel, berarti berhasil!

Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.

Workflow Development dengan Docker yang Efisien

Sekarang environment sudah jalan, mari kita bahas workflow development sehari-hari.

Command yang Sering Dipakai

Start semua container:

docker-compose up -d

Stop semua container:

docker-compose down

Rebuild image setelah edit Dockerfile:

docker-compose up -d --build

Masuk ke container untuk jalankan command:

docker-compose exec app bash

Jalankan artisan command tanpa masuk container:

docker-compose exec app php artisan migrate
docker-compose exec app php artisan db:seed
docker-compose exec app php artisan queue:work

Install package Composer:

docker-compose exec app composer require package/name

Lihat log container:

docker-compose logs -f app

Optimasi Development Experience

Buat alias di .bashrc atau .zshrc untuk shortcut:

alias dcu='docker-compose up -d'
alias dcd='docker-compose down'
alias dcr='docker-compose restart'
alias dce='docker-compose exec app'
alias art='docker-compose exec app php artisan'

Sekarang kamu bisa jalankan art migrate instead of ngetik command panjang.

Database Management

Untuk manage database, kamu bisa:

  1. Pakai TablePlus atau DBeaver connect ke localhost:3306.
  2. Tambah service phpMyAdmin di docker-compose.yml.
  3. Masuk ke container MySQL langsung: docker-compose exec db mysql -u laravel -p.

Multi Project dengan Docker

Keuntungan Docker: kamu bisa jalanin multiple project dengan versi PHP berbeda secara bersamaan.

Project A pakai PHP 7.4, Project B pakai PHP 8.2, tinggal ganti base image di Dockerfile masing-masing.

Dan karena setiap project punya container terpisah, nggak ada konflik dependency atau database.

Tips Performance

Docker di Windows dan Mac agak lambat untuk file I/O karena virtualization layer.

Beberapa tips optimasi:

  1. Pakai named volume untuk folder vendor dan node_modules.
  2. Jangan sync folder build artifacts yang nggak perlu.
  3. Pakai Docker Desktop WSL 2 backend di Windows untuk performance lebih baik.

Tambahkan di docker-compose.yml:

services:
  app:
    volumes:
      - ./:/var/www
      - vendor:/var/www/vendor
      - node_modules:/var/www/node_modules

volumes:
  vendor:
  node_modules:

Ini bikin Composer dan NPM install di named volume yang lebih cepat.

Debugging di Docker

Install Xdebug di Dockerfile:

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

Tambah konfigurasi Xdebug di docker/php/xdebug.ini:

zend_extension=xdebug.so
xdebug.mode=develop,debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.start_with_request=yes

Mount file ini di docker-compose.yml:

services:
  app:
    volumes:
      - ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini

Sekarang kamu bisa debug Laravel pakai PHPStorm atau VS Code seperti biasa.

Mengatasi Masalah Umum Docker untuk PHP Developer

Port sudah dipakai

Error: Bind for 0.0.0.0:3306 failed: port is already allocated.

Artinya ada service lain yang udah pakai port 3306 (biasanya MySQL lokal).

Solusi: ganti port mapping di docker-compose.yml jadi 3307:3306 atau stop service MySQL lokal.

Permission denied di folder storage

Laravel nggak bisa nulis ke storage atau cache.

Solusi: set permission dari dalam container:

docker-compose exec app chown -R www-data:www-data storage bootstrap/cache
docker-compose exec app chmod -R 775 storage bootstrap/cache

Container terus restart

Cek log untuk lihat error:

docker-compose logs app

Biasanya karena syntax error di Dockerfile atau service dependency belum ready.

Database connection refused

Pastikan:

  1. Service db udah running: docker-compose ps.
  2. DB_HOST di .env sesuai nama service di docker-compose.yml.
  3. Wait beberapa detik setelah start container, MySQL butuh waktu initialize.

Composer install lambat

Pakai Composer cache di host:

services:
  app:
    volumes:
      - ~/.composer:/root/.composer

Atau install package dari host langsung kalau nggak butuh extension khusus.

Kenapa Docker Worth It untuk Developer PHP Indonesia

Mungkin kamu mikir: "Ribet banget setup-nya, XAMPP tinggal next-next-finish."

Fair point.

Tapi coba pikir long term benefit-nya.

Onboarding developer baru: dari seharian jadi 10 menit.

Tinggal clone repo, docker-compose up -d, done.

Semua dependency, database, Redis, sudah jalan otomatis.

Nggak ada lagi drama "di laptop gue jalan".

Semua developer, staging, dan production pakai environment yang persis sama.

Bug yang muncul di production bisa direproduksi exact di laptop developer.

Gampang eksperimen tanpa "merusak" laptop.

Mau coba PHP 8.3 beta? Tinggal ganti image, restart container.

Kalau nggak suka, tinggal ganti balik atau hapus container.

Laptop kamu tetap bersih.

Skill yang transferable.

Docker bukan cuma buat PHP.

Skill yang kamu pelajari bisa dipake untuk Node.js, Python, Go, atau bahasa lain.

Dan skill Docker sangat dicari di job market Indonesia.

Persiapan untuk production deployment modern.

Banyak platform hosting modern (AWS ECS, Google Cloud Run, DigitalOcean App Platform) pakai container.

Kalau kamu udah familiar Docker di development, deploy ke production jadi lebih smooth.

Langkah Selanjutnya Setelah Menguasai Dasar Docker

Kalau kamu udah comfortable dengan setup Docker dasar, next level-nya apa?

Docker Compose untuk service tambahan.

Tambah Mailhog untuk testing email, Elasticsearch untuk search, MinIO untuk S3-compatible storage.

Multi-stage builds.

Optimize ukuran image dengan multi-stage build di Dockerfile.

Docker untuk CI/CD.

Integrasikan Docker dengan GitHub Actions atau GitLab CI untuk automated testing dan deployment.

Kubernetes untuk orchestration.

Kalau project udah production scale besar, pelajari Kubernetes untuk manage ratusan container.

Docker best practices.

Pelajari security best practices, image optimization, dan production-ready configuration.

Docker itu learning curve-nya emang agak steep di awal.

Tapi setelah kamu melewati fase "waduh ribet amat", kamu nggak akan mau balik lagi ke XAMPP atau Laragon.

Karena produktivitas dan konsistensi yang kamu dapat jauh lebih besar dari effort belajar di awal.

Mulai dari satu project kecil, rasain benefit-nya, terus expand ke project lain.

Welcome to containerized development world.

Ajie Kusumadhany
Written by

Ajie Kusumadhany

Founder & Lead Developer KerjaKode. Berpengalaman dalam pengembangan web modern dengan Laravel, React.js, Vue.js, dan teknologi terkini. Passionate tentang coding, teknologi, dan berbagi pengetahuan melalui artikel.

Promo Spesial Hari Ini!

10% DISKON

Promo berakhir dalam:

00 Jam
:
00 Menit
:
00 Detik
Klaim Promo Sekarang!

*Promo berlaku untuk order hari ini

0
User Online
Halo! 👋
Kerjakode Support Online
×

👋 Hai! Pilih layanan yang kamu butuhkan:

Chat WhatsApp Sekarang