Lewati ke isi

Server & Infrastruktur

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.

Terbit 5 menit baca

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
  1. Apa yang harus siap sebelum mulai?
  2. Langkah menjalankan WordPress
  3. 1. Buat folder proyek
  4. 2. Simpan password di file .env
  5. 3. Tulis compose.yaml
  6. 4. Jalankan
  7. 5. Pasang reverse proxy untuk HTTPS
  8. 6. Selesaikan instalasi WordPress
  9. 7. Naikkan batas upload (bila perlu)
  10. Bagaimana cara backup WordPress di Docker?
  11. Ringkasan perintah harian
  12. Pertanyaan yang sering diajukan
  13. 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 layanan db di 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. Dengan 127.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_data menyimpan database, wp_data menyimpan 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

TujuanPerintah
Melihat statusdocker compose ps
Melihat logdocker compose logs -f wordpress
Restart layanandocker compose restart
Mematikan tanpa hapus datadocker compose down
Memperbarui imagedocker 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 .env berizin 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.

Sumber & referensi

Baca juga