Kembali ke Blog
Insight

Docker untuk Developer Pemula: Deploy Aplikasi PHP Tanpa Ribet

22 Feb 2026 Idiarsosimbang 7 menit baca
Docker untuk Developer Pemula: Deploy Aplikasi PHP Tanpa Ribet

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

  1. Sewa VPS dari provider lokal (IDCloudHost, Dewaweb, Rumahweb). Minimal: 1GB RAM, 20GB SSD, Ubuntu 22.04.
  2. 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
    
  3. 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

  1. Push code ke GitHub/GitLab repository
  2. Di VPS, clone repository: git clone https://github.com/your/app.git
  3. Copy .env file: cp .env.example .env dan edit konfigurasi production
  4. Build dan jalankan: docker compose -f docker-compose.prod.yml up -d --build
  5. 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

  1. Jangan skip Docker untuk development: Mulai pakai Docker untuk project lokal dulu. Setelah nyaman, baru terapkan untuk deployment.
  2. Image size matters: Gunakan alpine-based image (php:8.3-fpm-alpine bukan php:8.3-fpm). Perbedaan bisa 400MB vs 50MB — signifikan untuk VPS 20GB.
  3. Backup volume secara berkala: docker compose exec mysql mysqldump dan simpan ke remote storage (Google Drive via rclone).
  4. Monitor resource: docker stats untuk lihat CPU/RAM per container. Pastikan tidak melebihi kapasitas VPS.
  5. 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.

Bagikan artikel ini
Chat Kami