7 menit baca

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.