Cara Menjalankan Server Web di Windows 11 dengan WSL Containers

Selama ini kalau mau coba server web atau WordPress di Windows, jalan pintas yang paling umum ya XAMPP. Install, klik start, beres. Tapi ada cara lain yang menurut saya layak dicoba: WSL Containers (WSLC). Fitur ini bikin kita bisa menjalankan container Linux langsung di Windows 11.

Idenya simpel. Aplikasi, runtime, dan dependensinya semua jalan di dalam container yang terisolasi. Butuh ya dinyalain, selesai ya dimatiin, dan Windows kamu tetap bersih. Nggak perlu pasang Python, PHP, atau database langsung ke sistem.

Buat yang lagi belajar web development, ini juga bisa jadi alternatif XAMPP sekalian kenalan sama lingkungan server Linux.

Kenalan Dulu sama WSL Containers

WSL Containers itu bagian dari Windows Subsystem for Linux (WSL). Perintah utamanya wslc.exe, dipakai buat bikin, jalankan, dan ngatur container Linux di Windows.

Bedanya sama XAMPP: XAMPP ngasih paket Apache, PHP, dan MariaDB yang di-install ke Windows. Di WSLC, komponen-komponen itu kita jalankan lewat image container. Jadi Python dan Flask bisa nongkrong di dalam container, sementara kodenya tetap disimpan di folder Windows dan diedit pakai Visual Studio Code.

Sebelum ikut tutorial ini, cek dulu perintahnya udah tersedia atau belum. Buka PowerShell atau Windows Terminal, lalu jalankan:

wslc version

Kalau perintahnya belum dikenali, cek versi WSL:

wsl --version

Terus coba update WSL-nya:

wsl --update

Habis itu cek lagi apakah wslc udah bisa dipakai.

Nginx

Buat pemanasan, coba jalankan Nginx. Cocok buat ngetes halaman web sederhana, tanpa install Nginx ke Windows. Pertama siapkan dulu project file sederhana, misal di C:\Projects\php-app. Isi folder php-app dengan file berikut:

  • index.php
  • nginx.conf
  • Containerfile

Isi file index.php dengan kode berikut:

<?php

$host = 'localdb';
$db   = 'appdb';
$user = 'appuser';
$pass = 'GantiPasswordAnda';

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$db;charset=utf8mb4",
        $user,
        $pass
    );

    echo "<h1>Project PHP Berjalan!</h1>";
    echo "<p>Koneksi database berhasil.</p>";

} catch (PDOException $e) {
    http_response_code(500);
    echo "Koneksi database gagal.";
}

Salin kode berikut dan paste ke Containerfile:

FROM php:8.3-fpm
RUN docker-php-ext-install pdo_mysql
WORKDIR /var/www/html
CMD ["php-fpm"]

Untuk nginx.conf anda bisa mengisinya dengan kode berikut:

server {
    listen 80;
    server_name localhost;

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

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

    location ~ \.php$ {
        try_files $uri =404;

        include fastcgi_params;
        fastcgi_pass php:9000;

        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
    }
}

Jalankan ketiga container melalui Powershell.

Buka Powershell kemudian masuke ke folder project:

cd C:\Projects\php-app

Buat network terlebih dahulu agar Nginx, PHP-FPM, dan MariaDB bisa saling berkomunikasi menggunakan nama container.

wslc network create app-network

Jalankan MariaDb:

wslc run -d `
  --name localdb `
  --network app-network `
  -e MARIADB_DATABASE=appdb `
  -e MARIADB_USER=appuser `
  -e MARIADB_PASSWORD=GantiPasswordAnda `
  -e MARIADB_ROOT_PASSWORD=GantiPasswordRoot `
  mariadb:latest

Bangun image php:

wslc build -t php-app .

Lanjut jalankan PHP-FPM:

wslc run -d `
  --name php `
  --network app-network `
  -v "C:\Projects\php-app:/var/www/html" `
  php-app

Jalankan Nginx:

wslc run -d `
  --name nginx `
  --network app-network `
  -p 0.0.0.0:8080:80 `
  -v "C:\Projects\php-app:/var/www/html:ro" `
  -v "C:\Projects\php-app\nginx.conf:/etc/nginx/conf.d/default.conf:ro" `
  nginx:latest

Jika muncul konfirmasi COM Surrogate, pilih Allow.

Sekarang, uji dengan mengakses http://localhost:8080

Kalau halaman belum berhasil karena masih dalam proses inisialisasi database, tunggu beberapa saat lalu muat ulang.

Ada beberapa perintah yang bakal sering kepakai buat ngatur container ini. Lihat daftar container, termasuk yang udah berhenti:

wslc container list --all

Untuk menghentikan container yang masih berjalan, ketik perintah berikut:

wslc container stop <nama-container>

Jalankan lagi:

wslc container start <nama-container>

Mau lihat konfigurasi Nginx di dalam container:

wslc exec web-server cat /etc/nginx/nginx.conf

Enaknya, Nginx cuma jalan pas kita butuh. Nggak ada yang diam-diam makan resource di background Windows.

Aplikasi Python

Sekarang yang agak lebih seru: bikin aplikasi web Flask, tapi Python-nya nggak ada di Windows sama sekali.

Bikin folder proyek, misalnya C:\Projects\python-app. Di dalamnya ada tiga file:

  • app.py
  • requirements.txt
  • Containerfile

Isi app.py begini:

from flask import Flask
from datetime import datetime

app = Flask(__name__)

@app.route("/")
def home():
    return f"""
    <h1>Aplikasi Python Berjalan</h1>
    <p>Waktu server: {datetime.now()}</p>
    """

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Cuma halaman sederhana yang menampilkan waktu server. Yang penting dicatat: host="0.0.0.0". Ini yang bikin aplikasi bisa nerima koneksi lewat antarmuka jaringan container. Kalau lupa, aplikasinya jalan tapi nggak bisa diakses dari luar.

Isi requirements.txt:

flask

Ini cuma ngasih tau pip bahwa aplikasi butuh Flask.

Lalu Containerfile:

FROM python:3.13-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["python", "app.py"]

Isinya: pakai image Python yang udah ada, pasang Flask, salin kode aplikasi, lalu jalankan app.py waktu container mulai.

Sekarang masuk ke folder proyek lewat PowerShell:

cd C:\Projects\python-app

Build image-nya:

wslc build -t python-app .

Lalu jalankan container:

wslc run -d `
  --name python-app `
  -p 0.0.0.0:8000:8000 `
  python-app

Buka: http://localhost:8000.

Halaman yang tadi dibuat harusnya muncul. Python dan Flask tetap di dalam container, Windows kamu nggak kena apa-apa.

Edit Kode Tanpa Build Ulang Terus-Terusan

Nah, ada satu hal yang bakal bikin capek kalau dibiarin: tiap kode berubah, harus build ulang image. Nggak praktis kalau lagi ngoding.

Solusinya pakai volume mount. Kode tetap di Windows, foldernya dihubungkan ke container. Bikin Containerfile yang isinya runtime-nya aja, tanpa menyalin kode:

FROM python:3.13-slim

WORKDIR /app

RUN pip install --no-cache-dir flask

CMD ["python", "app.py"]

Build:

wslc build -t python-runtime .

Jalankan container dengan menyambungkan folder proyek Windows ke /app di dalam container:

wslc run -d `
  --name python-dev `
  -p 0.0.0.0:8001:8000 `
  -v "C:\Projects\python-app:/app" `
  python-runtime

Coba akses melalui http://localhost:8001.

Sekarang C:\Projects\python-app kebaca sebagai /app dari dalam container. Edit app.py pakai Visual Studio Code atau editor apa aja di Windows, dan perubahannya langsung kelihatan di container. Image nggak perlu di-build ulang.

Tapi hati-hati, ini bukan auto-reload. Kalau mau perubahan kode langsung dijalankan aplikasi, server pengembangannya perlu dikonfigurasi buat reload otomatis, atau ya containernya dijalankan ulang.

WordPress

WordPress nggak bisa jalan sendirian. Selain aplikasinya (PHP), dia butuh database buat nyimpen konten, user, pengaturan, dan lain-lain. Jadi kita jalankan dua container, WordPress dan MariaDB, lalu hubungkan keduanya lewat jaringan virtual.

Pertama, bikin jaringannya:

wslc network create wp-network

Jaringan ini bikin container WordPress bisa ngomong ke container database cukup lewat namanya.

Kedua, jalankan MariaDB:

wslc run -d `
  --name wp-database `
  --network wp-network `
  -e MARIADB_DATABASE=wp_db `
  -e MARIADB_USER=wp-user `
  -e MARIADB_PASSWORD=GantiPasswordAnda `
  -e MARIADB_ROOT_PASSWORD=GantiPasswordRoot `
  mariadb:latest

Perintah ini jalankan MariaDB sekaligus bikin database dan akun yang dibutuhkan WordPress. Ganti GantiPasswordAnda dan GantiPasswordRoot dengan password yang kuat, dan pakai nilai yang sama di langkah berikutnya.

Ketiga, jalankan WordPress:

wslc run -d `
  --name wordpress `
  --network wp-network `
  -p 0.0.0.0:8081:80 `
  -e WORDPRESS_DB_HOST=wp-database:3306 `
  -e WORDPRESS_DB_USER=wp-user `
  -e WORDPRESS_DB_PASSWORD=GantiPasswordAnda `
  -e WORDPRESS_DB_NAME=wp_db `
  wordpress:latest

Image WordPress ini udah bawa semua komponen aplikasinya, dan dikonfigurasi supaya konek ke MariaDB lewat app-network. Port 8081 di Windows diteruskan ke port 80 di container WordPress.

Terakhir, buka: http://localhost:8081

Sekarang, halaman browser menampilkan halaman konfigurasi WordPress. Tandanya wordpress sudah berhasil diinstall di container.

Satu catatan penting: perintah di atas belum ngatur volume persisten. Buat dipakai jangka panjang, data database dan file WordPress sebaiknya disimpan di volume, supaya aman kalau container dibuat ulang atau dihapus. Kalau nggak, datanya bisa ikut hilang.

Akses dari HP atau Perangkat Lain

Aplikasi di container nggak harus dibuka dari browser Windows yang sama. Kalau jaringan dan firewall-nya mengizinkan, bisa juga dibuka dari HP atau komputer lain di jaringan lokal.

Cek dulu IP Windows kamu:

ipconfig

Misalnya IP-nya 192.168.1.10. Kalau port aplikasi bisa dijangkau dari jaringan lokal, perangkat lain tinggal buka:

http://192.168.1.10:<nomor port>

Misal untuk projek wordpress diatas ganti nomor port dengan 8081.

Apakah Bisa Gantikan XAMPP?

Buat latihan web development, bisa. Tapi pendekatannya beda banget.

XAMPP itu gampang dipakai karena semuanya udah satu paket: Apache, PHP, MariaDB. WSL Containers menjalankan aplikasi dan dependensinya di container Linux yang terpisah dari Windows. Cocok kalau kamu pengen nyoba versi runtime yang beda-beda, jalankan WordPress, atau bikin lingkungan yang lebih mirip server Linux sungguhan.

Tapi ada harganya. Kamu perlu paham perintah terminal, port, jaringan, image, dan volume. Ngatur beberapa container juga lebih manual, soalnya wslc belum punya perintah Compose bawaan seperti Docker Compose.

Intinya Sih Begini

Dengan WSL Containers, kamu bisa jalankan Nginx, aplikasi Python, dan WordPress tanpa nyampah dependensi di Windows. Semua jalan di container Linux, diakses lewat browser pakai port yang udah dipetakan.

Buat yang lagi belajar web development, ini cara yang lumayan bagus buat kenal lingkungan server Linux sambil latihan ngurus aplikasi dan dependensinya.

Tapi ya, ini bukan pengganti universal. Buat semua kebutuhan XAMPP atau server produksi, pilihan terbaiknya tetap tergantung apa yang mau dijalanin, seberapa nyaman kamu pakainya, dan kebutuhan penyimpanan serta jaringannya.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *