SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-09-04

Cara Instal Docker di Rocky Linux dan AlmaLinux

Panduan instalasi Docker Engine di Rocky Linux dan AlmaLinux menggunakan dnf. Pelajari cara mengatasi konflik perintah podman dan masalah akses SELinux pada bind mounts.

Menginstal Docker pada Rocky Linux dan AlmaLinux

Untuk menginstal Docker pada Rocky Linux atau AlmaLinux, Anda perlu menambahkan repositori dnf milik Docker, menginstal engine beserta plugin compose, lalu mengaktifkan servicenya. Bagian tersebut terdiri dari empat perintah dan identik pada kedua distribusi karena keduanya merupakan hasil pembangunan ulang Red Hat Enterprise Linux (RHEL) dan berbagi tata letak paket yang sama. CentOS Stream bekerja dengan cara yang sama. Semua hal di bawah ini berlaku untuk keduanya, jadi jika Anda masih memilih di antara keduanya, faktor penentunya adalah janji kompatibilitas yang dibuat oleh masing-masing proyek dan apakah CPU lama Anda masih didukung.

Instalasinya singkat, sehingga sebagian besar panduan ini membahas apa yang dilakukan Enterprise Linux (EL) secara berbeda dibandingkan Ubuntu. Podman mungkin sudah menguasai perintah docker pada image Anda. SELinux memblokir file yang di-bind-mount sampai file tersebut memiliki label yang tepat. Firewalld tidak memfilter port yang dipublikasikan Docker, sehingga port container bisa terbuka ke internet sementara firewall-cmd melaporkan bahwa tidak ada port yang terbuka.

Jangan gunakan skrip kenyamanan Docker dari get.docker.com. Dokumentasi Docker sendiri menyatakan bahwa skrip tersebut tidak disarankan untuk lingkungan produksi. Skrip tersebut menulis ulang konfigurasi repositori Anda tanpa bertanya, dan tidak dapat dijalankan kembali dengan aman untuk melakukan upgrade. Menambahkan repositori secara manual berarti dnf upgrade memperlakukan Docker seperti paket lainnya di sistem. Hal ini juga menempatkan engine tersebut dalam cakupan dnf-automatic, jika Anda menggunakannya untuk menerapkan pembaruan keamanan secara terjadwal, jadi tentukan sejak awal apakah Anda ingin Docker dipatch secara otomatis atau ditahan untuk jendela pemeliharaan. Bagaimanapun, sebuah upgrade akan mengganti binary yang terinstal sementara dockerd yang lama tetap berjalan, dan needs-restarting adalah perintah yang memberi tahu Anda service mana yang masih menjalankan kode yang baru saja Anda ganti.

Apakah podman sudah merespons perintah docker?

Rocky Linux dan AlmaLinux menyertakan podman dalam repositori bawaan mereka, dan banyak image VPS yang menginstalnya untuk Anda. Beberapa image melangkah lebih jauh dengan menginstal podman-docker, yang menempatkan skrip shell di /usr/bin/docker untuk memanggil podman. Setiap perintah docker yang Anda ketik kemudian akan menjalankan podman, sehingga panduan yang ditulis untuk Docker menghasilkan output yang tidak Anda harapkan.

Indikator pertama adalah sebuah banner. Skrip /usr/bin/docker memeriksa keberadaan file /etc/containers/nodocker, dan jika file tersebut tidak ditemukan, skrip akan mencetak satu baris sebelum menjalankan apa pun:

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.

Seseorang mungkin telah membuat file tersebut untuk menyembunyikan banner, jadi jangan hanya mengandalkan hal itu. Tanyakan kepada basis data paket, paket mana yang memiliki biner tersebut:

command -v docker
rpm -qf "$(command -v docker)"

Jawaban yang dimulai dengan podman-docker berarti podman yang merespons. Jawaban yang dimulai dengan docker-ce-cli berarti Docker yang asli. Jika rpm -qf melaporkan bahwa tidak ada paket yang memiliki file tersebut, seseorang telah menginstalnya secara manual dan Anda harus membaca skripnya sebelum memercayainya.

Podman menjalankan image OCI yang sama dan merupakan pilihan yang masuk akal. Jika Anda menginginkannya, berhenti di sini. Keduanya adalah mesin kontainer Linux, jadi jika keputusan platform masih terbuka, perlu diketahui bahwa FreeBSD jails mengisolasi seluruh userland alih-alih menjalankan image berlapis yang ditarik dari registry. Jika Anda menginginkan Docker Engine, hapus paket yang berkonflik terlebih dahulu. Berikut adalah daftar yang didokumentasikan Docker untuk RHEL:

sudo dnf remove docker docker-client docker-client-latest docker-common \
  docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc

Baca apa yang direncanakan dnf sebelum Anda melakukan konfirmasi. Pada image VPS yang baru, daftarnya singkat. Pada server yang sudah pernah digunakan, menghapus podman dapat menarik cockpit-podman atau alat lain yang bergantung padanya.

Menjaga podman tetap ada bersama Docker pada prinsipnya dimungkinkan: hapus hanya podman-docker, agar nama docker bebas, dan runc, yang digantikan oleh paket containerd.io. Dokumentasi Docker memperlakukan podman sebagai paket yang berkonflik, sehingga tata letak ini tidak didukung oleh Docker. Jika instalasi masih melaporkan konflik, gunakan daftar penghapusan lengkap di atas.

Menambahkan repositori Docker dengan dnf config-manager

Docker menerbitkan RPM untuk Enterprise Linux di download.docker.com. File repositori tersebut mengarah ke tree CentOS, yang merupakan target resolusi bagi Rocky Linux dan AlmaLinux. Mengarahkan server Rocky ke repositori CentOS mungkin terlihat salah sampai Anda mengetahui bagaimana kedua distribusi tersebut berkembang dari silsilah CentOS setelah Red Hat mengubah CentOS menjadi Stream pada tahun 2020. Diperiksa pada Agustus 2026, Docker mendokumentasikan repositori ini untuk CentOS Stream 9 dan CentOS Stream 10.

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Versi 5 dari dnf menghapus argumen --add-repo, sehingga perintah kedua tersebut gagal pada rilis yang lebih baru. Periksa versi yang Anda miliki, lalu pilih format yang sesuai:

dnf --version

Jika perintah tersebut menampilkan versi 5.x, gunakan format subperintah sebagai gantinya:

sudo dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/centos/docker-ce.repo

Keduanya menulis file yang sama ke /etc/yum.repos.d/docker-ce.repo. Format yang salah akan gagal dengan error argumen tidak dikenal alih-alih melakukan kesalahan secara diam-diam, sehingga Anda tidak akan melewatkannya.

File repo tersebut menetapkan baseurl ke path yang berisi $releasever, dan dnf melakukan ekspansi variabel tersebut dari paket rilis Anda. Rocky Linux dan AlmaLinux menetapkannya ke nomor versi mayor, jadi 9 pada EL 9 dan 10 pada EL 10, itulah sebabnya repositori CentOS teresolusi dengan benar pada server Rocky. Konfirmasikan ekspansi tersebut sebelum Anda melakukan instalasi:

sudo dnf repoinfo docker-ce-stable

Baca baris Repo-baseurl. Baris tersebut harus diakhiri dengan /9/x86_64/stable atau /10/x86_64/stable. Jika rilis Anda menetapkan $releasever ke versi minor seperti 9.6, dnf akan melaporkan Status code: 404 untuk URL tersebut saat mengambil metadata. Perbaiki dengan mengedit /etc/yum.repos.d/docker-ce.repo dan mengganti $releasever dengan nomor versi mayor saja.

Instal engine dan plugin compose

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Terdapat lima paket, dan masing-masing memiliki satu tugas. docker-ce adalah daemon, dockerd. docker-ce-cli adalah perintah docker yang Anda ketik. containerd.io adalah runtime container yang dijalankan oleh daemon tersebut. docker-buildx-plugin membangun image. docker-compose-plugin menyediakan docker compose sebagai subperintah.

Paket-paket ini tidak menginstal biner docker-compose dengan tanda hubung. Itu adalah Compose v1, yang telah mencapai akhir masa pakainya pada Juli 2023. Segala sesuatu yang memanggil docker-compose dengan tanda hubung perlu diperbarui menjadi docker compose dengan spasi.

Instalasi pertama akan berhenti untuk mengimpor kunci penandatanganan Docker dan menampilkan fingerprint-nya. Kunci tersebut berasal dari gpgkey=https://download.docker.com/linux/centos/gpg di dalam file repo yang baru saja Anda tambahkan, jadi bandingkan fingerprint yang dicetak oleh dnf dengan URL tersebut sebelum Anda menerimanya.

Satu kegagalan muncul cukup sering untuk disebutkan. Jika dnf melaporkan bahwa containerd.io memerlukan container-selinux dan tidak ada yang menyediakannya, berarti repositori AppStream Anda dinonaktifkan. Jalankan dnf repolist dan pastikan appstream terdaftar, karena di situlah container-selinux tersedia pada EL 9 dan EL 10.

Menjalankan Docker dan memastikan statusnya aktif

sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
sudo docker run --rm hello-world

Paket RPM Docker membiarkan daemon dalam kondisi berhenti dan dinonaktifkan setelah instalasi. Inilah alasan langkah ini muncul pada halaman CentOS Docker, berbeda dengan halaman Ubuntu di mana paket deb menjalankan service secara otomatis untuk Anda. Lewati enable dan Docker akan berjalan hingga reboot berikutnya, lalu mati dan mematikan semua container di dalamnya.

systemctl status seharusnya menampilkan Active: active (running). Container hello-world seharusnya mencetak This message shows that your installation appears to be working correctly. lalu keluar. Jika yang muncul adalah error izin pada /var/run/docker.sock, Anda melewatkan sudo, yang akan diperbaiki pada bagian grup docker di bawah.

Periksa plugin compose secara terpisah, karena ini adalah paket yang berbeda dan bisa saja tidak terinstal meskipun engine berjalan dengan baik:

docker compose version

Hasil yang normal akan terlihat seperti Docker Compose version v2.x.x. Mengembalikan service Anda setelah reboot adalah masalah yang berbeda dari mengaktifkan daemon, dan restart policies menentukan apakah service Compose akan kembali berjalan saat boot.

Mengapa bind mount menghasilkan permission denied?

Rocky Linux dan AlmaLinux menjalankan SELinux (Security-Enhanced Linux) dalam mode enforcing secara default. Konfirmasikan dengan getenforce, yang akan mencetak Enforcing.

Kontainer Docker berjalan di bawah tipe SELinux container_t, dan tipe tersebut hanya dapat membaca serta menulis file yang berlabel container_file_t. Direktori yang Anda buat pada host membawa label apa pun yang diberikan oleh path induknya, yang bukan container_file_t. Kontainer ditolak aksesnya meskipun pemilik, grup, dan mode terlihat benar dari sisi host. Reproduksi masalah ini dalam tiga perintah:

sudo mkdir -p /srv/site
echo hello | sudo tee /srv/site/index.html
sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro nginx:alpine cat /usr/share/nginx/html/index.html

Kontainer akan mencetak:

cat: can't open '/usr/share/nginx/html/index.html': Permission denied

Dua perintah berikut menunjukkan penyebabnya. ls -ldZ /srv/site mencetak label, yang untuk path di bawah /srv adalah system_u:object_r:var_t:s0, bukan container_file_t. Kemudian sudo ausearch -m avc -ts recent mencetak catatan audit kernel, yang berisi avc: denied { read }, field scontext= yang menyebutkan container_t, dan field tcontext= yang menyebutkan label yang baru saja Anda lihat pada direktori tersebut. Ketidakcocokan antara kedua field tersebut adalah penyebab utamanya.

Solusinya adalah menambahkan akhiran pada argumen volume. Docker akan melabeli ulang path tersebut untuk Anda:

sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro,z nginx:alpine cat /usr/share/nginx/html/index.html

:z dalam huruf kecil melabeli ulang konten sebagai shared, sehingga beberapa kontainer dapat menggunakan direktori yang sama. :Z dalam huruf besar melabeli ulang konten sebagai private dan unshared, yang terikat pada satu kontainer, sehingga kontainer kedua yang membaca path yang sama akan ditolak. Gunakan :z untuk apa pun yang juga diakses oleh sidecar atau kontainer cadangan. Gunakan :Z untuk direktori database yang dimiliki oleh satu kontainer.

Dokumentasi Docker memberikan peringatan yang perlu diulang, karena pelabelan ulang bersifat rekursif. Melakukan bind-mount pada direktori sistem seperti /home atau /usr dengan :Z "membuat mesin host Anda tidak dapat beroperasi dan Anda mungkin perlu melabeli ulang file mesin host secara manual". Arahkan akhiran ini ke direktori yang Anda buat untuk kontainer, jangan pernah ke path sistem.

Dalam Compose, akhiran tersebut diletakkan pada string yang sama:

services:
  web:
    image: nginx:alpine
    volumes:
      - /srv/site:/usr/share/nginx/html:ro,z

Dua batasan sering kali menjadi kendala. Flag --mount tidak dapat mengatur label SELinux sama sekali, jadi gunakan -v saat Anda membutuhkannya. Named volume tidak memerlukan akhiran, karena Docker melabeli direktori yang dibuatnya di bawah /var/lib/docker/volumes secara otomatis.

Jangan mematikan SELinux. Gunakan sudo setenforce 0 hanya sebagai tes satu menit: jika kontainer kemudian berfungsi, masalahnya adalah label dan :z adalah jawabannya. Kembalikan ke mode semula dengan sudo setenforce 1 segera. Pada Enterprise Linux, permission denied pada bind mount memiliki dua penyebab terpisah yang terlihat identik dari dalam kontainer. Salah satunya adalah label SELinux. Yang lainnya adalah kepemilikan user dan grup numerik biasa, yang merupakan masalah yang diselesaikan oleh variabel PUID dan PGID. ls -lnZ menunjukkan mode, pemilik numerik, dan label dalam satu baris, sehingga Anda dapat mengetahui masalah mana yang sedang Anda hadapi.

Mengapa port yang dipublikasikan dapat diakses padahal firewalld terlihat tertutup?

Firewalld adalah firewall bawaan pada Rocky Linux dan AlmaLinux. Pastikan firewall tersebut berjalan dengan sudo systemctl is-active firewalld. Jika Anda belum mengonfigurasinya di server ini, membuka SSH dan port web dengan firewalld harus dilakukan terlebih dahulu, karena kejutan di bawah ini hanya dapat dipahami setelah Anda memiliki aturan zona yang berfungsi sebagai pembanding. Sekarang, publikasikan sebuah port dan periksa apa yang dianggap terbuka oleh firewalld:

sudo docker run -d --name web -p 8080:80 nginx:alpine
sudo firewall-cmd --list-ports

firewall-cmd mencetak baris kosong. Dari mesin lain, curl -I http://YOUR_SERVER_IP:8080/ mengembalikan HTTP/1.1 200 OK. Port tersebut terbuka ke internet dan firewall Anda tidak melaporkan apa pun.

Penyebabnya adalah jalur yang dilalui paket. Aturan zona firewalld memfilter trafik yang ditujukan ke host itu sendiri. Port yang dipublikasikan tidak ditujukan ke host: Docker memasang aturan destination NAT (network address translation) yang menulis ulang tujuan ke alamat kontainer sebelum paket mencapai jalur input host, sehingga kernel meneruskan (forward) paket tersebut alih-alih mengirimkannya secara lokal. Docker kemudian menempatkan interface bridge-nya ke dalam zona firewalld bernama docker yang targetnya adalah ACCEPT, dan menambahkan kebijakan forwarding bernama docker-forwarding yang mengizinkan penerusan dari zona mana pun ke zona docker. Aturan zona Anda tidak pernah melihat paket tersebut.

Perbaikan paling bersih tidak memerlukan aturan firewall. Bind sisi host dari publikasi ke loopback dan tempatkan reverse proxy di depannya:

sudo docker rm -f web
sudo docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
curl -I http://127.0.0.1:8080/

curl lokal mengembalikan HTTP/1.1 200 OK dan permintaan yang sama dari mesin lain tidak lagi terhubung. Apa pun tanpa alamat host dalam argumen -p akan dipublikasikan di semua interface, jadi anggap -p 8080:80 polos sebagai keputusan untuk mengekspos layanan tersebut secara publik.

Jika Anda memerlukan layanan yang dapat diakses dari alamat tertentu saja, Docker menyediakan chain khusus untuk Anda. DOCKER-USER diproses sebelum aturan accept milik Docker sendiri, sehingga aturan yang Anda masukkan di sana akan tetap ada meskipun Docker melakukan restart dan menulis ulang chain-nya:

sudo iptables -I DOCKER-USER -i enp1s0 ! -s 203.0.113.10 -j DROP
sudo iptables -S DOCKER-USER

Gunakan nama interface dari ip route show default alih-alih berasumsi eth0, karena image EL saat ini menggunakan nama seperti enp1s0 atau ens3. Pada Rocky dan AlmaLinux, perintah iptables adalah lapisan kompatibilitas di atas nftables, dan chain Docker dapat dilihat melaluinya. Aturan yang ditambahkan dengan cara ini akan hilang setelah reboot kecuali Anda menyimpannya, jadi tuliskan ke dalam unit systemd setelah Anda yakin dengan konfigurasinya.

Docker Engine 28.0, yang dirilis pada 2025, menutup celah serupa: akses routed langsung ke port kontainer yang tidak pernah dipublikasikan kini diblokir di chain DOCKER. Perubahan tersebut tidak memengaruhi port yang dipublikasikan, jadi semua penjelasan di atas tetap berlaku pada versi saat ini. Satu kebiasaan operasional yang perlu dibentuk: setelah sudo firewall-cmd --reload apa pun, uji kembali port yang dipublikasikan. Jika port tersebut berhenti merespons, sudo systemctl restart docker akan menginstal ulang aturan Docker.

Administrator Ubuntu menghadapi kendala yang sama melalui alat yang berbeda, yang merupakan alasan mengapa port Docker yang dipublikasikan mengabaikan aturan ufw. Jalur NAT adalah penyebabnya dalam kedua kasus tersebut. Hanya firewall di depannya yang berbeda.

Menambahkan user non-root ke grup docker

Mengetik sudo sebelum setiap perintah docker akan terasa melelahkan, dan grup docker menghilangkan kebutuhan tersebut:

sudo usermod -aG docker $USER
newgrp docker
docker run --rm hello-world

usermod -aG mengedit /etc/group, namun shell Anda saat ini sudah memiliki daftar grupnya sendiri, sehingga perubahan tidak akan berlaku sampai Anda mendapatkan shell baru. newgrp docker memulai shell dengan grup tersebut terpasang agar Anda dapat langsung mengujinya. Sesi SSH baru akan mengambil perubahan ini secara otomatis.

Pahami apa yang diberikan oleh grup tersebut. Keanggotaan memberikan akses tulis ke /var/run/docker.sock, dan apa pun yang dapat berkomunikasi dengan socket tersebut dapat meminta daemon untuk menjalankan container yang me-mount sistem file host. Satu perintah berikut menunjukkan apa artinya:

docker run --rm -v /:/host alpine wc -l /host/etc/shadow

Perintah tersebut membaca file yang hanya bisa dibaca oleh root, dari akun yang tidak memiliki hak akses sudo. Dokumentasi pasca-instalasi Docker sendiri menyatakan hal yang sama: grup docker memberikan hak istimewa yang setara dengan root. Tambahkan akun ke grup tersebut hanya jika Anda juga bersedia memberikan akun itu akses sudo. Jika Anda sedang menyiapkan akun di server baru, putuskan hal ini bersamaan dengan pengaturan user least-privilege pada VPS Anda, bukan setelahnya.

Docker juga menyediakan mode rootless yang menjalankan daemon sebagai user tanpa hak istimewa. Ini adalah jalur instalasi yang terpisah dan mengubah cara kerja driver penyimpanan serta port di bawah 1024, jadi rencanakan hal ini sebagai proyek tersendiri, bukan sekadar flag yang ditambahkan di kemudian hari.

Langkah selanjutnya

Anda kini telah memiliki engine, plugin compose, layanan yang tetap berjalan setelah reboot, dan tiga perilaku spesifik EL yang didokumentasikan di atas. Langkah berikutnya adalah compose.yaml per layanan, dan anatomi file Compose membahas format file serta perintah yang menjalankannya. Jika ini adalah host container pertama Anda, menjalankan Docker di VPS membahas pertanyaan mengenai ukuran, penyimpanan, dan kebersihan image yang tidak dibahas dalam panduan ini.

FAQ

Apakah repositori CentOS untuk Docker dapat digunakan pada Rocky Linux dan AlmaLinux?

Ya. Tambahkan https://download.docker.com/linux/centos/docker-ce.repo dengan dnf config-manager. baseurl di dalam file tersebut berisi $releasever, dan Rocky Linux serta AlmaLinux akan mengembangkannya menjadi nomor versi mayor. Dengan demikian, sistem EL 9 akan merujuk ke tree CentOS 9 dan sistem EL 10 ke tree CentOS 10. Konfirmasikan pengembangan variabel tersebut dengan sudo dnf repoinfo docker-ce-stable dan baca baris Repo-baseurl. Status code: 404 saat dnf mengambil metadata berarti variabel tersebut mengembang ke rilis minor, dan menyunting /etc/yum.repos.d/docker-ce.repo untuk menggunakan nomor mayor saja akan memperbaikinya.

Bisakah Docker dan podman diinstal pada server yang sama?

Dokumentasi Docker mencantumkan podman dan runc sebagai paket yang berkonflik dan menyarankan Anda untuk menghapus keduanya sebelum menginstal Docker Engine. Benturan konkretnya adalah paket podman-docker, yang memiliki /usr/bin/docker dan mengubah setiap perintah docker menjadi perintah podman. Jalankan rpm -qf "$(command -v docker)" untuk melihat paket mana yang memiliki path tersebut. Jika output dimulai dengan podman-docker, maka podman yang merespons. Menjalankan kedua engine tersebut bukan merupakan konfigurasi yang didukung oleh Docker, jadi pada server produksi, pilihlah salah satu.

Mengapa container saya mendapatkan permission denied pada bind mount?

SELinux aktif secara default pada Rocky Linux dan AlmaLinux. Container berjalan sebagai tipe container_t dan hanya dapat mengakses file yang berlabel container_file_t. Direktori yang Anda buat memiliki label yang salah sehingga akses ditolak terlepas dari pemilik dan mode file tersebut. Konfirmasikan hal ini dengan ls -ldZ pada path host dan sudo ausearch -m avc -ts recent, yang akan mencetak avc: denied dengan dua konteks yang tidak cocok. Tambahkan :z pada argumen volume untuk konten yang dibagikan antar container, atau :Z untuk konten yang bersifat privat bagi satu container. Jangan pernah mengarahkan :Z ke /home atau /usr, karena pelabelan ulang bersifat rekursif dan akan merusak sistem host.

Apakah saya perlu membuka port di firewalld untuk mempublikasikan port container?

Tidak, dan justru itulah masalahnya. Aturan NAT Docker menulis ulang alamat tujuan sebelum paket mencapai path input host, sehingga aturan zona firewalld tidak pernah memeriksanya. Docker juga menempatkan bridge-nya ke dalam zona firewalld bernama docker dengan target ACCEPT. Container yang dijalankan dengan -p 8080:80 dapat diakses dari internet sementara sudo firewall-cmd --list-ports tidak mencetak apa pun. Publikasikan ke alamat spesifik dengan -p 127.0.0.1:8080:80 jika hanya host yang boleh mengakses layanan tersebut, atau masukkan aturan pemfilteran ke dalam chain DOCKER-USER, yang diproses Docker sebelum aturan accept miliknya sendiri.

Apakah menambahkan user saya ke grup docker itu aman?

Tindakan tersebut memberikan akses root. Anggota grup docker dapat menulis ke /var/run/docker.sock, dan docker run --rm -v /:/host alpine wc -l /host/etc/shadow kemudian membaca file yang seharusnya hanya bisa diakses root dari akun tanpa hak akses sudo. Dokumentasi pasca-instalasi Docker menyatakan kesetaraan yang sama. Tambahkan hanya akun yang sudah Anda percayai dengan sudo, dan tetap gunakan sudo docker untuk akun bersama atau akun layanan. Rootless mode adalah alternatif jika Anda memerlukan container di bawah user tanpa hak akses istimewa, dan ini merupakan jalur instalasi terpisah, bukan sekadar pengaturan.