Apa itu Docker? Penjelasan Lengkap untuk Pemula
Pendahuluan
Pernahkah kamu mengalami situasi seperti ini: sebuah aplikasi berjalan sempurna di laptopmu, tapi begitu dipindahkan ke komputer teman atau server produksi, tiba-tiba error muncul di mana-mana? Developer biasanya menyebut ini dengan kalimat terkenal: “It works on my machine!”
Inilah masalah yang Docker hadir untuk selesaikan.
Docker adalah platform open-source yang memungkinkan kamu mengemas (containerize) aplikasi beserta semua dependensinya ke dalam satu unit portabel yang disebut container. Dengan Docker, aplikasi yang berjalan di laptopmu dijamin akan berjalan persis sama di server manapun — tidak ada lagi drama “works on my machine”.
Bayangkan kamu sedang mengirim barang. Dulu, kamu harus mengkhawatirkan apakah barang akan muat di truk, kapal, atau pesawat yang berbeda-beda ukurannya. Dengan container pengiriman standar (seperti yang terlihat di pelabuhan), kamu tinggal taruh di dalam, dan kendaraan apapun bisa mengangkutnya. Docker bekerja dengan cara yang sama untuk aplikasi.
Memahami Konsep Dasar Docker
Container vs Virtual Machine
Sebelum memahami Docker, penting untuk membedakan container dengan virtual machine (VM).
- Virtual Machine: Seperti membangun rumah baru di dalam rumah. Setiap VM punya sistem operasi sendiri yang lengkap, membutuhkan banyak resource (RAM, CPU, storage).
- Container: Seperti menyewa kamar kos. Semua penghuni berbagi infrastruktur (atap, listrik, air) yang sama, tapi punya ruang pribadi masing-masing. Container berbagi kernel OS host, sehingga jauh lebih ringan dan cepat.
Virtual Machine: Docker Container:
┌─────────────────┐ ┌──────────────────┐
│ App A App B │ │ App A App B │
│ Libs Libs │ │ Libs Libs │
│ OS A OS B │ ├──────────────────┤
│ Hypervisor │ │ Docker Engine │
│ Host OS │ │ Host OS │
└─────────────────┘ └──────────────────┘
Image dan Container
Dua konsep paling fundamental di Docker:
- Docker Image: Blueprint atau “cetakan” dari sebuah container. Bersifat read-only dan berisi semua yang dibutuhkan aplikasi: kode, runtime, library, environment variables.
- Docker Container: Instance yang berjalan dari sebuah image. Kamu bisa menjalankan banyak container dari satu image yang sama.
Analoginya sederhana: image adalah resep masakan, container adalah masakan yang sudah jadi. Dari satu resep, kamu bisa membuat banyak porsi masakan.
Komponen Utama Docker
1. Docker Daemon
Proses background yang berjalan di sistem operasi host. Ini adalah “mesin” sesungguhnya yang membuat, menjalankan, dan mengelola container.
2. Docker Client
Antarmuka command-line (docker) yang kamu gunakan untuk berinteraksi dengan Docker Daemon. Saat kamu mengetik docker run, perintah tersebut dikirim ke daemon untuk dieksekusi.
3. Docker Hub
Registry publik tempat menyimpan dan berbagi Docker image. Seperti GitHub, tapi khusus untuk Docker image. Kamu bisa mengunduh image resmi untuk nginx, PostgreSQL, Node.js, dan ribuan aplikasi lainnya di sini.
4. Dockerfile
File teks berisi instruksi untuk membangun sebuah Docker image secara otomatis. Ini adalah “resep” yang tadi kita bahas.
5. Docker Compose
Tool untuk mendefinisikan dan menjalankan aplikasi multi-container. Sangat berguna saat aplikasimu butuh beberapa service sekaligus (misalnya: web server + database + cache).
Instalasi dan Perintah Dasar Docker
Instalasi
Unduh Docker Desktop dari situs resmi Docker sesuai sistem operasimu (Windows, Mac, atau Linux). Setelah instalasi, verifikasi dengan perintah:
docker --version
# Output: Docker version 24.0.5, build ced0996
Perintah-Perintah Dasar
Menjalankan container pertamamu:
# Jalankan container hello-world untuk verifikasi instalasi
docker run hello-world
# Jalankan nginx web server di port 8080
docker run -d -p 8080:80 --name my-nginx nginx
Melihat container yang berjalan:
# Lihat container yang sedang aktif
docker ps
# Lihat semua container (termasuk yang sudah berhenti)
docker ps -a
Manajemen container:
# Hentikan container
docker stop my-nginx
# Hapus container
docker rm my-nginx
# Lihat semua image yang sudah diunduh
docker images
# Hapus image
docker rmi nginx
Membuat Dockerfile Pertamamu
Buat struktur proyek berikut di komputermu:
docker-demo/
├── app.js
├── package.json
└── Dockerfile
File app.js:
// app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Halo dari Docker Container!\n');
});
server.listen(3000, () => {
console.log('Server berjalan di port 3000');
});
File package.json:
{
"name": "docker-demo",
"version": "1.0.0",
"description": "Aplikasi Node.js untuk demo Docker",
"main": "app.js",
"scripts": {
"start": "node app.js"
}
}
File Dockerfile:
# Gunakan image Node.js versi 18 sebagai base
FROM node:18-alpine
# Set direktori kerja di dalam container
WORKDIR /app
# Copy file package.json terlebih dahulu (untuk caching layer)
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy semua file source code
COPY . .
# Expose port yang digunakan aplikasi
EXPOSE 3000
# Perintah yang dijalankan saat container start
CMD ["node", "app.js"]
Build dan jalankan image:
# Masuk ke direktori proyek
cd docker-demo
# Build image dengan nama "my-node-app"
docker build -t my-node-app .
# Jalankan container dari image tersebut
docker run -d -p 3000:3000 --name node-container my-node-app
# Cek apakah berjalan
curl http://localhost:3000
# Output: Halo dari Docker Container!
Contoh Docker Compose
Untuk aplikasi yang butuh database, buat file docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:password@db:5432/myapp
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Jalankan semua service sekaligus:
# Jalankan semua service di background
docker compose up -d
# Lihat log semua service
docker compose logs -f
# Hentikan semua service
docker compose down
Contoh Kasus Nyata
Skenario: Onboarding Developer Baru
Bayangkan kamu bergabung di startup yang sedang membangun layanan seperti Tokopedia. Tanpa Docker, developer baru harus:
- Install Python versi tertentu
- Install PostgreSQL dengan versi spesifik
- Install Redis
- Konfigurasi environment variables satu per satu
- Debug selama berjam-jam karena versi library berbeda
Dengan Docker, cukup:
git clone https://github.com/perusahaan/aplikasi.git
cd aplikasi
docker compose up -d
# Selesai! Aplikasi langsung berjalan.
Ini juga sangat berguna dalam pipeline CI/CD. Artikel tentang Cara Mengatasi Error ‘Permission Denied’ di GitHub Actions membahas salah satu tantangan umum saat mengintegrasikan Docker dengan GitHub Actions.
Jika kamu sedang membangun layanan cloud-native seperti ride-hailing atau e-commerce, Docker juga bekerja sangat baik bersama platform serverless. Kamu bisa membaca lebih lanjut di artikel Membangun Aplikasi Serverless dengan Cloudflare Workers: Tutorial Step-by-Step untuk melihat bagaimana containerization dan serverless saling melengkapi.
Troubleshooting: Error yang Sering Muncul
Port Already in Use (Bind: Address Already in Use)
Penyebab: Port yang ingin kamu gunakan sudah dipakai oleh proses lain di sistem host, sehingga Docker tidak bisa mem-bind port tersebut.
Solusi:
# Cari proses yang menggunakan port (contoh: port 3000)
# Di Linux/Mac:
lsof -i :3000
# Di Windows (PowerShell):
netstat -ano | findstr :3000
# Hentikan proses tersebut, atau gunakan port lain
docker run -d -p 3001:3000 --name my-app my-image
Docker Daemon Not Running
Penyebab: Docker Desktop belum dijalankan atau Docker service tidak aktif, sehingga Docker client tidak bisa terhubung ke daemon.
Solusi:
# Di Linux, start service Docker
sudo systemctl start docker
sudo systemctl enable docker # agar otomatis start saat boot
# Verifikasi Docker daemon berjalan
docker info
# Jika pakai Docker Desktop (Windows/Mac): buka aplikasi Docker Desktop terlebih dahulu
Cannot Connect to the Docker Daemon (Permission Denied)
Penyebab: User yang aktif tidak memiliki izin untuk mengakses Docker socket, biasanya terjadi di Linux karena user belum ditambahkan ke grup docker.
Solusi:
# Tambahkan user ke grup docker
sudo usermod -aG docker $USER
# Logout dan login kembali agar perubahan berlaku
# Verifikasi dengan:
docker ps
# Seharusnya tidak ada error "permission denied" lagi
Image Build Fails: COPY Failed
Penyebab: File yang ingin di-copy di Dockerfile tidak ada di build context, atau path yang ditulis salah.
Solusi:
# SALAH: file tidak ada di root project
COPY config/settings.json /app/config/
# BENAR: pastikan file ada, lalu verifikasi path
# Cek isi direktori yang akan di-copy dengan:
# ls -la config/
# Buat .dockerignore untuk mengontrol apa yang masuk ke build context
# File: .dockerignore
node_modules
.git
*.log
.env
Pertanyaan yang Sering Diajukan
Apa perbedaan Docker dan Virtual Machine?
Docker container berbagi kernel OS dengan host dan hanya mengemas aplikasi beserta dependensinya, sehingga lebih ringan (ukuran MB, startup dalam detik). Virtual Machine mengemas seluruh sistem operasi beserta hardware virtual, sehingga lebih berat (ukuran GB, startup dalam menit). Untuk development sehari-hari, Docker jauh lebih praktis dan efisien dalam penggunaan resource.
Apakah Docker aman untuk digunakan di production?
Ya, Docker sudah digunakan secara luas di production oleh ribuan perusahaan di seluruh dunia. Keamanannya bergantung pada praktik yang benar: gunakan image resmi, jangan jalankan container sebagai root, scan image untuk vulnerability, dan update secara rutin. Dengan konfigurasi yang tepat, Docker sangat aman untuk lingkungan production.
Apa itu Docker Hub dan apakah gratis?
Docker Hub adalah registry publik untuk menyimpan dan berbagi Docker image, mirip seperti GitHub untuk kode. Docker Hub tersedia gratis dengan batasan tertentu (pull rate limit untuk anonymous user, satu private repository). Untuk kebutuhan enterprise atau private registry, tersedia paket berbayar atau alternatif seperti GitHub Container Registry atau Google Artifact Registry.
Bagaimana cara data container tidak hilang saat container dihapus?
Gunakan Docker Volume untuk menyimpan data secara persisten di luar siklus hidup container. Contoh:
# Buat volume
docker volume create my-data
# Pasang volume ke container
docker run -d -v my-data:/app/data my-image
# Lihat daftar volume yang ada
docker volume ls
# Data di /app/data akan tetap ada meski container dihapus
Apa itu Docker Compose dan kapan saya butuhnya?
Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi yang terdiri dari beberapa container sekaligus menggunakan satu file docker-compose.yml. Kamu butuh Compose saat aplikasimu memiliki lebih dari satu service — misalnya web server + database + cache Redis. Dengan satu perintah docker compose up, semua service langsung berjalan bersamaan tanpa harus menjalankan satu per satu secara manual.
Kesimpulan
Docker telah merevolusi cara developer membangun, mengemas, dan mendeploy aplikasi. Dengan memahami konsep dasar — image, container, Dockerfile, dan Docker Compose — kamu sudah memiliki fondasi yang kuat untuk mulai menggunakan Docker dalam project sehari-hari.
Mulailah dengan mencoba docker run hello-world, lalu buat Dockerfile sederhana untuk aplikasi yang sudah kamu miliki. Seiring waktu, kamu akan merasakan sendiri betapa Docker menyederhanakan alur kerja development dan deployment.
Selamat belajar dan terus bereksperimen! Jika ada pertanyaan atau kamu ingin mendalami topik lain seputar teknologi, jangan ragu untuk menjelajahi artikel-artikel lainnya di KamusNgoding — banyak hal menarik yang menunggumu di sana!