Panduan Lengkap Docker untuk Pemula
Quick Start β‘
Baru mulai dengan Docker? Ikuti langkah ini:
# 1. Cek instalasi
docker --version
# 2. Jalankan container pertama kamu
docker run hello-world
# 3. Coba web server
docker run -d -p 8080:80 --name webserver nginx
# 4. Buka browser β http://localhost:8080
Apa itu Docker?
Docker adalah sebuah container engine yang digunakan untuk menjalankan layanan atau aplikasi di dalam sebuah wadah terisolasi yang disebut container.
π Analogi Sederhana
Bayangkan Docker seperti
| Istilah | Analogi | Penjelasan |
|---|---|---|
| Image | Resep masakan | Blueprint/cetakan untuk membuat container |
| Container | Makanan yang disajikan | Instance yang berjalan dari image |
| Dockerfile | Buku resep | Instruksi untuk membuat image |
| Docker Hub | Perpustakaan resep | Tempat download image siap pakai |
| Volume | Tupperware | Penyimpanan data yang tetap ada walau container dihapus |
Mengapa Menggunakan Docker?
Dengan Docker, kita bisa dengan mudah:
- β Menjalankan beberapa layanan di komputer yang sama tanpa konflik
- β Mengemas aplikasi menjadi satu paket utuh yang mudah dipindahkan
- β Mengotomatisasi proses deployment
- β Memastikan βapa yang berjalan di laptop juga akan berjalan di serverβ
π‘ Sederhananya: Docker membantu pengembang dan sysadmin memastikan bahwa βapa yang berjalan di laptop juga akan berjalan di server.β
π Alur Kerja Docker
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β Dockerfile ββββββΆβ Image ββββββΆβ Container β
β (resep) β β (blueprint)β β (berjalan) β
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β β β
β docker build β docker run β
ββββββββββββββββββββ΄βββββββββββββββββββ
Command Docker
Perintah Docker digunakan untuk mengelola image, container, dan komponen sistem lainnya.
Menampilkan versi Docker
docker --version
Mengunduh image dari Docker Hub
docker pull <nama_image>
Contoh:
docker pull nginx
docker pull mysql
docker pull python:3.10
Melihat daftar image lokal
docker images
Menjalankan container
docker run <nama_image>
Contoh lengkap:
docker run -d -p 8080:80 --name webserver nginx
Penjelasan flag:
| Flag | Keterangan |
|---|---|
-d |
Mode background (detached) |
-p 8080:80 |
Mapping port (host:container) |
--name |
Memberi nama container |
-e |
Set environment variable |
-v |
Mount volume |
Melihat container berjalan
docker ps
Melihat semua container (termasuk yang berhenti):
docker ps -a
Menghentikan container
docker stop <container_id>
Menghentikan semua container berjalan:
docker stop $(docker ps -q)
Menghapus container
docker rm <container_id>
Menghapus semua container yang berhenti:
docker rm $(docker ps -a -q)
Melihat log container
docker logs <container_id>
Mode live (mengikuti log secara real-time):
docker logs -f <container_id>
Masuk ke dalam container
docker exec -it <container_id> bash
Atau menggunakan sh jika bash tidak tersedia:
docker exec -it <container_id> sh
Menghapus image
docker rmi <image_id>
Membersihkan resource tidak terpakai
docker system prune
Docker Volume
Volume digunakan untuk menyimpan data secara persisten, sehingga data tidak hilang saat container dihapus.
Membuat volume
docker volume create my_volume
Melihat daftar volume
docker volume ls
Menggunakan volume saat run
docker run -d -v my_volume:/var/lib/mysql mysql:8.0
Menghapus volume
docker volume rm my_volume
Docker Network
Network memungkinkan container saling berkomunikasi.
Melihat daftar network
docker network ls
Membuat network baru
docker network create my_network
Menghubungkan container ke network
docker run -d --network my_network --name app nginx
Menghapus network
docker network rm my_network
Contoh Penerapan: Menjalankan MySQL
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
mysql:8.0
Cek container:
docker ps
Masuk ke MySQL:
docker exec -it mysql-db mysql -u root -p
Dockerfile
Dockerfile adalah file teks berisi instruksi langkah demi langkah untuk membangun sebuah Docker image.
Analogi Sederhana
| Dockerfile | Image | Container |
|---|---|---|
| Resep masakan | Hasil masakan | Makanan yang disajikan |
Struktur Dasar Dockerfile
# 1. Base image
FROM php:8.2-cli
# 2. Tentukan direktori kerja di dalam container
WORKDIR /app
# 3. Copy file ke container
COPY . .
# 4. Install dependency
RUN docker-php-ext-install pdo pdo_mysql
# 5. Expose port (opsional)
EXPOSE 8000
# 6. Command saat container dijalankan
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
Contoh Dockerfile Python
FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
Build image dari Dockerfile
docker build -t myapp:latest .
Menjalankan image yang sudah di-build
docker run -d -p 5000:5000 myapp:latest
Docker Compose
Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi multi-container. Dengan Docker Compose, kita bisa menjalankan banyak container dengan satu perintah.
Contoh docker-compose.yml
version: '3.8'
services:
# Web Server
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
# PHP Application
php:
image: php:8.2-fpm
volumes:
- ./html:/usr/share/nginx/html
# Database
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootsecret
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: secret
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
# Redis Cache
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
db_data:
Perintah Docker Compose
Menjalankan semua service:
docker compose up -d
Menghentikan semua service:
docker compose down
Melihat status service:
docker compose ps
Melihat log:
docker compose logs -f
Rebuild dan restart:
docker compose up -d --build
Perbedaan Dockerfile vs Docker Compose
| Aspek | Dockerfile | Docker Compose |
|---|---|---|
| Fungsi | Membuat image | Menjalankan banyak container |
| Isi | Instruksi build | Konfigurasi layanan |
| Perintah | docker build |
docker compose up |
| Use case | Build custom image | Orkestrasi multi-container |
Tips dan Best Practices
1. Gunakan .dockerignore
Buat file .dockerignore untuk mengecualikan file yang tidak perlu:
node_modules
.git
.env
*.log
2. Jangan Jalankan sebagai Root
RUN useradd -m myuser
USER myuser
3. Multi-stage Build
# Build stage
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Runtime stage
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]
4. Gunakan Specific Version Tags
Hindari menggunakan latest, gunakan version spesifik:
FROM node:20.10-alpine # Baik
FROM node:latest # Kurang baik
5. Manfaatkan Build Cache
Urutkan instruksi dari yang paling jarang berubah ke yang paling sering berubah:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./ # Jarang berubah
RUN npm install # Dependency
COPY . . # Sering berubah
CMD ["npm", "start"]
Ringkasan Perintah Penting
# Image
docker pull <image> # Unduh image
docker images # Daftar image
docker rmi <image> # Hapus image
docker build -t name . # Build image
# Container
docker run <image> # Jalankan container
docker ps # Container berjalan
docker ps -a # Semua container
docker stop <id> # Hentikan container
docker rm <id> # Hapus container
docker logs <id> # Lihat log
docker exec -it <id> bash # Masuk container
# Volume & Network
docker volume ls # Daftar volume
docker network ls # Daftar network
# Docker Compose
docker compose up -d # Jalankan semua service
docker compose down # Hentikan semua service
docker compose logs -f # Lihat log semua service
# Cleanup
docker system prune # Bersihkan resource tidak terpakai
Kesimpulan
Docker membantu developer menjalankan aplikasi secara konsisten tanpa perlu khawatir perbedaan environment. Dengan memahami command dasar, Dockerfile, dan Docker Compose, kamu sudah siap menggunakan Docker untuk development maupun deployment.
Konsep Kunci
| Istilah | Penjelasan |
|---|---|
| Dockerfile | Cara membuat image |
| Image | Blueprint aplikasi |
| Container | Aplikasi yang berjalan |
| Docker Compose | Menjalankan banyak container sekaligus |
| Volume | Penyimpanan data persisten |
| Network | Koneksi antar container |
π§ Troubleshooting: Error yang Sering Terjadi
1. Port sudah digunakan
Error: port is already allocated
Solusi:
# Cek apa yang menggunakan port
netstat -ano | findstr :8080
# Gunakan port lain
docker run -d -p 8081:80 nginx
2. Container tidak bisa dihapus
Error: container is running
Solusi:
# Hentikan dulu, lalu hapus
docker stop <container_id>
docker rm <container_id>
# Atau force remove
docker rm -f <container_id>
3. Permission denied (Linux)
Error: permission denied while trying to connect to the Docker daemon
Solusi:
# Tambahkan user ke grup docker
sudo usermod -aG docker $USER
# Logout dan login kembali
4. No space left on device
Error: no space left on device
Solusi:
# Bersihkan semua resource tidak terpakai
docker system prune -a
# Lihat penggunaan disk
docker system df
5. Image tidak ditemukan
Error: image not found
Solusi:
# Pull image terlebih dahulu
docker pull <nama_image>
# Atau cek nama image yang benar
docker images
π Skenario Praktis
Skenario 1: Setup Development Web Server
# Jalankan Nginx untuk development
docker run -d \
--name dev-web \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:alpine
# Edit file di folder html/ dan refresh browser
Skenario 2: Database Sementara untuk Testing
# Jalankan PostgreSQL untuk testing
docker run -d \
--name test-db \
-e POSTGRES_PASSWORD=test \
-e POSTGRES_DB=testdb \
-p 5432:5432 \
postgres:15-alpine
# Connect ke database
docker exec -it test-db psql -U postgres -d testdb
# Hapus setelah selesai (data akan hilang)
docker rm -f test-db
Skenario 3: Menjalankan Aplikasi Node.js
# Struktur folder
# my-app/
# βββ Dockerfile
# βββ package.json
# βββ index.js
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
# Build dan jalankan
docker build -t my-node-app .
docker run -d -p 3000:3000 my-node-app
π Perintah Lengkap (Cheat Sheet)
Image Commands
| Perintah | Fungsi |
|---|---|
docker pull <image> |
Unduh image dari registry |
docker images |
Daftar image lokal |
docker rmi <image> |
Hapus image |
docker build -t <name> . |
Build image dari Dockerfile |
docker tag <id> <new_name> |
Tag image dengan nama baru |
docker push <image> |
Upload image ke registry |
Container Commands
| Perintah | Fungsi |
|---|---|
docker run <image> |
Buat dan jalankan container |
docker ps |
Daftar container berjalan |
docker ps -a |
Daftar semua container |
docker stop <id> |
Hentikan container |
docker start <id> |
Jalankan container yang berhenti |
docker rm <id> |
Hapus container |
docker logs <id> |
Lihat log container |
docker exec -it <id> bash |
Masuk ke container |
docker cp <file> <id>:/path |
Copy file ke container |
Docker Compose Commands
| Perintah | Fungsi |
|---|---|
docker compose up -d |
Jalankan semua service |
docker compose down |
Hentikan dan hapus |
docker compose ps |
Status service |
docker compose logs -f |
Lihat log |
docker compose restart |
Restart service |
docker compose build |
Build ulang image |
π Selamat belajar Docker! Mulailah dengan project kecil dan tingkatkan secara bertahap.