Sebelum menjalankan kontainer pertama, ada fondasi yang perlu disiapkan: skill dasar Linux CLI (navigasi filesystem, environment variables, konsep PID, port, dan localhost) hingga pemilihan environment Docker dan verifikasi instalasi client + daemon.

Selamat datang di series Belajar Docker! Series ini akan membawa kalian dari nol hingga siap mendeploy aplikasi production-grade menggunakan Docker: mulai dari prasyarat dan setup environment, sejarah containerization, arsitektur Docker, menjalankan kontainer pertama, lifecycle kontainer, Dockerfile, multi-stage build, storage, networking, Docker Compose, registry, security, observability, Swarm, CI/CD, hingga studi kasus arsitektur production yang lengkap. Total 27 episode yang akan mengubah cara kalian memandang deployment aplikasi.
Mengapa Docker begitu penting? Karena Docker adalah jawaban atas masalah tertua di industri software: "It works on my machine!" — aplikasi yang berjalan mulus di laptop kalian, tapi tiba-tiba mogok di server produksi karena beda versi library, beda sistem operasi, atau dependency yang hilang. Docker membungkus aplikasi beserta seluruh lingkungannya — library, file konfigurasi, bahkan sistem operasi — ke dalam satu paket standar yang berjalan identik di mana pun. Seorang DevOps Engineer yang tidak memahami Docker seperti mekanik yang tidak punya kotak alat: bisa bekerja, tapi hanya di satu tempat.
Episode 0 ini adalah peta jalan. Sebelum membahas kontainer, kita harus memastikan tiga hal: (1) skill dasar Linux yang wajib kalian kuasai, (2) pilihan environment Docker yang paling cocok untuk kalian, dan (3) verifikasi bahwa Docker terpasang dan berjalan sempurna. Jangan lompat-lompat — fondasi yang goyah akan membuat seluruh series ini terasa berat. Mari mulai.
Docker adalah produk yang lahir dari Linux dan hidup di dalam terminal. Kalian akan mengetik ratusan perintah Docker di shell, memeriksa log, menyalin file, dan membaca output daemon. Jika dasar terminal masih goyah, kalian akan tersesat di tengah jalan. Berikut skill yang wajib kalian miliki sebelum melanjutkan.
Kalian wajib nyaman "berjalan" di dalam filesystem Linux. Pahami perbedaan path absolut (/etc/nginx/nginx.conf) dengan path relatif (../config/app.conf), arti ~ (home user), . (direktori saat ini), dan .. (direktori induk). Bayangkan filesystem sebagai gudang: kalian harus tahu di mana barang diletakkan sebelum bisa mengaturnya.
| Perintah | Fungsi | Analogi |
|---|---|---|
pwd | Menampilkan direktori saat ini | Melihat posisi kita di peta |
cd | Berpindah direktori | Berjalan ke ruangan lain |
ls | Menampilkan isi direktori | Membuka pintu dan melihat isi kamar |
mkdir | Membuat direktori | Membangun ruangan baru |
rm | Menghapus file/direktori | Menghancurkan dokumen (tanpa keranjang sampah!) |
cp | Menyalin file | Memfotokopi dokumen |
mv | Memindahkan / mengganti nama | Memindahkan file dari meja ke rak |
Kalian tidak perlu menghafal semua opsi flag. Yang penting pernah memakai dan paham fungsinya, karena hampir semua pekerjaan Docker berangkat dari perintah-perintah sederhana ini — misalnya saat kita nanti membaca file konfigurasi atau memeriksa direktori /var/lib/docker.
Environment variable adalah pasangan nama=nilai yang diwariskan sistem ke setiap proses yang berjalan. Bayangkan seperti papan pengumuman di kantor: semua karyawan (proses) bisa membacanya, dan nilai di dalamnya menentukan perilaku mereka. Variabel seperti $HOME, $USER, dan $PATH selalu ada di setiap shell Linux.
echo "$HOME"
echo "$USER"
export MY_VAR="nilai saya"
echo "$MY_VAR"Perhatikan sintaks export NAMA=nilai — tanpa export, variabel hanya hidup di shell kalian dan tidak diwariskan ke proses anak. Ini penting karena Docker adalah proses terpisah: saat nanti kita mengeset variabel untuk kontainer dengan docker run -e, kita sedang mengirim nilai dari host ke dalam proses kontainer.
Tiga konsep ini adalah bahasa tubuh dari dunia networking dan process management — wajib dipahami karena akan muncul di hampir semua episode:
PID (Process ID) — nomor unik yang diberikan kernel ke setiap proses yang berjalan. Saat kalian menjalankan docker run, daemon Docker menciptakan proses-proses baru yang punya PID masing-masing di dalam host. Cek proses kalian dengan ps aux atau top; proses docker terlihat sebagai dockerd dan containerd.
Port — "pintu" bernomor (0–65535) di sebuah mesin yang dipakai aplikasi untuk menerima koneksi. Web server standar duduk di port 80, database PostgreSQL di 5432, Redis di 6379. Dalam Docker, port di dalam kontainer harus dipetakan ke port host agar bisa diakses dari luar — topik yang akan kita bedah di episode 3.
localhost — nama yang merujuk ke mesin itu sendiri (loopback, IP 127.0.0.1). Saat kalian membuka http://localhost:8080, kalian mengakses mesin sendiri. Nanti, "localhost di dalam kontainer" berbeda dengan "localhost di host" — perbedaan ini adalah sumber kebingungan klasik pemula Docker.
ps aux | grep docker
ss -tlnpss -tlnp menampilkan port yang sedang "mendengarkan" (listening) beserta proses yang memakainya — alat yang tak ternilai saat port bentrok nanti.
File konfigurasi Docker (Dockerfile, compose.yaml, daemon.json) adalah file teks biasa. Kalian butuh editor yang nyaman: nano (paling ramah pemula), vim (curam tapi paling efisien), atau VS Code dengan remote SSH — standar industri untuk DevOps. Pilih satu dan konsisten; semua episode series ini akan menuntut kalian menulis dan mengedit file konfigurasi.
Tip
Biasakan bereksperimen di environment yang aman. Buat folder latihan khusus, misalnya ~/docker-lab, dan bebas merusak apa pun di dalamnya. Docker akan menciptakan dan menghapus banyak resource — lebih baik melakukannya di laboratorium kalian sendiri.
Docker berjalan di semua sistem operasi utama, tapi cara pemasangannya berbeda dan — yang lebih penting — cara kerjanya di belakang layar berbeda. Pahami trade-off setiap pilihan:
| Environment | Cara Kerja | Kelebihan | Kekurangan |
|---|---|---|---|
| Docker Engine (Linux native) | Kontainer berjalan langsung di kernel Linux | Paling cepat, paling otentik, persis server produksi | Butuh Linux terpasang |
| Docker Desktop (macOS) | Kontainer berjalan di VM Linux kecil | Nyaman, GUI, terintegrasi macOS | Overhead VM, lisensi untuk perusahaan besar |
| Docker Desktop (Windows WSL2) | Kontainer berjalan di distro WSL2 (kernel Linux asli) | Kernel Linux asli di Windows tanpa install ulang | Setup WSL2, filesystem berlapis |
| OrbStack (macOS) | Kontainer berjalan di VM Linux yang sangat ringan | Super ringan, cepat, hemat baterai | Khusus macOS |
| Rancher Desktop | Alternatif open-source Docker Desktop | Gratis penuh, bisa pakai containerd murni | Kurang mulus dibanding Docker Desktop |
Important
Rekomendasi utama untuk series ini: Docker Engine di Linux (Ubuntu Server, Debian, atau Rocky Linux). Ini bukan sekadar preferensi — kontainer di Linux native berjalan tanpa lapisan VM, sehingga semua perintah, performa, dan perilaku persis seperti server produksi yang akan kalian kelola. Jika kalian di Windows, gunakan WSL2; di macOS, OrbStack atau Docker Desktop. Mana pun yang dipilih, perintah-perintah docker di series ini identik di semua platform.
Ada dua cara memasang Docker Engine di keluarga Debian/Ubuntu, dan keduanya valid — bedanya di level kebaruan dan kontrol:
docker.io — dikelola oleh maintainer distro, sudah teruji dengan distro tersebut, tapi versinya bisa tertinggal beberapa bulan. Cukup untuk belajar dan sebagian besar production.docker-ce (Community Edition) langsung dari Docker Inc, versi selalu terbaru, dan menjadi pilihan standar untuk server produksi.Untuk Ubuntu/Debian:
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now dockerUntuk Rocky Linux / keluarga RHEL:
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now dockerPerhatikan paket terakhir: docker-compose-plugin — plugin Compose v2 (perintah docker compose, dengan spasi) yang akan kita pakai di fase 3 series ini. Tanpa paket ini, kalian hanya punya docker-compose versi lama yang terpisah.
Setelah terpasang, verifikasi dengan tiga perintah berikut. Inilah "tes tensi" environment Docker kalian:
docker version
docker info
docker compose versionOutput docker version terbagi menjadi dua bagian besar — dan inilah konsep kunci pertama kita:
Client:
Version: 27.4.1
Server:
Engine:
Version: 27.4.1
API version: 1.46 (minimum version 1.24)docker yang kalian ketik di terminal. Ia hanya pengirim perintah.dockerd yang benar-benar melakukan pekerjaan: menjalankan, menghentikan, dan mengelola kontainer. Jika bagian Server/Engine tidak muncul atau error "Cannot connect to the Docker daemon", berarti daemon tidak berjalan — cek dengan sudo systemctl status docker dan mulai dengan sudo systemctl start docker.docker info memberi ringkasan kesehatan daemon: jumlah kontainer, storage driver (overlay2), kernel, dan setting penting lainnya. docker compose version memastikan Compose v2 siap dipakai. Kalian akan menggunakan ketiga perintah ini terus-menerus, jadi hafalkan.
Secara default, perintah docker butuh akses root karena daemon mendengarkan lewat Unix socket /var/run/docker.sock yang dimiliki root. Setiap kali tanpa sudo, kalian dapat error permission denied while trying to connect to the Docker daemon socket. Solusinya: tambahkan user kalian ke grup docker.
sudo usermod -aG docker $USER
newgrp docker
id -nGusermod -aG docker $USER menambahkan user aktif ke grup docker, dan newgrp docker mengaktifkan keanggotaan baru tanpa logout. Verifikasi dengan id -nG — pastikan docker muncul di daftar grup. Setelah ini, docker run berjalan tanpa sudo.
Warning
Anggota grup docker memiliki hak setara root pada mesin. Karena daemon menjalankan kontainer sebagai root, siapa pun yang bisa berbicara ke socket daemon bisa menjalankan perintah dengan hak penuh — misalnya mem-bind mount direktori / host ke dalam kontainer lalu membaca seluruh filesystem. Jadi: jangan asal memasukkan user ke grup docker, dan jangan pernah menjalankan perintah docker yang tidak kalian pahami. Untuk single-user development, aman. Untuk server multi-user, pertimbangkan rootless Docker yang akan kita bahas di episode 13.
Sekarang mari rangkai semua yang sudah disiapkan menjadi satu skrip uji yang memastikan environment kalian benar-benar siap untuk mengikuti series ini:
#!/bin/bash
echo "=== Docker Setup Verification ==="
docker version --format 'Client version : {{.Client.Version}}'
docker version --format 'Server version : {{.Server.Version}}'
docker compose version
echo "--- Info ringkas daemon ---"
docker info --format 'Containers : {{.Containers}}'
docker info --format 'Images : {{.Images}}'
docker info --format 'Kernel : {{.KernelVersion}}'
echo "--- Keanggotaan grup docker ---"
if groups | grep -q docker; then
echo "OK: user $USER ada di grup docker"
else
echo "PERLU: jalankan 'sudo usermod -aG docker $USER' lalu logout-login"
fibash verify-docker-setup.shJika kalian melihat Server version tercetak (daemon merespons tanpa sudo) dan baris "OK", environment kalian resmi siap. Jika "Cannot connect to the Docker daemon" muncul, mulailah dari sudo systemctl status docker — 90% kasus ini adalah daemon yang belum berjalan.
Daemon tidak berjalan. Perintah docker run error Cannot connect to the Docker daemon. Solusi: sudo systemctl enable --now docker dan pastikan layanan aktif.
Tidak memakai sudo sebelum user masuk grup docker. Error permission denied while trying to connect to the Docker daemon socket. Solusi: usermod -aG docker $USER + newgrp docker, lalu cek id -nG.
Mengabaikan verifikasi. Melewatkan docker version dan docker info berarti tidak tahu apakah client dan server berbicara. Biasakan verifikasi setelah instalasi apa pun.
Konsep PID/port yang tidak kuat. Tanpa memahami port dan ss -tlnp, kalian akan kebingungan saat port bentrok di episode 3. Perkuat dasar ini sekarang.
Bingung antara Compose v1 dan v2. Perintah docker-compose (v1) berbeda dari docker compose (v2). Series ini memakai v2. Pastikan docker compose version mengembalikan versi 2.x.
Note
Budaya debugging yang benar: baca pesan error lengkap sebelum bertanya ke Google. Error Docker hampir selalu eksplisit — sebutkan "permission denied", "Cannot connect", atau "port is already allocated". Cocokkan pesan itu dengan command kalian, periksa nomor baris, dan perbaiki satu per satu.
Di episode 0 ini kalian telah memastikan tiga fondasi: skill dasar Linux CLI (navigasi filesystem dengan cd, ls, mkdir, rm, environment variables, serta konsep PID, port, dan localhost), environment Docker yang tepat (Docker Engine di Linux sebagai rekomendasi utama, Docker Desktop/WSL2, OrbStack, atau Rancher Desktop untuk platform lain), dan instalasi plus verifikasi bahwa client dan daemon Docker berjalan normal lewat docker version, docker info, docker compose version, serta skrip uji pertama kalian.
Poin yang harus kalian bawa:
docker kalian berjalan tanpa sudo.docker setara root — pahami risikonya sebelum memakainya.docker version dan docker info.Ingat, series Belajar Docker terdiri dari 27 episode yang saling membangun: sejarah containerization, arsitektur, menjalankan kontainer, Dockerfile, storage, networking, Compose, security, observability, Swarm, hingga CI/CD dan studi kasus production. Episode 0 ini adalah batu bata pertama — dan kalian baru saja meletakkannya dengan sempurna. Di episode 1 selanjutnya kita akan mundur sejenak untuk memahami sejarah, latar belakang, dan mengapa Docker lahir: dari era bare-metal, era virtual machine, masalah "It works on my machine!", hingga teknologi kernel Linux (cgroups, namespaces) yang menjadi fondasi containerization. Sampai jumpa di episode 1, dan selamat membangun laboratorium Docker kalian!