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.
- Masalah Umum XAMPP
- Kenapa XAMPP Sering Error?
- Docker: Solusi Modern
- Kelebihan Docker vs XAMPP
- Setup Docker untuk PHP Development
- Persiapan
- Project Structure
- docker-compose.yml
- php/Dockerfile
- nginx/default.conf
- src/index.php
- Menjalankan Project
- Build dan Start
- Akses Service
- Perintah Umum
- Ganti Versi PHP
- Cara Ganti Versi PHP
- Multi-Version PHP
- Troubleshooting
- Error: Port Already in Use
- Error: Permission Denied
- Error: Container Tidak Start
- Error: MySQL Tidak Bisa Connect
- Tips Development
- 1. Gunakan Bind Mount
- 2. Setup Development Tools
- 3. Gunakan .env File
- 4. Backup Database
- Migrasi dari XAMPP ke Docker
- Langkah Migrasi
- Checklist Migrasi
- Kesimpulan
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:
| Error | Penyebab | Frekuensi |
|---|---|---|
| Port 80/443 sudah dipakai | Skype, IIS, atau service lain menggunakan port yang sama | Sangat sering |
| Apache tidak mau start | Port conflict, module tidak kompatibel | Sering |
| MySQL crash tiba-tiba | Corrupt database, memory leak | Sering |
| PHP version locked | Tidak bisa ganti versi PHP dengan mudah | Kadang |
| XAMPP tidak bisa diinstall | Permission Windows, antivirus block | Kadang |
Kenapa XAMPP Sering Error?
XAMPP menjalankan semua service (Apache, MySQL, PHP) dalam satu bundle. Masalahnya:
- Port conflict - Port 80 dan 443 sering dipakai service lain
- Tidak isolasi - Semua service berjalan di environment yang sama
- Versi PHP kunci - Sulit ganti versi PHP untuk project berbeda
- Windows-centric - Kurang optimal di Linux/Mac
- 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
| Aspek | XAMPP | Docker |
|---|---|---|
| Isolasi | Semua service jadi satu | Setiap service terpisah |
| Port | Harus port 80/443 | Bisa port bebas |
| Versi PHP | Terkunci | Bisa ganti versi |
| Reproducibility | Sulit | Sangat mudah |
| Performance | Berat | Ringan |
| Multi-version | Tidak bisa | Bisa jalankan beberapa versi sekaligus |
| Deployment | Manual | Bisa langsung deploy ke server |
Setup Docker untuk PHP Development
Persiapan
-
Install Docker Desktop
-
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
| Service | URL | Keterangan |
|---|---|---|
| Website | http://localhost:8080 | PHP application |
| phpMyAdmin | http://localhost:8081 | Database management |
| MySQL | localhost:3306 | Direct 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
- Edit file
php/Dockerfile:
FROM php:8.1-fpm
# atau
FROM php:8.3-fpm
- 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
- Backup database XAMPP - Buka phpMyAdmin XAMPP, export semua database
- Install Docker Desktop - Download dan install dari website resmi
- Buat docker-compose.yml - Copy template dari atas
- Copy source code - Pindahkan file project ke folder
src/ - Import database - Copy SQL backup ke folder
mysql/ - 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.
Artikel Terkait
Download Video & MP3 YouTube Lewat Terminal Windows
Panduan lengkap menggunakan yt-dlp di Windows untuk download video dan musik dari YouTube langsung dari command line.
Tech TipsPanduan Lengkap iPhone Jailbreak 2026: Cara, Risiko, dan Manfaatnya
Semua yang perlu kamu ketahui tentang jailbreak iPhone di tahun 2026, tools terbaru, cara kerja, risiko, dan apa yang bisa kamu dapatkan.
HomelabSelf-hosted Analytics dengan Umami: Google Analytics Alternative yang Privacy-Friendly
Panduan lengkap setup Umami analytics self-hosted sebagai alternatif Google Analytics. Privacy-friendly, cepat, dan data sepenuhnya milik kamu.
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.