Cara Migrasi WordPress ke Docker

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
  1. 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.
    1-backup file wordpress-cara-igrasi-Wordpress-ke Docker
    Compress file WordPress


    2-compress file wordpress-cara-igrasi-Wordpress-ke Docker
    Compress file backup menjadi.zip

    Ganti nama file backup, misalnya wp-backup.zip

    3-compress file wordpress-cara-igrasi-Wordpress-ke Docker
    Ganti nama file backup

    Setelah selesai download folder zip-nya ke lokal komputer.

    4-unduh compress file-cara-igrasi-Wordpress-ke Docker
    Download file backup

    Kalau backup database ikuti caranya seperti pada Export dan Import Database Pada Hosting di bagian step export database.

  2. Pindahkan file dan database ke VPS (menggunakan FileZilla atau WinSCP)
  3. Siapkan docker dan docker-compose.yml di VPS
  4. Jalankan Docker
  5. Impor database ke container MySQL
  6. 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
				
			
5-buat direktori website-cara-migrasi-Wordpress-ke Docker

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/.

6-cara-migrasi-Wordpress-ke Docker

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

7-drag drop file-cara-migrasi-Wordpress-ke Docker

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
				
			
8-buat dhparam-cara-migrasi-Wordpress-ke Docker

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.

				
					<IfModule mod_rewrite.c>
    
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]

</IfModule>
				
			

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.

10-halaman wordpress migrasi-cara-migrasi-Wordpress-ke Docker
11-halaman wordpress admin migrasi-cara-migrasi-Wordpress-ke Docker

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.

Related Posts
Tutorial Reset User dan Password Wordpress Admin

Hai, Sob!, Pernahkah kamu mengalami lupa password WordPress atau email ? Sudah melakukan "forgot password" malah tidak mendapatkan balasan email Read more

Tutorial Mengatasi CSS yang Tidak Terbaca di WP Admin

Hai, Sob! Pernahkah kamu mengalami permasalahan dengan dashboard administrator tampil tanpa CSS? Seperti semua link tidak tertata seperti seharusnnya, contohnya Read more

Tutorial Wordpress – Mengatasi Warning: Cannot modify header information

Halo, Sob! Pernahkah kamu mengalami pesan peringatan seperti ini saat instalasi pertama WordPress maupun upgrade WordPress kamu? Warning: Cannot modify Read more

Cara Atasi Fatal Error Allowed Memory Size of Bytes Exhausted

Pengantar Pernahkah kamu mengalami pesan "Fatal error: Allowed memory size of 33554432 bytes exhausted" saat kamu mencoba upload sebuah gambar Read more