Lewati ke konten utama
๐Ÿš€ nusa.id cloud server linux indonesialihat paket

Cara Instalasi WordPress dengan Docker Compose di Ubuntu 24.04

ยท 11 menit membaca
Ilhamsyah
Maintainer

WordPress memerlukan web server, PHP, dan database yang saling terhubung, sehingga pemasangan manual di server menyisakan banyak paket dan berkas konfigurasi yang harus dirawat. Docker Compose menjalankan WordPress dan MariaDB sebagai dua container terpisah yang didefinisikan dalam satu berkas, sementara berkas situs dan data database disimpan di direktori host. Pendekatan itu membuat instalasi WordPress di Ubuntu 24.04 mudah diulang dan datanya tetap ada setelah container di-restart.

Requirementsโ€‹

  • Server Ubuntu 24.04 LTS 64-bit dengan akses root.
  • Koneksi internet untuk mengunduh paket Docker dan image container.
  • Docker Engine dengan plugin Compose, yaitu perintah docker compose.
  • Port 8080/TCP belum dipakai proses lain.
  • Package openssl untuk membuat password acak; paket ini tersedia bawaan di Ubuntu 24.04.

Environmentโ€‹

Semua perintah dijalankan sebagai root. Jika Anda masuk sebagai pengguna lain, jalankan sudo -i lebih dulu agar direktori /root dapat diakses.

  • Sistem operasi: Ubuntu 24.04 LTS 64-bit
  • Runtime: Docker Engine dengan plugin Compose
  • WordPress: image wordpress:7.1.1-apache (Apache, PHP 8.3)
  • Database: image mariadb:11.4-noble
  • Pemetaan port: host 8080 ke container 80
  • Direktori proyek: /root/docker-compose

Instalasi WordPress dengan Docker Composeโ€‹

Memasang Docker Engine di Ubuntu 24.04โ€‹

WordPress dan MariaDB berjalan di atas Docker Engine, jadi runtime harus tersedia lebih dulu.

Info

Jika server Anda pernah memasang paket Docker dari repositori Ubuntu seperti docker.io, docker-compose-v2, atau podman-docker, hapus paket tersebut dengan apt remove <nama-paket> agar tidak bertabrakan dengan paket resmi Docker. Penghapusan paket tidak menghapus isi /var/lib/docker, tetapi container dan image lama dapat berhenti berjalan.

Tambahkan repositori resmi Docker, lalu pasang paketnya:

apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Output:

Get:1 https://download.docker.com/linux/ubuntu noble/stable amd64 containerd.io amd64 2.3.5-1~ubuntu.24.04~noble [22.4 MB]
Get:2 https://download.docker.com/linux/ubuntu noble/stable amd64 docker-ce-cli amd64 5:29.8.1-1~ubuntu.24.04~noble [17.6 MB]
Get:4 https://download.docker.com/linux/ubuntu noble/stable amd64 docker-ce amd64 5:29.8.1-1~ubuntu.24.04~noble [24.3 MB]
Get:5 https://download.docker.com/linux/ubuntu noble/stable amd64 docker-buildx-plugin amd64 0.37.1-1~ubuntu.24.04~noble [17.3 MB]
Get:7 https://download.docker.com/linux/ubuntu noble/stable amd64 docker-compose-plugin amd64 5.5.1-1~ubuntu.24.04~noble [8012 kB]
Setting up docker-buildx-plugin (0.37.1-1~ubuntu.24.04~noble) ...
Setting up containerd.io (2.3.5-1~ubuntu.24.04~noble) ...
Setting up docker-compose-plugin (5.5.1-1~ubuntu.24.04~noble) ...
Setting up docker-ce-cli (5:29.8.1-1~ubuntu.24.04~noble) ...
Setting up docker-ce (5:29.8.1-1~ubuntu.24.04~noble) ...

Pastikan daemon berjalan dan plugin Compose tersedia:

systemctl is-active docker
docker compose version

Output:

active
Docker Compose version v5.5.1

docker compose version harus menampilkan versi plugin Compose tanpa kesalahan. Jika perintah docker compose tidak dikenal, plugin docker-compose-plugin belum terpasang.

Menyiapkan Direktori dan Berkas Konfigurasiโ€‹

Buat direktori kerja beserta dua direktori data yang akan di-mount ke container:

mkdir -p /root/docker-compose/data/app /root/docker-compose/data/database
cd /root/docker-compose

data/app menampung berkas WordPress (termasuk tema dan plugin), sedangkan data/database menampung data MariaDB. Keduanya berupa bind mount, jadi isinya tetap ada meski container dihapus.

Buat password acak dan simpan konfigurasi rahasia di .env dengan mode 0600. Password tidak pernah ditampilkan ke layar:

umask 077
MARIADB_ROOT_PASSWORD="$(openssl rand -base64 24)"
MARIADB_PASSWORD="$(openssl rand -base64 24)"

tee /root/docker-compose/.env >/dev/null <<EOF
MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
MARIADB_DATABASE=wordpress
MARIADB_USER=wordpress
MARIADB_PASSWORD=${MARIADB_PASSWORD}
EOF

chmod 600 /root/docker-compose/.env

Periksa izin berkasnya:

stat -c '%a %n' /root/docker-compose/.env

Output:

600 /root/docker-compose/.env

Simpan definisi stack. Heredoc dibungkus tanda kutip (<<'YAML') agar ${...} tetap dibaca oleh Compose dari .env, bukan oleh shell:

tee /root/docker-compose/docker-compose.yml >/dev/null <<'YAML'
services:
db:
image: mariadb:11.4-noble
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
volumes:
- ./data/database:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s

wordpress:
image: wordpress:7.1.1-apache
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: ${MARIADB_DATABASE}
WORDPRESS_DB_USER: ${MARIADB_USER}
WORDPRESS_DB_PASSWORD: ${MARIADB_PASSWORD}
volumes:
- ./data/app:/var/www/html
YAML

Nilai yang perlu Anda sesuaikan: MARIADB_USER dan MARIADB_DATABASE menentukan nama user dan schema database. WORDPRESS_DB_HOST mengarah ke service db pada port 3306 di dalam network Compose. Health check memakai skrip healthcheck.sh bawaan image MariaDB, bukan probe buatan sendiri. Port 3306 tidak dipublikasikan ke host karena hanya dipakai antar-container.

Validasi berkas sebelum dijalankan:

docker compose config --quiet && echo "konfigurasi valid"

Output:

konfigurasi valid

Menjalankan Containerโ€‹

cd /root/docker-compose
docker compose up -d

Output:

Image mariadb:11.4-noble Pulled
Image wordpress:7.1.1-apache Pulled
Network docker-compose_default Created
Container docker-compose-db-1 Started
Container docker-compose-db-1 Healthy
Container docker-compose-wordpress-1 Started

Compose mengunduh mariadb:11.4-noble dan wordpress:7.1.1-apache, membuat network proyek, lalu menjalankan container db lebih dulu. Container wordpress baru dibuat setelah db melewati health check, karena entrypoint MariaDB perlu waktu untuk menginisialisasi datadir.

Verifikasi Instalasi WordPress di Ubuntu 24.04โ€‹

Cek status container:

docker compose ps

Output:

NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-compose-db-1 mariadb:11.4-noble "docker-entrypoint.sโ€ฆ" db 29 seconds ago Up 24 seconds (healthy) 3306/tcp
docker-compose-wordpress-1 wordpress:7.1.1-apache "docker-entrypoint.sโ€ฆ" wordpress 25 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp

Service db harus berstatus Up dengan penanda (healthy), dan wordpress berstatus Up. Jika db masih health: starting, tunggu sekitar 30 detik lalu ulangi perintahnya.

Pastikan port yang dipublikasikan sesuai definisi:

docker compose port wordpress 80

Output:

0.0.0.0:8080

Kedua mount harus sudah terisi berkas dari image:

ls -1 /root/docker-compose/data/app/wp-config.php
ls -d /root/docker-compose/data/database/mysql

Output:

/root/docker-compose/data/app/wp-config.php
/root/docker-compose/data/database/mysql

wp-config.php dibuat otomatis dari variabel WORDPRESS_..., sedangkan direktori mysql menandakan inisialisasi database sudah berjalan.

Konfigurasi Dasarโ€‹

Mengubah Port Publikasiโ€‹

Buka berkas compose dengan text editor pilihan Anda:

nano /root/docker-compose/docker-compose.yml

atau:

vim /root/docker-compose/docker-compose.yml

Ubah baris - "8080:80" menjadi - "80:80", simpan, lalu terapkan:

cd /root/docker-compose
docker compose up -d
docker compose port wordpress 80

Output:

Container docker-compose-wordpress-1 Recreated
Container docker-compose-db-1 Healthy
Container docker-compose-wordpress-1 Started
0.0.0.0:80

Langkah pengujian di bagian berikutnya memakai port 8080. Kembalikan pemetaan ke - "8080:80", lalu jalankan docker compose up -d sebelum melanjutkan, atau sesuaikan semua URL pengujian ke port baru.

Alamat situs WordPress tersimpan di tabel wp_options setelah instalasi selesai. Jika Anda mengubah port sesudah itu, perbarui nilai siteurl dan home sesuai alamat baru atau lakukan instalasi ulang.

Mengaktifkan Mode Debugโ€‹

Masih di berkas yang sama, tambahkan satu baris pada blok environment service wordpress:

WORDPRESS_DEBUG: "1"

Terapkan ulang konfigurasi, lalu pastikan variabelnya masuk ke container:

cd /root/docker-compose
docker compose up -d
docker compose exec -T wordpress printenv WORDPRESS_DEBUG

Output:

Container docker-compose-wordpress-1 Recreated
Container docker-compose-db-1 Healthy
Container docker-compose-wordpress-1 Started
1

Mode debug menampilkan pesan kesalahan PHP langsung di halaman WordPress. Matikan kembali dengan menghapus baris tersebut dan menjalankan docker compose up -d jika situs sudah dibuka untuk publik.

Pengujian Fungsionalโ€‹

Menguji Koneksi Databaseโ€‹

Jalankan kueri dari dalam container db memakai kredensial yang dibaca dari environment container:

docker compose exec -T db sh -c 'MYSQL_PWD="$MARIADB_PASSWORD" mariadb -u "$MARIADB_USER" "$MARIADB_DATABASE" -e "SELECT DATABASE() AS db;"'

Output:

db
wordpress

Opsi -T menonaktifkan TTY sehingga keluaran mariadb tampil tab-separated, bukan sebagai tabel bergaris. Hasil ini membuktikan user wordpress dapat terhubung dan memilih schema yang benar.

Menguji Respons HTTPโ€‹

WordPress mengembalikan kode 302 ke installer selama tabel belum ada. Kode 500 dengan pesan "Error establishing a database connection" justru menandakan koneksi database gagal.

for i in $(seq 1 24); do
code="$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8080 || true)"
[ "$code" = "302" ] && break
sleep 5
done
echo "$code"

Output:

302

Halaman installer harus dapat dimuat:

curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/wp-admin/install.php

Output:

200

Menyelesaikan Instalasi WordPressโ€‹

Buka http://<IP-server>:8080 di browser, pilih bahasa, isi judul situs, username, password, dan email admin, lalu klik Install WordPress. Setelah selesai, halaman depan menampilkan situs Anda dan merespons dengan kode 200.

Troubleshootingโ€‹

Port 8080 sudah dipakaiโ€‹

Gejala: docker compose up -d gagal dengan pesan listen tcp4 0.0.0.0:8080: bind: address already in use.

Penyebab: proses lain sudah menempati port 8080.

Perbaikan: cari pemilik port dengan perintah berikut, lalu hentikan proses tersebut. Jika port memang harus tetap dipakai, ubah pemetaan port di docker-compose.yml mengikuti langkah Mengubah Port Publikasi.

ss -tlnp | grep ':8080 '

Output:

LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:* users:(("docker-proxy",pid=4661,fd=8))
LISTEN 0 4096 [::]:8080 [::]:* users:(("docker-proxy",pid=4668,fd=8))

Error establishing a database connectionโ€‹

Gejala: halaman WordPress menampilkan pesan tersebut, atau container wordpress restart berulang.

Penyebab: container db belum lulus health check, atau kredensial di .env tidak dibaca dengan benar.

Perbaikan: periksa docker compose ps, lalu baca log db berikut. Pastikan db berstatus healthy sebelum WordPress diakses.

docker compose logs --tail=30 db

Output:

db-1 | 2026-09-22 17:18:25 0 [Note] mariadbd: ready for connections.
db-1 | Version: '11.4.13-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution

Access denied for user 'wordpress'โ€‹

Gejala: log wordpress memuat Access denied for user 'wordpress'@'172.x.x.x'.

Penyebab: password di .env diubah setelah database selesai diinisialisasi. Entrypoint MariaDB hanya membaca variabel MARIADB_... saat datadir masih kosong, sehingga perubahan .env tidak memperbarui user yang sudah dibuat.

Berbahaya

Perintah berikut menghapus seluruh data database MariaDB secara permanen, termasuk tabel dan konten WordPress. Tidak ada pemulihan otomatis. Cadangkan isi data/database terlebih dahulu jika masih ada data yang dibutuhkan.

docker compose down
rm -rf /root/docker-compose/data/database
mkdir -p /root/docker-compose/data/database
docker compose up -d

Container wordpress langsung berhentiโ€‹

Gejala: docker compose ps menunjukkan wordpress berstatus Exit atau Restarting.

Penyebab: konfigurasi YAML tidak valid, atau environment WORDPRESS_DB_* menunjuk host yang salah.

Perbaikan: jalankan docker compose config --quiet untuk memastikan berkas valid, lalu baca docker compose logs --tail=30 wordpress untuk pesan kesalahan yang spesifik.

Verifikasiโ€‹

Restart stack untuk memastikan data bertahan tanpa inisialisasi ulang:

cd /root/docker-compose
docker compose restart

Output:

Container docker-compose-db-1 Restarting
Container docker-compose-wordpress-1 Restarting
Container docker-compose-db-1 Started
Container docker-compose-wordpress-1 Started

Ulangi pengecekan HTTP setelah restart:

curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080

Output 302 bila instalasi melalui browser belum dijalankan, atau 200 bila sudah selesai. Kode 000 berarti WordPress belum siap menerima koneksi. Kedua kondisi pertama menunjukkan container kembali melayani permintaan dengan data yang sudah ada. Periksa lagi kedua berkas penanda persistensi:

ls -1 /root/docker-compose/data/app/wp-config.php
ls -d /root/docker-compose/data/database/mysql

Output:

/root/docker-compose/data/app/wp-config.php
/root/docker-compose/data/database/mysql

Membersihkan Instalasiโ€‹

docker compose down menghentikan dan menghapus container serta network, tetapi bind mount data/app dan data/database tetap utuh sehingga Anda dapat menjalankan docker compose up -d kembali kapan saja.

docker compose down

Output:

Container docker-compose-wordpress-1 Removed
Container docker-compose-db-1 Removed
Network docker-compose_default Removed
Berbahaya

Perintah rm -rf /root/docker-compose menghapus seluruh berkas situs dan data database secara permanen. Tidak ada mekanisme pemulihan otomatis. Jalankan hanya jika Anda sengaja membuang instalasi dan sudah menyimpan cadangan di luar direktori tersebut.

docker compose down
rm -rf /root/docker-compose