Docker Compose untuk Self-Hosting dari Nol
Kenapa Docker Compose, Bukan docker run Panjang
Waktu pertama kali saya self-hosting, tiap layanan dijalankan dengan satu perintah docker run yang panjang: port, volume, environment, restart policy, semua dijejalkan dalam satu baris. Begitu server restart atau saya lupa perintahnya, layanan itu hilang dan saya lupa cara mengembalikannya.
Docker Compose menyelesaikan masalah itu. Seluruh konfigurasi layanan ditulis di satu file YAML, docker-compose.yml. Mau menyalakan ulang, memindahkan ke server lain, atau menambah layanan baru, semuanya tinggal edit file itu lalu jalankan satu perintah. File ini juga jadi dokumentasi: enam bulan kemudian, Anda masih bisa melihat persis bagaimana layanan itu dulu dipasang.
Satu catatan penting: perintah docker-compose (dengan tanda hubung, versi 1) sudah digantikan docker compose (tanpa tanda hubung, versi 2) yang terpasang sebagai plugin resmi Docker. Tutorial lama yang masih memakai docker-compose bisa diikuti, tapi sebaiknya pakai bentuk baru.
Langkah 1: Pasang Docker di Ubuntu 24.04
Masuk ke VPS lewat SSH, lalu perbarui daftar paket dan pasang dependensi dasar:
sudo apt update sudo apt install -y ca-certificates curl
Tambahkan GPG key dan repositori resmi Docker:
sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update
Lalu pasang Docker Engine beserta plugin Compose:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verifikasi instalasinya:
docker --version docker compose version
Keduanya harus menampilkan nomor versi tanpa error. Kalau Anda tidak mau mengetik sudo setiap kali memakai Docker, tambahkan user Anda ke grup docker lalu login ulang:
sudo usermod -aG docker $USER
Perlu diingat, anggota grup docker praktis setara dengan root di mesin itu. Di VPS pribadi hal ini wajar, tapi jangan lakukan di server bersama yang usernya tidak Anda percaya penuh.
Langkah 2: Tiga Konsep yang Wajib Dipahami
Sebelum menulis file compose, pahami tiga konsep ini karena hampir semua layanan self-hosting memakainya:
Service adalah satu aplikasi dalam satu container. Satu file compose bisa berisi banyak service, dan tiap service berjalan terisolasi dari yang lain.
Volume adalah tempat data disimpan agar tidak hilang saat container dihapus atau diperbarui. Tanpa volume, database Anda lenyap begitu container dihapus. Praktik yang saya pakai: satu folder per layanan di /opt, misalnya /opt/uptime-kuma/data, lalu folder itu di-mount ke dalam container.
Network adalah jaringan privat antar container. Service dalam satu file compose otomatis berada dalam satu network yang sama, sehingga mereka bisa saling memanggil dengan nama service. Misalnya aplikasi web memanggil database cukup dengan hostname db, tanpa perlu tahu alamat IP-nya.
Langkah 3: Contoh Nyata — Uptime Kuma dan Portainer
Buat folder proyek dan file compose di dalamnya:
sudo mkdir -p /opt/monitoring && sudo chown $USER:$USER /opt/monitoring cd /opt/monitoring nano docker-compose.yml
Isi file dengan contoh berikut. Dua layanan ini sengaja saya pilih karena berguna sejak hari pertama: Uptime Kuma memantau apakah layanan Anda hidup atau mati, dan Portainer memberi dashboard web untuk mengelola container tanpa menghafal perintah:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./uptime-kuma-data:/app/data
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer-data:/data
Beberapa hal yang perlu diperhatikan dari file di atas:
- restart: unless-stopped membuat container otomatis hidup lagi setelah server restart, kecuali Anda mematikannya sendiri. Ini satu baris yang menyelamatkan Anda dari banyak insiden "kok layanan mati" setelah reboot.
- Port ditulis dengan format host:container. Uptime Kuma mendengarkan port 3001 di dalam container, dan kita ekspos ke port 3001 di host. Kalau port 3001 di host sudah dipakai layanan lain, ubah angka kirinya saja, misalnya "3002:3001".
- Volume ./uptime-kuma-data:/app/data berarti folder uptime-kuma-data di sebelah file compose di-mount ke /app/data di dalam container. Semua data monitoring tersimpan di folder itu, bukan di dalam container.
- Portainer butuh akses ke /var/run/docker.sock agar bisa mengelola Docker di host. Ini wajar untuk Portainer, tapi jangan sembarangan memberikan akses socket Docker ke container lain yang tidak Anda percaya.
Jalankan kedua layanan:
docker compose up -d
Flag -d artinya detached: container berjalan di latar belakang dan terminal Anda kembali bebas. Perintah ini sekaligus mengunduh image, membuat volume, dan menyalakan container. Setelah selesai, cek statusnya:
docker compose ps
Kalau keduanya berstatus running, buka http://IP-VPS-Anda:3001 untuk Uptime Kuma dan http://IP-VPS-Anda:9000 untuk Portainer. Selesaikan setup awal di masing-masing halaman web tersebut.
Langkah 4: Perintah Sehari-hari yang Benar-Benar Dipakai
Di luar up dan ps, ini perintah yang akan Anda pakai berulang kali:
docker compose logs -f uptime-kuma # melihat log satu service, ikuti terus docker compose logs --tail 50 # 50 baris terakhir semua service docker compose restart uptime-kuma # restart satu service saja docker compose stop # hentikan semua service docker compose start # nyalakan lagi docker compose down # hentikan DAN hapus container + network
docker compose down -v menghapus named volume, tetapi TIDAK menghapus bind mount. Pada contoh artikel ini (bind mount ./uptime-kuma-data dan ./portainer-data), data tetap aman dari down -v; yang benar-benar terhapus oleh down -v hanyalah named volume. Hati-hati tetap berlaku: Jangan pernah menjalankan down -v di layanan produksi kecuali Anda memang bermaksud menghapus datanya dan sudah punya backup.
Untuk memperbarui layanan ke image terbaru:
docker compose pull docker compose up -d
Perintah pull mengunduh image baru, lalu up -d membuat ulang container dari image itu. Karena datanya ada di volume, layanan akan kembali dengan data yang utuh. Inilah alasan volume harus benar sejak awal: container itu sekali pakai, data itu yang abadi.
Langkah 5: Kebiasaan yang Menyelamatkan Data
Ada tiga kebiasaan yang saya pegang setelah beberapa kali kehilangan data:
Pertama, satu layanan satu folder di /opt, dan tiap folder berisi file docker-compose.yml-nya sendiri. Jangan mencampur semua layanan dalam satu file raksasa — saat satu layanan bermasalah, Anda tidak perlu menyentuh yang lain.
Kedua, backup folder /opt secara berkala, bukan containernya. Yang berharga adalah file compose dan folder volume, bukan container yang bisa dibuat ulang kapan saja.
Ketiga, jangan mengekspos port dashboard seperti Portainer langsung ke internet tanpa pengaman. Di tahap awal boleh diakses lewat port, tapi langkah berikutnya pasang reverse proxy dengan HTTPS dan autentikasi — atau batasi aksesnya lewat VPN atau firewall. Port yang terbuka tanpa autentikasi adalah undangan terbuka bagi pemindai otomatis.
Penutup: Checklist
- Docker Engine dan plugin Compose terpasang, docker compose version menampilkan versi
- Satu folder per layanan di /opt, masing-masing dengan docker-compose.yml
- Semua data penting tersimpan di volume, bukan di dalam container
- restart: unless-stopped aktif untuk layanan yang harus selalu hidup
- docker compose ps menunjukkan semua service berstatus running
- Backup folder /opt sudah dijadwalkan sebelum layanan dipakai serius
Dari sini, pola yang sama berlaku untuk layanan berikutnya: cari image resminya, tulis service baru di file compose, mount volume untuk datanya, lalu docker compose up -d. Self-hosting jadi soal mengelola file teks, bukan menghafal perintah.
Baca juga: Docker Volume dan Backup dan Uptime Kuma.
Komentar
Posting Komentar