Install WordPress di Docker (Wordress + Nginx + PHP-FPM + MySQL)

Dulu, memasang WordPress berarti harus install Apache, PHP, dan MySQL satu per satu. Sekarang, Docker membuat semua itu lebih sederhana. Docker adalah container yang membawa aplikasi beserta semua yang dibutuhkannya, sehingga bisa berjalan di komputer mana pun tanpa masalah versi atau konfigurasi.

WordPress di Docker biasanya menggunakan Apache, tapi di setup ini kita menggunakan Nginx karena lebih ringan, lebih cepat, dan fleksibel untuk konfigurasi modern seperti reverse proxy, HTTPS, dan caching. Dengan Docker Compose, WordPress, MySQL, dan Nginx bisa dijalankan bersamaan dengan rapi, stabil, dan mudah dipindahkan ke komputer lain.

Docker sendiri punya banyak kelebihan, mulai dari instalasi yang otomatis, lingkungan pengembangan yang sama persis dengan produksi, hingga kemampuan mereplikasi aplikasi tanpa risiko konflik konfigurasi. Nanti akan ada artikel khusus yang membahas lebih detail keunggulan Docker dibanding setup tradisional, sehingga konsep ini bisa dipahami lebih lengkap.

Artikel ini akan fokus pada bagaimana menjalankan WordPress di Docker dengan Nginx, supaya website bisa berjalan stabil, efisien, dan mudah dikelola.

Menyiapkan Struktur Docker Compose

Untuk menjalankan WordPress di Docker dengan Nginx, kita perlu tiga komponen utama: WordPress (PHP-FPM), MySQL, dan Nginx sebagai web server. Semua dijalankan bersamaan menggunakan Docker Compose, sehingga lebih rapi dan mudah dikelola. Berikut ini struktur folder yang direkomendasikan

devsetneg/

├─ docker-compose.yml
├─ nginx/
│   ├─ conf.d/
│   │   └─ default.conf
│   └─ snippets/
│       └─ fastcgi-php.conf

Docker Compose

File docker-compose.yml akan mengatur semua service sekaligus. Buat docker-compose.yml dengan konfigurasi minimal sebagai berikut

services:
  db:
    image: mysql:8.0
    container_name: wp-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wp-network

  wordpress:
    image: wordpress:php8.2-fpm
    container_name: wp-app
    depends_on:
      - db
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - wp-network

  nginx:
    image: nginx:latest
    container_name: wp-nginx
    depends_on:
      - wordpress
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/snippets:/etc/nginx/snippets
      - wp_data:/var/www/html
    networks:
      - wp-network

volumes:
  db_data:
  wp_data:

networks:
  wp-network:
    driver: bridge

Snnipet NGINX

Buat snippet pada nginx/snippets/fastcgi-php.conf dengan konfigurasi sebagai berikut

fastcgi_param QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD     $request_method;
fastcgi_param CONTENT_TYPE       $content_type;
fastcgi_param CONTENT_LENGTH     $content_length;

fastcgi_param SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param REQUEST_URI        $request_uri;
fastcgi_param DOCUMENT_URI       $document_uri;
fastcgi_param DOCUMENT_ROOT      $document_root;
fastcgi_param SERVER_PROTOCOL    $server_protocol;

fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param REMOTE_ADDR        $remote_addr;
fastcgi_param REMOTE_PORT        $remote_port;
fastcgi_param SERVER_ADDR        $server_addr;
fastcgi_param SERVER_PORT        $server_port;
fastcgi_param SERVER_NAME        $server_name;

fastcgi_param HTTPS              $https if_not_empty;

fastcgi_param REDIRECT_STATUS    200;

NGINX Config

Buat file pada nginx/conf.d/default.conf dengan konfigurasi sebagai berikut

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include /etc/nginx/snippets/fastcgi-php.conf;
        fastcgi_pass wp-app:9000;
    }
}

Menjalankan Docker

Jika sudah, jalankan docker dengan pernitah berikut

docker-compose up -d

atau jika menggunakan Mac (dibeberapa versi docker-compose digantikan dengan docker compose), gunakan perintah berikut

docker compose up -d

Tunggu docker berjalan, pada proses ini, docker akan mengunduh file image yang dibutuhkan, untuk memastikan docker sudah berjalan, dapat gunakan perintah :

docker ps

Jika docker berjalan, maka akan ada docker bernama db, wordpress, dan nginx, anda dapat mengakses URL localhost pada browser, dan lakukan setup wordpress seperti biasa.

PS :

Untuk mematikan service docker dapat gunakan perintah

docker compose down