Cara Instalasi WordPress dengan Docker Compose
Sebenarnya instalasi WordPress cukup sederhana, dengan menyewa layanan hosting yang sudah umum, biasanya terdapat fitur untuk instalasi WordPress secara mudah. Namun, di saat pengunjung blog kita sudah mulai merangkak naik, banyak penyedia layanan hosting akan menghentikan semua website yang sudah terlalu banyak menyedot sumber-daya server mereka. Di saat inilah, kita harus mempertimbangkan untuk menempatkan blog kita di sebuah server Cloud atau VPS.
Supaya wordpress bisa berjalan, kita membutuhkan server web dan server database, bisa LAMP (Linux Apache MySQL PHP) atau LEMP (Linux NGINX MySQL PHP). Proses instalasi kedua server tersebut akan memakan waktu yang tidak sedikit, apalagi banyak juga yang belum paham tentang server. Di sisi lain, apabila terdapat masalah pada kode PHP, maka server sangat rentan untuk diretas melalui website yang kita jalankan. Nah, Docker merupakan sistem yang akan melokalisir semua aplikasi di dalam container-nya, sehingga memperkecil peluang akan mengganggu server utama maupun aplikasi lain di container yang berbeda.
Prasyarat
- Bisa menginstall server Ubuntu 20.04
- Bisa menginstall Docker
Instalasi Docker-Compose
Tools yang bermanfaat untuk menyederhanakan proses instalasi adalah docker-compose. Install dengan curl:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
Buat folder untuk file docker-compose.yml berikut file nya dengan perintah berikut:
mkdir blog && cd blog
cat > docker-compose.yml << EOF
version: "3"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: sandiroot
MYSQL_DATABASE: namadatabase
MYSQL_USER: penggunawordpress
MYSQL_PASSWORD: sandiwordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
- apache_etc:/etc/apache2
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: penggunawordpress
WORDPRESS_DB_PASSWORD: sandiwordpress
WORDPRESS_DB_NAME: namadatabase
volumes:
db_data: {}
wordpress_data: {}
apache_etc: {}
EOF
Saya tidak meng-ekspos satu port pun pada file docker-compose.yml di atas, karena nantinya jika kita akan menghubungkannya dengan NGINX sebagai reserve proxy web servernya tinggal diakses alamat ip container-nya.
Untuk membuat container berdasarkan file docker-compose. Ketikkan perintah berikut di folder yang sama:
docker-compose up -d
- up: membuat jika belum ada container dengan nama yang sama, dan menjalankan container yang berhasil dibuat.
- -d: mode detach, yaitu menjalankan container di latar belakang.
Periksa file docker-compose.yml jika terjadi masalah, kemungkinan terdapat container yang sudah ada dengan nama sama. Jika tidak ada pesan kesalahan, periksa apakah container yang baru saja dibuat sudah aktif:
docker ps
- ps: daftar container
Karena kita tidak menentukan nama container, biasanya akan dibuatkan oleh Docker dengan format: [folder]_[nama-services]_[integer]. Jadi kemungkinan nya adalah nama container wordpress kita adalah blog_wordpress_1. Jika tidak terlihat, coba tambahkan flag -a di belakang opsi ps. Jika tidak aktif saat baru dibuat, cek juga log nya dengan:
docker logs blog_wordpress_1
docker logs blog_db_1
Apabila semua proses tidak ada kendala apapun, kita bisa melanjutkannya dengan konfigurasi reserve proxy NGINX yang akan menghubungkan blog wordpress kita dengan internet sehingga bisa diakses dari luar server. Periksa alamat ip yang dihasilkan dari pembuatan container di atas:
docker inspect blog_wordpress_1
- inspect: menampilkan informasi dari objek Docker
Perhatikan output json yang muncul, pada baris IPAddress. Contoh:
"Gateway": "172.31.0.1",
"IPAddress": "172.31.0.3",
"IPPrefixLen": 16,
Perhatikan alamat IP container wordpress kita adalah: 172.31.0.3. Maka konfigurasi NGINX nya adalah:
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_pass http://172.31.0.3;
}
Pada baris proxy_pass kita gunakan http://172.31.0.3 tanpa port, karena secara default http akan mengakses port 80. Anda bisa menggantinya dengan https jika web server apache sudah dikonfigurasi untuk mendukung SSL.
Karena kita menggunakan NGINX sebagai reserve proxy, konfigurasi web server apache yang berada di dalam container untuk mengenali bahwa ip nginx dianggap sebagai ip proxy bukan ip pengunjung, sehingga apache2 akan bisa mengenali alamat ip pengunjung sebagai REMOTE_ADDR bukan X_FORWARDED_FOR. Periksa lokasi volume dengan perintah docker inspect seperti di atas, perhatikan baris yang ada kata Mounts:
"Mounts": [
{
"Type": "volume",
"Name": "blog_wordpress_data",
"Source": "/var/lib/docker/volumes/blog_wordpress_data/_data",
"Destination": "/var/www/html",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "blog_apache_etc",
"Source": "/var/lib/docker/volumes/blog_apache_etc/_data",
"Destination": "/etc/apache2",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],
Sesuai dengan lokasi folder blog_apache_etc, edit file remoteip.conf:
sudo nano /var/lib/docker/volumes/blog_apache_etc/_data/conf-available/remoteip.conf
Biasanya file remoteip.conf sudah berisi:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
RemoteIPTrustedProxy 169.254.0.0/16
Apabila alamat ip apache server yang berada di container 172.31.0.3, maka tidak perlu melakukan perubahan terhadap file tersebut, karena 172.16.0.0/12 akan menjangkau sampai ip 172.31.254.254.
Pastikan modul remoteip sudah aktif, masuklah ke container dengan perintah:
docker exec -it blog_wordpress_1 /bin/bash
- exec: menjalankan perintah pada container yang sedang aktif
- -it: interaktif terminal
- blog_wordpress_1: container yang akan diakses
- /bin/bash: jenis shell terminal.
Aktifkan modul remoteip dengan perintah:
a2enmod remoteip
Jika sudah aktif, akan muncul pesan: Module remoteip already enabled. Namun jika belum, pesan nya akan seperti ini:
Enabling module remoteip.
To activate the new configuration, you need to run:
service apache2 restart
Keluar dari container:
exit
Restart container:
docker restart blog_wordpress_1
Cek lagi dengan:
docker ps
Jika sudah terlihat aktif, maka seluruh proses bisa dianggap selesai, dan kita bisa mengakses nya dari nama domain yang kita konfigurasi di NGINX. Dengan terlokalisir-nya blog wordpress di sebuah container berarti kita sudah menurunkan resiko peretasan sistem apabila terdapat bugs pada aplikasi wordpress nya.
Photo by Michael Faes from FreeImages