Cara Menjalankan WordPress dengan Docker Compose
Contoh file compose.yaml untuk WordPress dan MariaDB, cara menyimpan password di .env, memasang HTTPS lewat reverse proxy, dan backup data.
Jawaban singkat
Siapkan satu file compose.yaml berisi layanan WordPress dan MariaDB dengan volume terpisah, simpan password di file .env, jalankan docker compose up -d, lalu pasang reverse proxy untuk HTTPS. Data aman selama volume tidak dihapus.
Daftar isi
- Apa yang harus siap sebelum mulai?
- Langkah menjalankan WordPress
- 1. Buat folder proyek
- 2. Simpan password di file .env
- 3. Tulis compose.yaml
- 4. Jalankan
- 5. Pasang reverse proxy untuk HTTPS
- 6. Selesaikan instalasi WordPress
- 7. Naikkan batas upload (bila perlu)
- Bagaimana cara backup WordPress di Docker?
- Ringkasan perintah harian
- Pertanyaan yang sering diajukan
- Checklist singkat
Ingin menjalankan WordPress di VPS tanpa memasang Apache, PHP, dan MySQL satu per satu? Docker Compose memungkinkan semuanya ditulis dalam satu file, dijalankan dengan satu perintah, dan dipindahkan ke server lain dengan mudah.
Jawabannya singkat: kamu butuh dua container (WordPress dan database), dua volume untuk menyimpan data, serta reverse proxy untuk HTTPS. Panduan ini memakai image resmi wordpress dan mariadb dari Docker Hub.
Apa yang harus siap sebelum mulai?
- VPS Linux dengan Docker Engine dan plugin Compose. Kalau belum, ikuti cara install Docker dan Docker Compose di Ubuntu.
- Domain yang record A-nya sudah mengarah ke IP VPS.
- RAM minimal sekitar 1 GB untuk satu situs kecil; lebih baik 2 GB bila ada plugin berat.
Cek dulu dengan docker compose version. Bila keluar nomor versi, kamu siap.
Langkah menjalankan WordPress
1. Buat folder proyek
mkdir -p ~/wordpress && cd ~/wordpress
Semua file proyek (compose, .env, konfigurasi tambahan) disimpan di sini. Folder ini yang nanti kamu salin bila pindah server.
2. Simpan password di file .env
Buat file .env:
DB_PASSWORD=ganti-password-panjang-acak
DB_ROOT_PASSWORD=ganti-password-root-lain
Compose otomatis membaca file .env di folder yang sama dan mengganti ${DB_PASSWORD} di file compose dengan nilainya. Batasi izinnya dengan chmod 600 .env dan jangan memasukkannya ke repositori Git.
3. Tulis compose.yaml
services:
db:
image: mariadb:11.4
restart: unless-stopped
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
ports:
- "127.0.0.1:8080:80"
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
Beberapa hal yang sengaja dibuat begini:
- Database tidak punya
ports. Container WordPress menjangkaunya lewat nama layanandbdi jaringan internal Compose, jadi port 3306 tidak pernah terbuka ke luar. - Port WordPress diikat ke
127.0.0.1. Docker bisa melewati aturan UFW saat mem-publish port ke semua alamat. Dengan127.0.0.1:8080, situs hanya bisa diakses lewat reverse proxy di server yang sama. Penjelasan lengkapnya ada di mengamankan Docker agar port tidak bocor. - Dua volume bernama.
db_datamenyimpan database,wp_datamenyimpan inti WordPress, tema, plugin, dan upload.
Untuk produksi, ganti latest dengan tag versi tertentu yang tercantum di halaman image di Docker Hub, supaya pembaruan terjadi saat kamu memutuskannya.
4. Jalankan
docker compose up -d
docker compose ps
docker compose logs -f wordpress
Tunggu sampai log database menyatakan siap menerima koneksi. Uji dari server dengan curl -I http://127.0.0.1:8080; jawaban berupa redirect ke halaman instalasi berarti WordPress berjalan.
5. Pasang reverse proxy untuk HTTPS
Reverse proxy menerima koneksi di port 80 dan 443, mengurus sertifikat SSL, lalu meneruskan ke 127.0.0.1:8080. Contoh paling ringkas dengan Caddy (dipasang langsung di host) adalah file Caddyfile berikut:
contoh.com {
reverse_proxy 127.0.0.1:8080
}
Caddy mengambil sertifikat Let's Encrypt secara otomatis. Nginx atau Traefik juga bisa; perbandingannya ada di Traefik, Caddy, atau Nginx Proxy Manager. Pastikan proxy meneruskan header X-Forwarded-Proto agar WordPress tahu situsnya diakses lewat HTTPS dan tidak terjebak redirect berulang.
6. Selesaikan instalasi WordPress
Buka https://contoh.com di browser, pilih bahasa, isi nama situs, user admin, dan password kuat. Hindari nama user "admin". Setelah masuk dashboard, buka Pengaturan lalu Umum dan pastikan alamat WordPress dan alamat situs sudah memakai https://. Kalau masih http://, periksa lagi header dari reverse proxy sebelum mengubahnya.
7. Naikkan batas upload (bila perlu)
Buat file uploads.ini:
upload_max_filesize = 64M
post_max_size = 64M
Tambahkan baris ini di bagian volumes layanan wordpress, lalu jalankan docker compose up -d lagi:
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
Bagaimana cara backup WordPress di Docker?
Ada dua hal yang dibackup: database dan file. Untuk database:
docker compose exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" wordpress' > wp-db.sql
Untuk file, arsipkan isi volume wp_data lewat container sementara:
docker run --rm -v wordpress_wp_data:/data -v "$PWD":/backup alpine tar czf /backup/wp-files.tar.gz -C /data .
Nama volume di host biasanya diawali nama folder proyek, jadi cek dengan docker volume ls. Simpan kedua file backup di luar server.
Ringkasan perintah harian
| Tujuan | Perintah |
|---|---|
| Melihat status | docker compose ps |
| Melihat log | docker compose logs -f wordpress |
| Restart layanan | docker compose restart |
| Mematikan tanpa hapus data | docker compose down |
| Memperbarui image | docker compose pull && docker compose up -d |
Jangan menambahkan opsi -v pada docker compose down kecuali kamu memang ingin menghapus volume, karena opsi itu ikut menghapus database dan upload. Detail pembaruan yang aman dibahas di update container Docker tanpa kehilangan data.
Pertanyaan yang sering diajukan
Apakah WordPress di Docker lebih cepat dari instalasi biasa?
Tidak otomatis. Docker memudahkan pemasangan dan pemindahan, tapi performa tetap ditentukan oleh spesifikasi server, cache, dan plugin yang dipakai.
Bisakah menjalankan beberapa situs WordPress di satu VPS?
Bisa. Buat folder proyek terpisah untuk tiap situs dengan port lokal berbeda (misalnya 8081, 8082), lalu arahkan tiap domain di reverse proxy ke port masing-masing.
Kenapa muncul "Error establishing a database connection"?
Biasanya password di .env tidak sama dengan yang dipakai saat volume database pertama kali dibuat. Variabel MARIADB_* hanya dibaca saat inisialisasi awal, jadi mengubah .env belakangan tidak mengganti password yang sudah tersimpan.
Apakah update WordPress dari dashboard tetap bisa?
Bisa, karena file inti ada di volume wp_data. Tetap pastikan backup sudah ada sebelum update besar.
Checklist singkat
- File
.envberizin 600 dan tidak ikut ke Git. - Database tanpa port publik, WordPress hanya di
127.0.0.1. - HTTPS aktif lewat reverse proxy.
- Backup database dan volume terjadwal, disimpan di luar server.


