Tutorial Docker dari nol untuk developer PHP/Laravel. Belajar container, compose, dan deploy ke VPS dengan workflow yang sederhana dan repeatable.
Banyak developer Indonesia masih deploy secara manual: SSH ke server, git pull, jalankan composer install, restart PHP-FPM, dan berdoa semoga tidak ada yang rusak. Proses ini berisiko tinggi, sulit direproduksi, dan membuang waktu berjam-jam ketika terjadi masalah. Docker hadir untuk menyelesaikan semua ini — dan di 2026, belajar Docker bukan lagi "nice to have", ini adalah skill wajib untuk setiap developer profesional.
Apa Itu Docker? (Penjelasan Sederhana)
Bayangkan Docker seperti kotak bento: makanan, nasi, lauk, dan sayur sudah dikemas rapi dalam satu kotak. Anda tidak perlu menyiapkan bahan dari nol — tinggal buka dan siap santap.
Dalam konteks programming: Docker mengemas aplikasi, dependencies, dan konfigurasi dalam satu "container" yang bisa jalan di mana saja — laptop Anda, server production, bahkan laptop teman yang OS-nya berbeda.
Masalah yang Diselesaikan Docker
- "Works on my machine": Aplikasi jalan di laptop tapi error di server? Dengan Docker, environment persis sama di mana saja.
- Dependency hell: Proyek A butuh PHP 8.1, proyek B butuh PHP 8.3, proyek C butuh PHP 8.0. Tanpa Docker, ini mimpi buruk. Dengan Docker, setiap proyek punya container sendiri.
- Setup yang lama: Developer baru join tim, butuh 1 hari untuk setup environment. Dengan Docker:
docker compose up— 5 menit, selesai. - Deployment yang risky: Update production bisa merusak environment. Dengan Docker, rollback cukup switch ke container image sebelumnya.
Konsep Dasar Docker
Image vs Container
Image = blueprints/resep masakan. Berisi instruksi tentang bagaimana membangun environment.
Container = masakan yang sudah jadi dari resep tersebut. Bisa dijalankan, dihentikan, dan dihapus tanpa mengubah resep aslinya.
Satu image bisa menghasilkan banyak container — sama seperti satu resep bisa dipakai masak berkali-kali.
Dockerfile
File yang berisi instruksi untuk membuat image. Contoh Dockerfile untuk aplikasi PHP/Laravel:
# Mulai dari image PHP resmi
FROM php:8.3-fpm-alpine
# Install extensions yang dibutuhkan Laravel
RUN docker-php-ext-install pdo pdo_mysql bcmath
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/html
# Copy source code
COPY . .
# Install dependencies
RUN composer install --no-dev --optimize-autoloader
# Set permissions
RUN chown -R www-data:www-data storage bootstrap/cache
# Expose port
EXPOSE 9000
CMD ["php-fpm"]
Docker Compose
Aplikasi web biasanya butuh lebih dari 1 service: PHP, MySQL, Redis, Nginx. Docker Compose mengatur semua service ini dalam satu file konfigurasi.
# docker-compose.yml
version: '3.8'
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.0
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: secret
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
mysql_data:
Dengan konfigurasi ini, docker compose up -d akan menjalankan 4 service sekaligus. Semua terisolasi dari sistem host Anda.
Workflow Docker untuk Development
Berikut workflow harian developer yang menggunakan Docker:
Pagi Hari: Mulai Kerja
# Start semua service
docker compose up -d
# Cek status
docker compose ps
# Lihat log jika ada error
docker compose logs -f app
Selama Development
# Masuk ke container PHP untuk jalankan artisan/composer
docker compose exec app bash
# Dalam container:
php artisan migrate
composer require package/name
php artisan tinker
# Atau langsung dari host:
docker compose exec app php artisan migrate
Sore Hari: Selesai Kerja
# Stop semua service (data database tetap aman di volume)
docker compose down
# Jika ingin hapus semua data dan mulai fresh:
docker compose down -v
Deploy Aplikasi PHP ke VPS dengan Docker
Ini adalah bagian paling berharga dari artikel ini. Berikut step-by-step deploy aplikasi PHP/Laravel/Symfony ke VPS menggunakan Docker:
Persiapan VPS
- Sewa VPS dari provider lokal (IDCloudHost, Dewaweb, Rumahweb). Minimal: 1GB RAM, 20GB SSD, Ubuntu 22.04.
- Install Docker dan Docker Compose:
# Install Docker (Ubuntu) curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Install Docker Compose sudo apt install docker-compose-plugin # Verifikasi docker --version docker compose version - Setup firewall:
sudo ufw allow 22/tcp # SSH sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable
Deploy Flow
- Push code ke GitHub/GitLab repository
- Di VPS, clone repository:
git clone https://github.com/your/app.git - Copy .env file:
cp .env.example .envdan edit konfigurasi production - Build dan jalankan:
docker compose -f docker-compose.prod.yml up -d --build - Jalankan migration:
docker compose exec app php artisan migrate --force
Production Docker Compose
Docker Compose untuk production berbeda dari development — tanpa volume mount, dengan build optimization:
# docker-compose.prod.yml
services:
app:
build:
context: .
dockerfile: Dockerfile.prod
restart: always
environment:
APP_ENV: production
depends_on:
- mysql
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx-prod.conf:/etc/nginx/conf.d/default.conf
- ./certbot/conf:/etc/letsencrypt
depends_on:
- app
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
SSL Certificate dengan Let's Encrypt
Gunakan Certbot container untuk otomatis mendapatkan dan renew SSL certificate:
# Pertama kali - dapatkan certificate
docker compose run --rm certbot certonly \
--webroot -w /var/www/certbot \
-d yourdomain.com \
--email your@email.com \
--agree-tos
# Auto-renew via crontab
0 0 1 * * docker compose run --rm certbot renew
CI/CD Pipeline Sederhana
Otomasi deploy setiap kali push ke branch main menggunakan GitHub Actions:
# .github/workflows/deploy.yml
name: Deploy to VPS
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /home/app
git pull origin main
docker compose -f docker-compose.prod.yml up -d --build
docker compose exec -T app php artisan migrate --force
docker compose exec -T app php artisan config:cache
Dengan pipeline ini, setiap push ke main = otomatis deploy di production. Tidak ada lagi SSH manual dan menjalankan perintah satu per satu.
Tips untuk Developer Indonesia
- Jangan skip Docker untuk development: Mulai pakai Docker untuk project lokal dulu. Setelah nyaman, baru terapkan untuk deployment.
- Image size matters: Gunakan alpine-based image (
php:8.3-fpm-alpinebukanphp:8.3-fpm). Perbedaan bisa 400MB vs 50MB — signifikan untuk VPS 20GB. - Backup volume secara berkala:
docker compose exec mysql mysqldumpdan simpan ke remote storage (Google Drive via rclone). - Monitor resource:
docker statsuntuk lihat CPU/RAM per container. Pastikan tidak melebihi kapasitas VPS. - Belajar multi-stage build: Pisahkan build stage (install dependencies, compile assets) dari runtime stage. Ini menghasilkan image yang lebih kecil dan aman.
Docker bukan teknologi masa depan — ini teknologi masa sekarang. Dengan investasi waktu 1-2 hari untuk belajar dasarnya, Anda akan menghemat ratusan jam deployment dan troubleshooting sepanjang karir Anda. Mulai hari ini: install Docker, coba docker compose up untuk project Anda, dan rasakan perbedaannya.