Site icon JocoDEV

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

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

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

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

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

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

Exit mobile version