Halo, Sobat Jagoan! Wordpress merupakan content management system (CMS) yang sangat populer. Faktanya hingga tahun ini lebih dari 500 website baru dibuat perharinya dengan menggunakan wordpress.
Docker merupakan tool yang memudahkan kamu dalam membuat, menguji, mengembangkan, dan mendeploy aplikasi kamu secara terisolasi dalam sebuah wadah yang disebut container.
Ada banyak tutorial untuk membangun wordpress baru dengan docker. Tapi untuk cara migrasinya jarang ada. Kalau kamu saat ini sudah punya website berbasis wordpress di shared hosting atau sejenisnya, dan mau coba migrasi ke docker, berarti kamu ada di tempat yang tepat.
Nah, supaya memudahkan kamu mengikuti step by step-nya, berikut ini gambaran yang harus kamu lakukan untuk migrasi WordPress ke Docker.
Alur Migrasi WordPress ke Docker
- Backup file WordPress (file dan database). Kalau WordPress kamu terinstal di cPanel: buka File Manager > masuk ke folder public_html atau folder tempat WordPress kamu berada > klik kanan folder WordPress, lalu pilih Compress > pilih format Zip.
Compress file WordPress Compress file backup menjadi.zip Ganti nama file backup, misalnya wp-backup.zip
Ganti nama file backup Setelah selesai download folder zip-nya ke lokal komputer.
Download file backup Kalau backup database ikuti caranya seperti pada Export dan Import Database Pada Hosting di bagian step export database.
- Pindahkan file dan database ke VPS (menggunakan FileZilla atau WinSCP)
- Siapkan docker dan docker-compose.yml di VPS
- Jalankan Docker
- Impor database ke container MySQL
- Akses website dari IP atau domain VPS
Step 1: Siapkan Docker dan Docker Composer di VPS
Pertama, buat koneksi SSH ke VPS kamu melalui terminal.
ssh root@ip-vps-kamu
Jika menggunakan sistem operasi Windows, kamu bisa menggunakan PuTTY. Detail informasi awal layanan kamu bisa diakses seperti pada Informasi Awal Layanan VM.
Kalau di server kamu belum terinstal docker dan docker composer, ikuti cara instalnya berikut ini.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# Tambahkan GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Tambahkan repository Docker
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update daftar paket dan instal docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# Tambahkan user ke grup docker (supaya bisa menjalankan perintah tanpa sudo)
sudo usermod -aG docker $USER
Install Docker Compose.
sudo wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -O /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
Untuk mengecek apakah berhasil.
docker-compose --version
Output: Docker Compose version v2.5.0
Install Nginx sebagai web server (opsional, tapi disarankan).
sudo apt install nginx
Setelah instalasi selesai dan user sudah ditambahkan ke grup docker, logout dari koneksi SSH dan login kembali supaya perubahan grup diterapkan
Step 2: Setup Folder Website
Asumsi kamu sudah melakukan backup file WordPress (.zip) dan file database (.sql). Selanjutnya, kamu perlu memindahkan file WordPress dan file SQL tersebut ke dalam direktori VPS, dengan struktur folder yang rapi.
Buat struktur folder di direktori VPS.
mkdir -pv ~/public_html/namadomainmu/src
mkdir -pv ~/public_html/namadomainmu/database/data
mkdir -pv ~/public_html/namadomainmu/database/initdb.d

Copy file WordPress ke src:
cp -Rv ~/backup-wordpress/* ~/public_html/namadomainmu/src
sudo chown -R www-data:www-data ~/public_html/namadomainmu/src
Copy file SQL backup ke initdb.d:
cp ~/wp.sql ~/public_html/namadomainmu/database/initdb.d/
Opsi Transfer File dengan GUI
atau kalau kamu lebih nyaman menggunakan antarmuka grafis, kamu bisa menggunakan FileZilla. Setelah berhasil terhubung, navigasikan ke direktori VPS /root/public_html/namadomainmu/.

Lalu tinggal drag & drop file WordPress (.zip) ke folder src, dan file SQL (.sql) ke folder database/initdb.d.

Setelah upload, di terminal SSH VPS ekstrak file WordPress.
cd ~/public_html/namadomainmu/src
sudo apt install unzip
unzip namafile.zip
sudo chown -R www-data:www-data .
Step 3: Isi File docker-compose.yml
Buat file docker-compose.
cd ~/public_html/namadomainmu
nano docker-compose.yml
Salin sintaks kode berikut ke dalam docker-compose.yml.
version: '3'
services:
namasituskamu_db:
image: mariadb:10.5
container_name: namasituskamu_db
volumes:
- ./database/data:/var/lib/mysql
- ./database/initdb.d:/docker-entrypoint-initdb.d
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wp
MYSQL_USER: wp
MYSQL_PASSWORD: password
namasituskamu_site:
depends_on:
- namasituskamu_db
image: wordpress:php8.2
container_name: namasituskamu_site
ports:
- "8080:80"
restart: always
volumes:
- ./src:/var/www/html
docker-compose di atas menjalankan:
- Membuat container dengan nama ‘namasituskamu_db’ dari image mariadb/server:10.5. Terdapat 2 volume, mount dari folder yang telah dibuat untuk database. Database disimpan di folder data dan folder init.db yang berisi file .sql yang akan diimport ketika container dibuat. MYSQL_USERNAME, PASSWORD, dan DATABASE disesuaikan dengan yang ada di file wp-config.php. Sementara untuk MYSQL_ROOT_PASSWORD bisa ditentukan sendiri.
- Membuat container dengan nama namasituskamu_site dari image WordPress dengan php 7.4. Container ini berjalan di port 8080. Folder src yang berisi file WordPress dimount ke /var/www/html
Kamu sesuaikan saja dengan kebutuhan situs kamu.
Step 4: Jalankan Docker Composer
Jalankan docker composer dengan command:
docker-compose up -d
Menampilkan Docker container yang sedang berjalan.
docker ps
Output yang ditampilkan.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55a83a905ac4 wordpress:php8.2 "docker-entrypoint.s…" 29 seconds ago Up 26 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp laboweb_site
bcf090fd8e61 mariadb:10.5 "docker-entrypoint.s…" 31 seconds ago Up 28 seconds 3306/tcp laboweb_db
Step 5: Konfigurasi Nginx
Selanjutnya, melakukan konfigurasi Nginx untuk reverse proxy ke Docker Container. Buat dhparam.pem.
sudo openssl dhparam -out /etc/ssl/dhparam.pem 2048

Buat file server block.
sudo nano /etc/nginx/conf.d/domainkamu.my.id.conf
Kemudian isi file server block dengan konfigurasi di bawah ini. Konfigurasinya sama seperti Nginx server block yang berjalan di port 443 (HTTPS). Pastikan sertifikat dan private key SSL sudah tersedia di server. Kalau belum kamu bisa instal SSL dari Let’s Encrypt.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d domainkamu.my.id -d www.domainkamu.my.id
Kamu ikuti proses request SSL-nya dengan memasukkan alamat email. Untuk pertanyaan konfirmasi:
1. Pertanyaan pertama (Terms of Service)
Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must agree in order to register with the ACME server. Do you agree (Y)es/(N)o:
Ini adalah syarat dan ketentuan dari Let’s Encrypt. Kamu harus setuju dengan syarat tersebut agar bisa menggunakan layanan mereka untuk mendapatkan sertifikat SSL.
Pilihan yang benar biasanya kamu jawab Y lalu Enter.2. Pertanyaan kedua (mau berbagi email ke EFF atau tidak)
Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let’s Encrypt project … (Y)es/(N)o:
Ini hanya permintaan opsional dari Let’s Encrypt apakah kamu bersedia membagikan emailmu ke Electronic Frontier Foundation (EFF), yang merupakan mitra pengembang Certbot dan Let’s Encrypt, supaya mereka bisa mengirim info kampanye dan berita.
Kamu bisa pilih Y (Yes) atau N (No) sesuai keinginan, ini tidak berpengaruh pada pembuatan sertifikat.Kalau proses request SSL berhasil akan muncul pesan “Successfully received certificate.”
Isi file server block.
server {
listen 443 ssl;
server_name www.domainkamu.my.id domainkamu.my.id;
ssl_certificate /etc/ letsencrypt/live/domainkamu.my.id/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domainkamu.web.id/privkey.pem;
ssl_session_cache shared:nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
ssl_dhparam /etc/ssl/dhparam.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
access_log /var/log/nginx/domainkamu.my.id_access.log;
error_log /var/log/nginx/domainkamu.my.id_error.log;
}
server {
listen 80;
server_name www.domainkamu.my.id domainkamu.my.id;
return 301 https://www.domainkamu.my.id$request_uri;
}
Uji konfigurasi Nginx lalu restart.
sudo nginx -t
sudo systemctl restart nginx
Pastikan tidak ada error ya, Sob.
Step 6: Konfigruasi WordPress
Buka file wp-config.php.
sudo nano ~/public_html/namadomainmu/src/wp-config.php
Ubah DB_HOST dari localhost menjadi nama container (namasituskamu_db).
define( 'DB_HOST', 'namasituskamu_db' );
Masukkan konfigurasi HTTPS berikut di atas /* That’s all, stop editing! Happy publishing. */.
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
Buat file .htaccess kalau belum ada.
sudo nano ~/public_html/domainkamu.my.id/src/.htaccess
Isi file .htaccess.
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Step 7: Akses Website
Buka browser dan akses https://domainkamu.com untuk memeriksa apakah migrasi berhasil. Coba akses juga halaman adminnya https://domainkamu.com/wp-admin.


Lakukan pengujian untuk memastikan semuanya sudah berfungsi dengan baik.
- akses halaman depan
- akses post detail
- akses halaman dashboard
- install theme atau plugin
- posting artikel
Tambahan
Membackup Database
Backup database yang berjalan di container.
docker exec namasituskamu_db /usr/bin/mysqldump -u root --password=passwordkamu wp > ~/wp_docker.sql
Menghapus Container
Hapus container dengan docker-composer.
cd ~/public_html/namadomainmu.my.id
docker-compose down
docker ps
Meskipun, container sudah terhapus, tetapi datanya masih tetap ada.
ls -l ~/public_html/domainkamu.my.id/src
ls -l ~/public_html/domainkamu.my.id/database/data
Troubleshooting
Kalau ketika mengakses halaman dashboard atau admin WordPress kamu diarahkan ke URL lama atau tidak sesuai, coba cara ini untuk mengatasinya.
Cara 1: Override URL WordPress di wp-config.php
Tambahkan baris kode berikut di bagian bawah sendiri.
define('WP_HOME','https://domainkamu.my.id');
define('WP_SITEURL','https://domainkamu.my.id');
Gantilah https://domainkamu.my.id dengan domain kamu yang sekarang (bukan domain lama). Ini akan memaksa WordPress menggunakan URL baru meskipun di database masih tertulis URL lama.
Cara 2: Update langsung dari database (opsional)
Jika kamu ingin memperbaiki nilai di database, kamu bisa masuk ke mariadb di container:
docker exec -it namasituskamu_db mysql -u root -p
# (masukkan password: )
Catatan: password container mariadb sama dengan MYSQL_ROOT_PASSWORD ketika kamu menuliskan di docker-compose.yml
Lalu, jalankan satu per satu:
USE db_wpkamu;
UPDATE wp_options SET option_value = 'https://domainkamu.my.id' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://domainkamu.my.id' WHERE option_name = 'home'
Gantilah https://domainkamu.my.id sesuai dengan domain aktif yang kamu gunakan sekarang.
Terakhir, restart container:
docker-compose down
docker-compose up -d
Selesai, Sob! WordPress sekarang sudah berpindah dari CPanel ke Docker di VPS. Kamu tidak lagi bergantung pada shared hosting dan bisa mengelola server sepenuhnya lewat Docker.
Kalau ada yang bingung, hubungi Tim Support Jagoan Hosting via Live Chat atau Open Ticket ya. Terus simak artikel lainnya di laman Pusat Tutorial Hosting & Domain Jagoan Hosting.
Hai, Sob!, Pernahkah kamu mengalami lupa password WordPress atau email ? Sudah melakukan "forgot password" malah tidak mendapatkan balasan email Read more
Hai, Sob! Pernahkah kamu mengalami permasalahan dengan dashboard administrator tampil tanpa CSS? Seperti semua link tidak tertata seperti seharusnnya, contohnya Read more
Halo, Sob! Pernahkah kamu mengalami pesan peringatan seperti ini saat instalasi pertama WordPress maupun upgrade WordPress kamu? Warning: Cannot modify Read more
Pengantar Pernahkah kamu mengalami pesan "Fatal error: Allowed memory size of 33554432 bytes exhausted" saat kamu mencoba upload sebuah gambar Read more