Kembali ke Blog
Tech Tips

XAMPP Sering Error? Ini Solusinya pakai Docker

XAMPP sering bikin pusing karena error? Pelajari cara migrasi ke Docker yang lebih stabil, ringan, dan profesional untuk development PHP.

A
Alif Afriza Penulis
· · 6 menit baca
XAMPP Sering Error? Ini Solusinya pakai Docker

XAMPP sudah lama menjadi andalan developer PHP untuk development lokal. Tapi seiring waktu, banyak yang mengeluhkan error yang muncul tanpa solusi jelas. Mulai dari port conflict, Apache yang tidak mau jalan, hingga MySQL yang tiba-tiba corrupt. Docker hadir sebagai solusi yang lebih modern dan stabil.

Masalah Umum XAMPP

Sebelum masuk ke solusi, kenali dulu masalah yang sering terjadi:

ErrorPenyebabFrekuensi
Port 80/443 sudah dipakaiSkype, IIS, atau service lain menggunakan port yang samaSangat sering
Apache tidak mau startPort conflict, module tidak kompatibelSering
MySQL crash tiba-tibaCorrupt database, memory leakSering
PHP version lockedTidak bisa ganti versi PHP dengan mudahKadang
XAMPP tidak bisa diinstallPermission Windows, antivirus blockKadang

Kenapa XAMPP Sering Error?

XAMPP menjalankan semua service (Apache, MySQL, PHP) dalam satu bundle. Masalahnya:

  1. Port conflict - Port 80 dan 443 sering dipakai service lain
  2. Tidak isolasi - Semua service berjalan di environment yang sama
  3. Versi PHP kunci - Sulit ganti versi PHP untuk project berbeda
  4. Windows-centric - Kurang optimal di Linux/Mac
  5. Tidak reproducible - Susah setup ulang di komputer lain

Docker: Solusi Modern

Docker mengisolasi setiap service dalam container terpisah. Setiap container punya environment sendiri, tidak saling ganggu.

Kelebihan Docker vs XAMPP

AspekXAMPPDocker
IsolasiSemua service jadi satuSetiap service terpisah
PortHarus port 80/443Bisa port bebas
Versi PHPTerkunciBisa ganti versi
ReproducibilitySulitSangat mudah
PerformanceBeratRingan
Multi-versionTidak bisaBisa jalankan beberapa versi sekaligus
DeploymentManualBisa langsung deploy ke server

Setup Docker untuk PHP Development

Persiapan

  1. Install Docker Desktop

  2. Docker Compose sudah include di Docker Desktop

Project Structure

Buat folder project dengan struktur seperti ini:

my-project/
├── docker-compose.yml
├── php/
│   └── Dockerfile
├── nginx/
│   └── default.conf
├── src/
│   ├── index.php
│   └── ...
└── mysql/
    └── init.sql

docker-compose.yml

Buat file docker-compose.yml:

services:
  php:
    build:
      context: .
      dockerfile: php/Dockerfile
    volumes:
      - ./src:/var/www/html
    networks:
      - app-network

  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    ports:
      - "8081:80"
    depends_on:
      - mysql
    networks:
      - app-network

networks:
  app-network:

volumes:
  mysql-data:

php/Dockerfile

Buat file php/Dockerfile:

FROM php:8.2-fpm

RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

nginx/default.conf

Buat file nginx/default.conf:

server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

src/index.php

Buat file src/index.php untuk testing:

<?php
$host = 'mysql';
$db   = 'mydb';
$user = 'user';
$pass = 'password';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "<h1>Docker PHP Development Berhasil!</h1>";
    echo "<p>PHP Version: " . phpversion() . "</p>";
    echo "<p>MySQL Connection: OK</p>";

    $stmt = $pdo->query("SELECT * FROM users");
    echo "<h2>Users:</h2>";
    echo "<ul>";
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "<li>{$row['name']} ({$row['email']})</li>";
    }
    echo "</ul>";

} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
?>

Menjalankan Project

Build dan Start

docker compose build
docker compose up -d
docker compose ps

Akses Service

ServiceURLKeterangan
Websitehttp://localhost:8080PHP application
phpMyAdminhttp://localhost:8081Database management
MySQLlocalhost:3306Direct database access

Perintah Umum

docker compose down
docker compose down -v
docker compose logs -f
docker compose exec php bash
docker compose exec php php artisan serve
docker compose exec php composer install

Ganti Versi PHP

Salah satu keunggulan Docker adalah bisa ganti versi PHP dengan mudah.

Cara Ganti Versi PHP

  1. Edit file php/Dockerfile:
FROM php:8.1-fpm
# atau
FROM php:8.3-fpm
  1. Build ulang:
docker compose build --no-cache
docker compose up -d

Multi-Version PHP

Ingin menjalankan beberapa versi PHP sekaligus? Bisa.

services:
  php81:
    build:
      context: .
      dockerfile: php/Dockerfile81
    volumes:
      - ./src:/var/www/html

  php82:
    build:
      context: .
      dockerfile: php/Dockerfile82
    volumes:
      - ./src:/var/www/html

Troubleshooting

Error: Port Already in Use

sudo lsof -i :8080
sudo kill -9 <PID>

Error: Permission Denied

sudo chown -R $USER:$USER .
chmod -R 755 .

Error: Container Tidak Start

docker compose logs php
docker compose logs nginx
docker compose logs mysql
docker compose restart

Error: MySQL Tidak Bisa Connect

docker compose exec mysql mysqladmin ping -h localhost -u root -p
docker compose down -v
docker compose up -d

Tips Development

1. Gunakan Bind Mount

Bind mount memungkinkan perubahan file langsung terlihat tanpa rebuild:

volumes:
  - ./src:/var/www/html

2. Setup Development Tools

Tambahkan container untuk debugging:

  mailhog:
    image: mailhog/mailhog
    ports:
      - "8025:8025"

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

3. Gunakan .env File

Simpan environment variables di .env:

DB_ROOT_PASSWORD=root
DB_NAME=mydb
DB_USER=user
DB_PASSWORD=password

Lalu gunakan di docker-compose.yml:

environment:
  MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
  MYSQL_DATABASE: ${DB_NAME}

4. Backup Database

docker compose exec mysql mysqldump -u root -p mydb > backup.sql
docker compose exec -T mysql mysql -u root -p mydb < backup.sql

Migrasi dari XAMPP ke Docker

Langkah Migrasi

  1. Backup database XAMPP - Buka phpMyAdmin XAMPP, export semua database
  2. Install Docker Desktop - Download dan install dari website resmi
  3. Buat docker-compose.yml - Copy template dari atas
  4. Copy source code - Pindahkan file project ke folder src/
  5. Import database - Copy SQL backup ke folder mysql/
  6. Start containers - Jalankan docker compose up -d

Checklist Migrasi

  • Docker Desktop terinstall
  • docker-compose.yml sudah dibuat
  • Source code sudah dipindahkan
  • Database sudah diimport
  • Website bisa diakses di localhost:8080
  • phpMyAdmin bisa diakses di localhost:8081

Kesimpulan

Docker memberikan solusi yang lebih baik dari XAMPP untuk development PHP. Dengan isolasi container, mudah ganti versi PHP, dan reproducibility yang tinggi, Docker adalah pilihan terbaik untuk developer modern.

Jangan ragu untuk migrasi dari XAMPP ke Docker. Mulai dari project kecil, dan rasakan bedanya.

Open for Contributors

Ide kamu layak dibaca ribuan orang.

ByteNesia dibangun untuk semua orang. Kalau kamu punya pengalaman, tutorial, atau opini tentang teknologi, tulis dan bagikan lewat sini. Nama kamu akan tercantum sebagai kontributor.

Tulis apa saja: review tools, tutorial homelab, tips security, atau cerita pengalaman tech kamu.

Diskusi & Komentar