Peta lingkungan pada chapter sebelumnya menunjuk satu titik awal yang paling wajar: Docker Engine di Linux. Budi membuka terminal laptop Ubuntu miliknya, dan keputusan pertamanya bukan mengetik perintah pemasangan, melainkan memilih sumber paket. Repositori bawaan Ubuntu memang menyediakan paket bernama docker.io, tetapi versinya hampir selalu tertinggal jauh dari rilis resmi Docker, dan mesin yang sudah dipakai bolak-balik kadang menyimpan paket lama yang bentrok satu sama lain. Chapter ini mengerjakan jalur resmi dari dokumentasi Docker untuk Ubuntu secara utuh — membersihkan paket konflik, menambahkan kunci GPG dan repositori resmi, memasang lima paket inti, sampai daemon menyala dan bisa dipanggil tanpa sudo.
Menyingkirkan Paket yang Bentrok #
Distribusi Linux lama dan alat sejenis Docker kadang meninggalkan paket dengan nama berkas atau perintah yang sama. Docker resmi menyarankan pencopotan enam paket berpotensi bentrok sebelum memasang versi dari repositori mereka, sehingga mesin kita mulai dari keadaan bersih. Jalankan perintah berikut di terminal — pada mesin yang masih bersih, apt hanya akan melaporkan bahwa paket-paket tersebut tidak terpasang:
$ sudo apt-get remove docker.io docker-\
compose docker-doc podman-docker containerd runcOutput yang Dihasilkan:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
...Baris-baris laporan status tiap paket dipotong agar ringkas; pada mesin bersih tertulis Package '...' is not installed, so not removed untuk setiap namanya. Mari kita telaah daftar paket yang dicopot:
docker.io— paket Docker dari repositori Ubuntu sendiri; versinya tertinggal jauh dari rilis resmi sehingga kita ganti sepenuhnya dengan paket dari repositori Docker.- Paket Compose generasi lama — perhatikan penulisannya yang terpecah menjadi
docker-di ujung baris pertama dancomposedi awal baris kedua. Garis miring terbalik di ujung baris adalah tanda kelanjutan baris di bash: shell menghapus pasangan tanda tersebut lalu menyambungkan kedua potongan menjadi satu nama paket utuh saat membaca perintah. Nama paket warisan inilah yang sudah berstatus legacy — Course kita memakai plugindocker composemodern, jadi sisa paket lama sebaiknya disingkirkan supaya tidak ada dua perintah berbeda yang berebut perhatian. docker-doc— dokumentasi versi lama dari repositori distro yang dapat menimpa berkas bantuan milik paket resmi.podman-docker— paket yang menyediakan perintahdockerbayangan milik Podman; kalau dibiarkan, dua implementasi berbeda saling berebut nama perintah yang sama.containerddanrunc— runtime lama dari repositori distro; keduanya akan digantikan oleh paketcontainerd.iodari repositori resmi Docker yang selalu sejalan versinya dengan Engine.
Menambahkan Kunci GPG dan Repositori Resmi #
Langkah berikutnya memberi tahu apt bahwa paket Docker resmi layak dipercaya. Kita membuat folder kunci, mengunduh kunci publik Docker ke dalamnya, lalu menuliskan berkas definisi repositori baru. Perintah-perintahnya adalah sebagai berikut:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL "GANTI-DENGAN-URL-KUNCI-GPG" -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.ascPerintah di atas tidak mencetak keluaran apa pun ketika berhasil — tanda terbaiknya justru ketiadaan galat. Setelah kunci berada di tempatnya, kita menuliskan berkas repositori dengan format deb822, format berkonfigurasi modern milik apt, ke lokasi /etc/apt/sources.list.d/docker.sources:
$ sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<'EOF'
Types: deb
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc
URIs: GANTI-DENGAN-URL-REPOSITORI
Suites: noble
Components: stable
EOF
$ sudo apt-get updateOutput yang Dihasilkan:
...
Fetched 32.4 kB in 3s (11.2 kB/s)
Reading package lists... DoneBaris-baris Hit dan Get yang memuat alamat setiap repositori dipotong agar ringkas — angka Fetched di atas berasal dari metadata repositori Docker yang baru saja ditambahkan. Mari kita telaah arti setiap kunci pada berkas deb822 di atas:
Types: deb— repositori ini menyediakan paket biner siap pakai, bukan kode sumber (deb-src).Architectures: amd64— arsitektur mesin kita; ganti nilainya bila berjalan di prosesor ARM, misalnyaarm64pada Raspberry Pi atau server ARM.Signed-By: /etc/apt/keyrings/docker.asc— apt memverifikasi setiap paket dari repositori ini dengan kunci publik yang baru kita unduh, sehingga paket yang dimanipulasi di tengah jalan akan ditolak.URIs: GANTI-DENGAN-URL-REPOSITORI— alamat repositori apt resmi Docker; penanda ini kita ganti dengan alamat asli dari halaman instalasi resmi.Suites: noble— nama rilis Ubuntu 24.04 yang kita pakai; nilai ini berbeda untuk rilis Ubuntu lain, jadi sesuaikan dengan outputlsb_release -cs.Components: stable— kanal rilis stabil; Docker juga menyediakan kanaltestdannightlyuntuk yang ingin mencicipi fitur lebih awal.
Memasang Lima Paket Inti #
Repositori resmi kini terdaftar, dan pemasangan inti tinggal satu perintah. Perintah berikut memasang lima paket yang membentuk Docker Engine yang utuh:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-\
compose-pluginOutput yang Dihasilkan:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
...
Setting up docker-ce (5:29.9.0-1~ubuntu.24.04~noble) ...
...
Processing triggers for man-db (2.12.0-4build2) ...Baris-baris pemasangan tiap paket di bagian tengah dipotong agar ringkas. Perhatikan kembali tanda kelanjutan baris pada paket kelima — mekanismenya sama dengan perintah pencopotan di awal chapter: docker- di ujung baris kedua dan compose-plugin di awal baris ketiga disambung bash menjadi satu nama paket. Kelima paket tersebut bekerja sebagai satu tim:
| Paket | Apa isinya | Kenapa perlu |
|---|---|---|
| docker-ce | Daemon dockerd beserta REST API-nya | Inilah Docker Engine itu sendiri — otak yang mengelola image, container, network, dan volume |
| docker-ce-cli | Perintah docker di terminal | Tanpa CLI, tidak ada cara yang ergonomis untuk berbicara dengan daemon |
| containerd.io | containerd dan runc dari repositori resmi Docker | Runtime yang benar-benar melahirkan dan mengawasi proses container, selaras versinya dengan Engine |
| docker-buildx-plugin | Subperintah docker buildx | Membangun image di atas BuildKit; docker build modern adalah alias dari docker buildx build |
| docker-compose-plugin | Subperintah docker compose | Mengelola stack multi-container lewat berkas compose.yaml — dipakai di banyak bab berikutnya |
Tiga paket pertama adalah tubuh dari arsitektur client-server yang kita bedah pada Chapter Arsitektur Docker, sedangkan dua plugin terakhir menyatu ke dalam perintah docker sebagai subperintah siap pakai. Karena kelimanya berasal dari repositori yang sama, versinya selalu naik bersamaan — tidak ada risiko CLI terbaru dipasangkan dengan daemon lama.
Memastikan Versi yang Terpasang #
Satu perintah singkat memastikan CLI sudah berada di jalur perintah kita dan melaporkan versi Engine yang terpasang:
$ docker --versionOutput yang Dihasilkan:
Docker version 29.9.0, build 7f3ac91Angka 29.9.0 adalah versi Docker Engine yang menjadi patokan sepanjang Course ini; angka setelah build adalah penanda commit kode sumbernya. Bila keluaran menampilkan versi yang jauh lebih tua, hampir pasti mesin masih membaca paket dari repositori distro — ulangi langkah penambahan repositori resmi di atas.
Jalur Singkat untuk Debian #
Untuk mesin Debian, seluruh alurnya serupa: copot paket konflik yang sama, unduh kunci GPG, tulis berkas /etc/apt/sources.list.d/docker.sources dengan format deb822 yang sama, lalu pasang kelima paket yang sama. Satu-satunya yang berbeda adalah nilai Suites — ganti noble dengan nama rilis Debian yang sedang berjalan — dan jalur repositori yang menunjuk ke debian, bukan ubuntu. Kedua hal itu dijelaskan pada halaman instalasi resmi Debian di bagian Referensi.
Menyalakan Daemon dan Startup Otomatis #
Paket terpasang, tetapi daemon belum tentu berjalan — kita perlu mengaktifkannya secara eksplisit, sekaligus memerintahkan systemd menyala bersama mesin pada boot berikutnya:
$ sudo systemctl enable --now docker
$ sudo systemctl status dockerOutput yang Dihasilkan:
Synchronizing state of docker.service with SysV service script with /etc/init.d/docker.
Executing: /usr/lib/systemd/systemd-sysv-install enable docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-10-13 09:41:30 WIB; 18s ago
TriggeredBy: ● docker.socket
Main PID: 8421 (dockerd)
Tasks: 14
Memory: 142.6M
...Beberapa baris log terakhir dipotong agar ringkas. Mari kita telaah bagian pentingnya:
enable --now— satu perintah dua pekerjaan:enablemembuat daemon ikut menyala setiap kali mesin boot, sementara--nowlangsung menjalankannya saat ini juga tanpa menunggu reboot.Active: active (running)— daemon dockerd hidup dan mendengarkan permintaan; inilah status yang ingin kita lihat setiap kali memeriksa.enabledpada baris Loaded — konfirmasi bahwa startup otomatis sudah aktif, ditandai pulapreset: enabledkarena Ubuntu modern mengaktifkan layanan Docker secara bawaan.TriggeredBy: docker.socket— systemd juga mengawasi socket daemon, sehingga klien yang datang lebih dulu daripada daemon dapat memicunya bangun — mekanisme aktivasi socket yang khas di sistem modern.
Menjalankan docker Tanpa sudo #
Secara bawaan, hanya root dan anggota grup docker yang boleh berbicara dengan daemon. Memakai sudo untuk setiap perintah docker melelahkan dan berbahaya untuk kebiasaan, jadi kita mendaftarkan diri ke grup tersebut:
$ sudo usermod -aG docker $USER
$ newgrp docker
$ docker psOutput yang Dihasilkan:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESTabel kosong di atas justru adalah kabar baik: header docker ps tercetak tanpa galat izin, artinya CLI berhasil bicara dengan daemon tanpa sudo. Perintah newgrp docker membuka sesi shell baru yang langsung memakai keanggotaan grup baru, sehingga kita tidak perlu menunggu untuk mencoba.
Perlu dicatat bahwa grup docker bukan sekadar grup biasa: siapa pun anggotanya memiliki kendali penuh atas daemon, yang pada gilirannya berarti kendali penuh atas mesin itu sendiri. Konsekuensi keamanan ini penting dipahami sebelum kita mendaftarkan banyak orang, dan mekanisme di baliknya — izin berkas socket serta padanan akses root — kita bedah tuntas pada Chapter Mengatur Akses Docker.
Dengan daemon yang menyala dan akses tanpa sudo yang berfungsi, instalasi Engine di Linux tuntas untuk tahap ini. Bagaimana dengan Siti yang bekerja di Windows 11, atau developer di macOS yang tidak punya mesin Linux? Mereka menempuh jalur kedua dari peta lingkungan kita: Docker Desktop, yang membawa Engine di dalam VM internal dan memasangnya lewat installer grafis. Chapter Instalasi Docker Desktop memandu jalur tersebut untuk ketiga platform.
Referensi #
- Install Docker Engine di Ubuntu — langkah resmi lengkap beserta alamat kunci GPG dan repositori apt untuk Ubuntu.
- Install Docker Engine di Debian — jalur yang sama untuk Debian beserta nama rilisnya.
- Linux post-installation steps — langkah pasca instalasi, termasuk pengelolaan akses grup docker.