Proyek: WordPress dan MySQL
Situs WordPress lengkap dengan MySQL, tanpa satu baris Dockerfile pun: kedua
image resmi disusun menjadi satu stack Compose dengan dua volume terpisah
(db-data untuk isi database, wp-content untuk tema, plugin, dan unggahan),
healthcheck, serta resep backup dan restore yang bisa diuji lewat disaster
drill.
Struktur Berkas #
| Berkas | Peran |
|---|---|
compose.yaml | Service db (mysql:8.4) dan wordpress (wordpress:6.8-apache) |
.env.example | Contoh environment kredensial (salin menjadi .env) |
.gitignore | Memastikan .env tidak ikut ter-commit |
README.md | Dokumen ini |
Prasyarat #
cp .env.example .envLalu edit .env dan ganti kedua password. Compose menolak menyala bila
kedua variabel itu kosong — pesan galatnya memandu Anda kembali ke .env.
Menjalankan #
docker compose up -dTunggu db berstatus healthy (lihat docker compose ps), lalu buka
http://localhost:8090. Karena wp-config.php sudah disiapkan entrypoint
dari variabel WORDPRESS_DB_*, wizard tidak lagi menanyakan koneksi
database. Empat langkah tersisa:
- Pilih bahasa (misalnya Bahasa Indonesia), lalu lanjut.
- Isi judul situs (misalnya
Toko Kopi Kita), username admin (misalnyabudi), password kuat, dan email. - Klik Install WordPress hingga muncul halaman sukses.
- Klik Log In dan masuk ke dashboard
wp-admin.
Backup #
Database dan berkas dicadangkan dengan alat berbeda karena bentuknya
memang berbeda — mysqldump untuk data terstruktur, tar untuk berkas:
# Backup database (tanpa -t agar aman untuk pipeline).
source .env && docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress' | gzip > backup-wordpress-$(date +\%F).sql.gz
# Backup isi wp-content (tema, plugin, unggahan) dari container wordpress.
docker compose exec -T wordpress tar -czf - -C /var/www/html wp-content > backup-wp-content.tar.gzRestore #
# Restore database.
source .env && gunzip -c backup-wordpress-2026-10-13.sql.gz | docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress'
# Restore wp-content: kosongkan dulu isi volume, lalu ekstrak, lalu
# restart container wordpress agar permission kembali rapi.
docker compose exec -T wordpress sh -c 'rm -rf /var/www/html/wp-content/* && tar -xzf - -C /var/www/html' < backup-wp-content.tar.gz
docker compose restart wordpressDisaster Drill #
Uji cadangan Anda sebelum benar-benar dibutuhkan: hancurkan seluruh data dengan sadar, lalu bangkitkan situs dari berkas backup.
docker compose down -v # HAPUS volume: situs "hilang total"
docker compose up -d # stack baru dengan volume kosong
# ulangi dua perintah Restore di atasBuka kembali http://localhost:8090 — situs, tulisan, dan unggahan kembali
seperti sebelum bencana. Backup yang belum pernah diuji restore-nya bukan
backup.
Backup Otomatis (cron) #
Karakter % punya arti khusus di crontab sehingga harus ditulis \%:
30 2 * * * cd /home/budi/wordpress-dan-mysql && source .env && docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress' | gzip > backup-wordpress-$(date +\%F).sql.gz
30 3 * * 0 cd /home/budi/wordpress-dan-mysql && docker compose exec -T wordpress tar -czf - -C /var/www/html wp-content > backup-wp-content-$(date +\%F).tar.gzMembersihkan #
docker compose down # volume db-data dan wp-content tetap ada
docker compose down -v # sekaligus menghapus seluruh data situs