Tutorial Docker Compose untuk Home Server — Dari Satu File YAML ke Layanan yang Berjalan Rapi Ditulis oleh Adam Muiz 27 Jul 2026 Diperbarui: 06 Aug 2026 6 menit baca Beberapa tahun lalu, ketika aku baru pertama kali menjadikan laptop bekas sebagai home server, aku menghabiskan waktu berjam-jam cuma untuk memastikan satu aplikasi web bisa berjalan. Ada perintah docker run yang panjangnya hampir sepanjang jalan tol, port yang harus diingat satu per satu, dan volume yang entah tertulis di mana. Rasanya seperti merakit lemari tanpa instruksi: setiap baut ada, tapi tidak ada yang tahu urutannya. Baru setelah aku mengenal Docker Compose, semuanya berubah. Satu file docker-compose.yml bisa menangkap seluruh konfigurasi layanan, mulai dari image, port, volume, environment variable, hingga ketergantungan antar container. Dalam artikel ini, aku ingin berbagi cara aku memakai Docker Compose di home server sehari-hari, mulai dari struktur paling dasar sampai kebiasaan kecil yang membuat hidup lebih mudah. Kenapa Docker Compose, Bukan Docker Biasa? Menjalankan container dengan perintah docker run itu seperti memasak dengan resep yang cuma ada di kepala. Kalau lupa satu bumbu, hasilnya beda. Kalau mau membagikan resepnya ke komputer lain, kamu harus menulis ulang perintahnya dari awal. Docker Compose mengubah resep itu jadi dokumen baku: file docker-compose.yml. Bayangkan kamu punya layanan tiga lapis: aplikasi web, database, dan reverse proxy. Dengan Docker, kamu harus menjalankan tiga perintah docker run berbeda, membuat network manual, lalu berdoa semuanya bisa saling berbicara. Dengan Docker Compose, cukup satu file, lalu satu perintah: docker compose up -d. Semua container berada dalam satu project, satu jaringan virtual, dan satu aturan main. Selain itu, Docker Compose membuat proses update lebih rapi. Mau ganti versi image? Ubah satu baris di file, lalu jalankan docker compose up -d lagi. Container yang sudah berjalan akan diperbarui tanpa kamu perlu menghafal urutan perintah. Itu sebabnya aku menganggap Docker Compose sebagai fondasi wajib untuk siapa pun yang serius membangun home server. Struktur File docker-compose.yml yang Paling Sering Aku Pakai File Docker Compose ditulis dalam format YAML. YAML itu sensitif terhadap indentasi, jadi satu spasi yang salah bisa membuat seluruh file ditolak. Aku biasanya memakai dua spasi untuk setiap tingkat indentasi. Meskipun terlihat sepele, kebiasaan ini menyelamatkanku dari banyak kesalahan di tengah malam. Berikut adalah template paling sederhana yang aku gunakan hampir di setiap project: version: "3.8" services: app: image: nginx:alpine container_name: app_web restart: unless-stopped ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html:ro environment: - NGINX_HOST=app.lan networks: - app_net networks: app_net: driver: bridge Ada beberapa bagian penting di sini. Bagian services mendefinisikan container yang akan berjalan. Setiap service punya nama, image, dan konfigurasi lain. container_name memudahkan kita mengenali container saat melihat docker ps. restart: unless-stopped artinya container akan hidup kembali setelah reboot, kecuali kita mematikan secara manual. Bagian ports menghubungkan port host dengan port container. Formatnya adalah HOST:CONTAINER. Jadi 8080:80 berarti lalu lintas di port 8080 komputer host akan diteruskan ke port 80 di dalam container. Bagian volumes membuat data di container tetap ada meski container dihapus. Di contoh di atas, folder ./html di host dipasang ke /usr/share/nginx/html di container dengan mode read-only. Contoh Nyata: Menjalankan Uptime Kuma dengan Satu Perintah Sebagai latihan, aku ingin menunjukkan cara menjalankan Uptime Kuma, sebuah tools monitoring yang sering aku bahas sebelumnya. Tools ini ringan, berguna, dan cocok untuk memahami bagaimana Docker Compose bekerja dalam praktik. Pertama, buat folder baru dan masuk ke dalamnya: mkdir -p ~/compose/uptime-kuma cd ~/compose/uptime-kuma Lalu buat file docker-compose.yml dengan isi berikut: version: "3.8" services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma restart: unless-stopped ports: - "3001:3001" volumes: - ./data:/app/data environment: - TZ=Asia/Jakarta networks: default: name: uptime-kuma-net Setelah file tersimpan, jalankan: docker compose up -d Perintah up akan membaca file, mengunduh image jika belum ada, membuat container, dan menjalankannya. Opsi -d artinya detached, jadi terminal kita tidak terjebak di log container. Beberapa detik kemudian, Uptime Kuma bisa diakses di http://localhost:3001. Jika suatu saat ingin menghentikan layanan, cukup jalankan docker compose down. Perintah ini akan menghentikan dan menghapus container, tetapi data di folder ./data tetap aman karena tersimpan di host. Kalau ingin melihat log, docker compose logs -f akan menampilkan log semua service secara real-time. Tips Mengelola Volume, Network, dan Restart Policy Dalam pengalaman ku, tiga hal paling sering membuat pemula frustrasi: data hilang saat container dihapus, container tidak bisa saling berkomunikasi, dan layanan tidak hidup kembali setelah reboot. Untungnya, ketiga masalah itu punya solusi sederhana di Docker Compose. Volume adalah kunci agar data tidak lenyap. Ada dua cara umum: bind mount dan named volume. Bind mount memasang folder host langsung ke container, cocok untuk file konfigurasi yang sering diedit. Named volume dikelola Docker sendiri, lebih rapi untuk database. Contoh named volume: volumes: db_data: services: db: image: postgres:15-alpine volumes: - db_data:/var/lib/postgresql/data Network membuat container dalam satu project bisa saling memanggil dengan nama service. Jadi jika kamu punya service web dan service database, dari dalam container web kamu bisa mengakses database dengan hostname db. Docker Compose secara otomatis membuat network bridge untuk setiap project, jadi kita tidak perlu memikirkan IP address. Restart policy menentukan apa yang terjadi saat container berhenti. Aku paling sering memakai unless-stopped untuk layanan yang harus selalu hidup, seperti monitoring atau reverse proxy. Pilihan lain seperti always atau on-failure juga ada, tapi unless-stopped memberi kita kontrol manual saat sedang debugging. Kapan Harus Update dan Backup? Update image di Docker Compose sangat mudah, tapi bukan berarti harus dilakukan setiap hari. Aku punya kebiasaan: memeriksa update image sekali seminggu, lalu mengujinya di layanan non-kritis dulu. Caranya: docker compose pull docker compose up -d Perintah pull mengunduh versi image terbaru sesuai tag yang tertulis di file. Setelah itu, up -d akan membuat ulang container dengan image baru. Jika terjadi masalah, kita bisa dengan cepat mengembalikan tag lama di file, lalu menjalankan up -d lagi. Untuk backup, yang paling penting adalah folder volume. Aku biasanya membuat arsip dari folder project beserta volume-nya. Sebagai contoh, untuk project Uptime Kuma di atas: tar -czvf uptime-kuma-backup-$(date +%F).tar.gz ~/compose/uptime-kuma Backup ini mencakup file docker-compose.yml, konfigurasi, dan data aplikasi. Di kemudian hari, kita tinggal mengekstrak arsip tersebut dan menjalankan docker compose up -d di komputer lain. Inilah salah satu keindahan Docker Compose: layanan kita menjadi portable, seperti koper yang sudah terpacking rapi. Kesimpulan Docker Compose mengubah cara aku memandang home server. Dari yang awalnya serba manual dan rapuh, menjadi lebih terstruktur, mudah dicadangkan, dan lebih mudah dipindahkan. Satu file YAML mungkin terlihat sederhana, tapi ia adalah blueprint dari seluruh ekosistem layanan yang kita bangun. Jika kamu baru memulai, aku sarankan untuk mempraktikkan contoh Uptime Kuma di atas. Dari situ, kamu bisa bereksperimen menambahkan database, reverse proxy, atau aplikasi self-hosted lain. Yang terpenting bukan menghafal setiap perintah, tapi memahami pola: definisikan layanan, pasang volume, atur jaringan, lalu jalankan. Kalau ada bagian yang masih membingungkan, jangan ragu untuk menulis di kolom komentar. Aku juga masih belajar, dan seringkali kesalahan terbaik datang dari mencoba hal baru di tengah malam.