Lewati ke isi

Server & Infrastruktur

Menjalankan Docker Tanpa Root dengan Mode Rootless

Mode rootless menjalankan Docker sebagai user biasa, jadi celah di container tidak langsung berarti root. Cara pasang, batasan, dan kapan layak dipakai.

Terbit 5 menit baca

Jawaban singkat

Docker rootless menjalankan daemon dan container di bawah user biasa, bukan root. Pasang lewat dockerd-rootless-setuptool.sh setelah uidmap dan subuid siap. Cocok untuk server bersama dan beban yang tidak butuh port di bawah 1024, overlay network, atau batas resource di cgroup v1.

Daftar isi
  1. Bagaimana mode rootless bekerja?
  2. Ruang nama user
  3. Daemon milik user
  4. Kenapa grup docker bukan pengganti
  5. Perbandingan Docker biasa dan rootless
  6. Langkah memasang Docker rootless
  7. Kapan memilih rootless, kapan tetap rootful
  8. Bagaimana mengatasi port 80 dan 443?
  9. Pertanyaan yang sering diajukan

Mode rootless adalah cara menjalankan daemon Docker dan semua container-nya sebagai user Linux biasa. Pada instalasi standar, daemon dockerd berjalan sebagai root, sehingga siapa pun yang bisa memerintah Docker praktis bisa menjadi root di server. Mode rootless memutus hubungan itu.

Taruhannya nyata. Kalau ada celah di aplikasi dalam container lalu penyerang berhasil keluar dari container, di mode biasa ia berpotensi mendarat sebagai root di host. Di mode rootless, ia hanya mendapat hak user yang menjalankan Docker. Di sisi lain, mode ini punya batasan, dan memilihnya tanpa tahu batasan itu bisa membuat aplikasi gagal jalan di tengah migrasi.

Bagaimana mode rootless bekerja?

Ruang nama user

Rootless memanfaatkan user namespace di kernel Linux. Di dalam container, proses tetap melihat dirinya sebagai root dengan UID 0. Di luar, UID itu dipetakan ke rentang UID cadangan milik user biasa, yang diatur di /etc/subuid dan /etc/subgid. Dokumentasi Docker meminta setidaknya 65.536 UID dan GID cadangan untuk user tersebut.

Daemon milik user

Daemon berjalan sebagai layanan systemd milik user, bukan layanan sistem. Socket-nya berada di /run/user/<UID>/docker.sock, bukan /var/run/docker.sock. Karena itu perintah pengelolaannya memakai systemctl --user.

Kenapa grup docker bukan pengganti

Banyak orang menambahkan user ke grup docker supaya tidak perlu sudo. Dokumentasi keamanan Docker sendiri menjelaskan bahwa akses ke daemon setara dengan hak root di host. Jadi grup docker hanya memindahkan pintu masuknya, bukan mengurangi haknya. Rootless benar-benar menurunkan hak daemon.

Perbandingan Docker biasa dan rootless

AspekDocker biasa (rootful)Docker rootless
Daemon berjalan sebagairootuser biasa
Dampak bila container dibobolBerpotensi root di hostTerbatas pada hak user tersebut
Port di bawah 1024Langsung bisaPerlu setelan tambahan
Batas CPU dan RAMBerfungsi di cgroup v1 dan v2Hanya berfungsi di cgroup v2 dengan systemd
Overlay network (Swarm)DidukungTidak didukung
Lokasi socket/var/run/docker.sock/run/user/<UID>/docker.sock
Pengelolaan layanansystemctlsystemctl --user

Distro server yang masih didukung saat ini, seperti Ubuntu 24.04, Debian 12, dan AlmaLinux 9, sudah memakai cgroup v2 secara bawaan, sehingga batas --memory dan --cpus umumnya tetap berfungsi. Cek dengan stat -fc %T /sys/fs/cgroup. Hasil cgroup2fs berarti cgroup v2.

Langkah memasang Docker rootless

Contoh ini untuk Ubuntu atau Debian dengan Docker dari repositori resmi.

  1. Pasang paket pendukung: sudo apt-get install -y uidmap docker-ce-rootless-extras. Paket uidmap menyediakan newuidmap dan newgidmap.
  2. Buat user khusus, misalnya sudo adduser dockerapp. User baru biasanya otomatis mendapat entri di /etc/subuid dan /etc/subgid. Periksa dengan grep dockerapp /etc/subuid.
  3. Bila daemon Docker sistem tidak dipakai lagi, matikan: sudo systemctl disable --now docker.service docker.socket.
  4. Login langsung sebagai user tersebut lewat SSH (bukan su, supaya sesi systemd user terbentuk), lalu jalankan dockerd-rootless-setuptool.sh install.
  5. Tambahkan variabel yang dicetak skrip ke ~/.bashrc, termasuk export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock.
  6. Agar daemon tetap jalan setelah reboot tanpa user login: sudo loginctl enable-linger dockerapp.
  7. Uji dengan docker info. Bagian security options harus menampilkan rootless.

Kapan memilih rootless, kapan tetap rootful

Rootless masuk akal bila server dipakai beberapa orang atau beberapa tim, dan kamu tidak ingin setiap orang yang bisa menjalankan container otomatis setara root. Ini juga pilihan baik untuk menjalankan aplikasi pihak ketiga yang kamu kurang percaya, atau lingkungan pengembangan di server bersama. Aplikasi web biasa yang hanya butuh port tinggi di belakang reverse proxy umumnya berjalan tanpa masalah.

Rootful masih lebih praktis bila kamu memakai Docker Swarm dengan overlay network, butuh container yang langsung mendengarkan port 80 dan 443 tanpa setelan tambahan, atau menjalankan container yang memang memerlukan akses perangkat keras host. Server dengan satu admin dan aplikasi yang sudah kamu kenal juga bisa tetap rootful, asalkan pengamanan dasarnya rapi. Beberapa jebakan umum, seperti port container yang menembus firewall, dibahas di cara mengamankan Docker di VPS agar port tidak bocor.

Alternatif lain adalah Podman, yang sejak awal dirancang bisa berjalan tanpa root dan tanpa daemon. Perbandingannya ada di bedanya Docker dan Podman.

Bagaimana mengatasi port 80 dan 443?

Di mode rootless, perintah seperti docker run -p 80:80 akan gagal dengan pesan bahwa port istimewa tidak bisa dibuka. Dokumentasi Docker memberi tiga jalan:

  • Pakai port 1024 ke atas, misalnya -p 8080:80, lalu letakkan reverse proxy di host yang meneruskan dari port 80 dan 443.
  • Turunkan batas port istimewa dengan net.ipv4.ip_unprivileged_port_start=0 di /etc/sysctl.d/, lalu sudo sysctl --system. Ingat, ini berlaku untuk semua user di server.
  • Beri kemampuan CAP_NET_BIND_SERVICE pada binary rootlesskit.

Pilihan pertama paling sederhana dan tidak mengubah perilaku sistem secara luas.

Satu catatan lagi: data image dan volume di mode rootless tersimpan di folder home user, bukan di /var/lib/docker. Pastikan partisi home cukup besar dan masuk dalam jadwal backup.

Pertanyaan yang sering diajukan

Apakah container yang sudah ada bisa dipindah ke mode rootless?

Image bisa ditarik ulang, tapi volume dan data perlu disalin ke lokasi baru dan kepemilikan filenya disesuaikan. Perlakukan seperti migrasi ke server baru, dan uji dulu di lingkungan staging.

Apakah docker compose tetap bisa dipakai?

Bisa. Compose berbicara dengan daemon lewat DOCKER_HOST, jadi selama variabel itu menunjuk socket rootless, perintahnya sama.

Apakah performa rootless lebih lambat?

Jaringan rootless memakai lapisan tambahan di ruang user, sehingga bisa ada overhead pada trafik jaringan yang berat. Untuk aplikasi web biasa, ukur di servermu sendiri sebelum memutuskan.

Apakah batas CPU dan RAM container tetap bisa dipakai?

Bisa, asalkan host memakai cgroup v2 dengan systemd. Cara mengaturnya sama seperti di mode biasa, dijelaskan di artikel tentang membatasi CPU dan RAM container Docker.

Sumber & referensi

Baca juga