🐳 Docker 🏠
Alur belajar dari nol: halaman ini adalah kursus Docker lengkap — dari konsep container & image (Modul 1), menulis Dockerfile (Modul 2), volume & network (Modul 3), sampai Docker Compose dan studi kasus aplikasi nyata (Modul 4). Materi ini membangun di atas fondasi dari halaman Server Linux — Docker justru ada untuk mengemas apa yang kamu kelola di sana.

Belajar Docker dari Nol sampai Aplikasi Berjalan

Halaman ini adalah modul bacaan lengkap (textbook) untuk menguasai Docker — alat yang mengemas aplikasi beserta lingkungannya ke dalam container yang sama di mana pun ia dijalankan. Kita belajar lewat studi kasus: menjalankan aplikasi web lengkap dengan database memakai Docker Compose.

🐳 4 Modul praktik langsung 📦 Image, Dockerfile, Compose 📖 Bahasa Indonesia, tanpa asumsi pengetahuan awal

1. Container & DockerKonsep sebelum perintah

Sebelum mengetik perintah, pahami dulu mengapa container ada dan apa bedanya image dengan container. Modul ini memberi peta mental yang membuat semua perintah Docker terasa logis.

1.1 Mengapa Perlu Container?

Bayangkan container sebagai kontainer pengiriman: isi berbeda-beda, tapi cara mengangkat, mengangkut, dan menumpuknya sama. Docker adalah kapal dan kran yang mengelola semua kontainer itu.

1.2 Image vs Container

ImageContainer
Biru/cetak biru — template yang tidak berubahContoh berjalan dari image
Tersusun dari layer (lapisan) yang efisienBisa dibuat, dijalankan, dihentikan, dihapus
docker build / docker pulldocker run / docker start / docker stop
Berbagi layer antar image lainData di dalam container hilang saat dihapus (pakai volume)
Analogi klasik: image = kelas (class), container = objek (instance). Satu image bisa melahirkan banyak container sekaligus — mis. 3 container web dari image yang sama.

1.3 Instalasi & Perintah Dasar

Instal Docker Engine (atau Docker Desktop di Windows/macOS). Verifikasi:

docker version
docker info

Perintah dasar yang wajib dikuasai pertama:

Jangan mengetik perintah tanpa paham efeknya. docker rm -f $(docker ps -aq) menghapus semua container — sangat berguna di mesin lab, sangat berbahaya di server produksi.
Lab 1 — Jalankan container pertama
  1. docker run --rm -it hello-world — image uji kecil yang mencetak pesan.
  2. docker run --rm -it ubuntu bash — masuk ke Ubuntu; coba cat /etc/os-release; keluar dengan exit.
  3. docker ps -a — lihat riwayat container. --rm otomatis membersihkan setelah berhenti.

2. Image & DockerfileMembangun image sendiri

Memakai image siap pakai itu mudah; membuat image sendiri adalah keterampilan inti. Modul ini mengajarkan cara menulis Dockerfile yang benar dan membangun image aplikasi sendiri.

2.1 Menarik & Mengelola Image

Selalu gunakan tag spesifik (mis. node:20-alpine) di produksi, bukan latest — latest bisa berubah diam-diam dan merusak aplikasi.

2.2 Menulis Dockerfile

Dockerfile adalah resep langkah-demi-langkah membangun image. Contoh aplikasi Node.js sederhana:

# 1. Dasar: image node versi 20 varian alpine
FROM node:20-alpine

# 2. Direktori kerja di dalam container
WORKDIR /app

# 3. Salin file dependensi dulu (manfaatkan cache layer)
COPY package*.json ./
RUN npm install

# 4. Salin kode aplikasi
COPY . .

# 5. Ekspos port
EXPOSE 3000

# 6. Perintah saat container berjalan
CMD ["node", "index.js"]
Urutan COPY dependensi → RUN install → COPY kode memanfaatkan cache layer: selama package.json tidak berubah, Docker tidak perlu mengulang npm install — mempercepat pembangunan ulang drastis.

2.3 Membangun & Menjalankan

# Bangun image dengan nama 'myapp' dan tag 'v1'
docker build -t myapp:v1 .

# Jalankan container dari image tersebut
# -p 3000:3000 = petakan port host 3000 ke port 3000 container
docker run -d --name app1 -p 3000:3000 myapp:v1

# Lihat log container
docker logs app1
Lab 2 — Image sendiri
  1. Buat folder lab-docker, isi index.js (server HTTP kecil) dan package.json.
  2. Tulis Dockerfile seperti contoh di atas.
  3. Bangun dengan docker build -t lab:v1 ..
  4. Jalankan docker run -d --name lab -p 3000:3000 lab:v1, lalu buka http://localhost:3000.
  5. Ubah kode, bangun ulang, perhatikan kecepatan build berkat cache layer.

3. Volume & NetworkAgar data tahan lama dan container saling bicara

Container itu sementara — data di dalamnya hilang saat dihapus. Volume dan network adalah dua mekanisme yang membuat container berguna dalam dunia nyata: data tahan lama, dan aplikasi terhubung satu sama lain.

3.1 Volume & Bind Mount

JenisDikelola olehKegunaan
Named volumeDocker (di bawah /var/lib/docker/volumes)Data database, file upload — yang paling disarankan
Bind mountAnda (folder host langsung)Development (kode di host langsung terlihat di container)
# Named volume
docker volume create data-db
docker run -d --name db -v data-db:/var/lib/postgresql/data postgres:16-alpine

# Bind mount untuk development
docker run -d --name app -v "$PWD":/app myapp:v1
Data database wajib di volume. Tanpa volume, menghapus container = menghapus seluruh data — kesalahan klasik yang mahal di produksi.

3.2 Network Container

# Buat network
docker network create mynet

# Jalankan dua container di network yang sama
docker run -d --name db --network mynet postgres:16-alpine
docker run -d --name app --network mynet -p 3000:3000 myapp:v1

# Dari dalam app, database dapat diakses sebagai 'db' (bukan IP)
Ingat: di dalam network Docker, nama container = nama host. Aplikasi menghubungi database lewat db, bukan IP — ini membuat konfigurasi stabil meski container dibuat ulang.

3.3 Variabel Lingkungan

docker run -d --name app --network mynet \
  -e DB_HOST=db -e DB_USER=app -e DB_PASS=rahasia \
  myapp:v1
Jangan pernah menaruh kredensial di Dockerfile (terlihat oleh siapa pun yang punya image) atau di kode. Gunakan environment variable + pengelolaan rahasia yang layak.
Lab 3 — Volume & network
  1. Buat network labnet dan volume labdb.
  2. Jalankan Postgres dengan volume dan di network itu.
  3. Jalankan aplikasi dari Lab 2 di network yang sama dengan -e DB_HOST=....
  4. Hapus container database (docker rm -f db), buat ulang, dan buktikan data tetap ada karena volume.

4. Docker Compose & PraktikBanyak layanan, satu perintah

Aplikasi nyata terdiri dari banyak layanan: web, database, cache, worker. Docker Compose mendefinisikan semuanya dalam satu file YAML dan menjalankannya dengan satu perintah.

4.1 Docker Compose

Compose menggantikan rangkaian panjang docker run dengan satu file compose.yaml:

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=rahasia
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:
Compose membuat network otomatis antar layanan — aplikasi cukup memanggil db sebagai host. Satu file, satu perintah, lingkungan pengembangan dan produksi yang konsisten.

4.2 Studi Kasus: App + DB

  1. Buat compose.yaml dengan dua layanan: aplikasi Node dan Postgres.
  2. Aplikasi membaca DB_HOST=db — tanpa IP, hanya nama layanan.
  3. Jalankan docker compose up -d — kedua layanan mulai bersamaan.
  4. Periksa dengan docker compose ps dan docker compose logs -f app.
Contoh nyata: di server produksi, alur deploy menjadi sangat sederhana — git pull, lalu docker compose up -d --build. Rollback semudah men-downgrade tag image dan up -d lagi.

4.3 Tips Deploy & Keamanan

Lab 4 — Compose penuh
  1. Susun proyek: kode aplikasi + Dockerfile + compose.yaml (app + db).
  2. Jalankan docker compose up -d, buka aplikasi, pastikan terhubung ke database.
  3. Simulasikan down: docker compose down, lalu up -d — data harus tetap ada.
  4. Tulis satu Dockerfile dengan USER node untuk aplikasi.

Cek Pemahaman — Docker

  1. Apa beda image dan container?
    Lihat jawaban

    Image adalah template/cetak biru yang tidak berubah; container adalah instance berjalan dari image yang bisa dibuat, dihentikan, dan dihapus.

  2. Mengapa data database harus disimpan di volume?
    Lihat jawaban

    Karena data di dalam filesystem container hilang saat container dihapus; volume menyimpan data di luar siklus hidup container.

  3. Bagaimana container saling memanggil tanpa bergantung IP?
    Lihat jawaban

    Lewat network Docker dan DNS internal: nama container dipakai sebagai nama host (mis. aplikasi memanggil db).

  4. Mengapa urutan COPY/instalasi di Dockerfile penting?
    Lihat jawaban

    Memanfaatkan cache layer: jika dependensi tidak berubah, Docker mengulang instalasi — build menjadi jauh lebih cepat.

  5. Apa fungsi Docker Compose?
    Lihat jawaban

    Mendefinisikan beberapa layanan (app, db, dsb.) dalam satu file YAML dan menjalankannya dengan satu perintah docker compose up.

  6. Mengapa tidak menaruh kredensial di Dockerfile?
    Lihat jawaban

    Karena Dockerfile (dan image) bisa dilihat siapa saja yang memegangnya — gunakan environment variable dan pengelolaan rahasia.

Drill DockerLatihan cepat ingatan

PerintahFungsi
docker build -t nama .Bangun image dari Dockerfile di folder saat ini
docker run -d -p 3000:3000 namaJalankan container di latar belakang, petakan port
docker ps -aDaftar semua container (termasuk yang berhenti)
docker exec -it nama shMasuk ke shell container yang berjalan
docker logs -f namaIkuti log container
docker compose up -dJalankan semua layanan dari compose.yaml
docker compose downHentikan dan hapus layanan (volume tetap)
docker system pruneBersihkan image/container yang tidak dipakai

Cheat Sheet DockerReferensi cepat

KebutuhanPerintah
Image dasarFROM node:20-alpine
Direktori kerjaWORKDIR /app
Salin fileCOPY . .
InstalasiRUN npm install
Perintah startCMD ["node", "index.js"]
Volume-v nama:/path
Network--network nama
Variabel lingkungan-e KEY=value