Table of Contents
▼- Masalah Environment Development yang Diselesaikan Docker
- Konsep Container vs Virtual Machine yang Mudah Dipahami
- Setup Docker untuk Laravel Project Pertama Kali
- Docker Compose untuk Multi Service Development
- Workflow Development dengan Docker yang Efisien
- Mengatasi Masalah Umum Docker untuk PHP Developer
- Kenapa Docker Worth It untuk Developer PHP Indonesia
- Langkah Selanjutnya Setelah Menguasai Dasar Docker
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:
- Download semua image yang dibutuhkan (pertama kali agak lama).
- Build image custom untuk app.
- 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:
- Pakai TablePlus atau DBeaver connect ke
localhost:3306. - Tambah service phpMyAdmin di docker-compose.yml.
- 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:
- Pakai named volume untuk folder
vendordannode_modules. - Jangan sync folder build artifacts yang nggak perlu.
- 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:
- Service db udah running:
docker-compose ps. - DB_HOST di
.envsesuai nama service di docker-compose.yml. - 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.