Pernahkah kamu mengalami situasi di mana aplikasimu berjalan sempurna di laptop sendiri, tapi error saat dipindah ke server atau komputer orang lain? Docker hadir untuk menyelesaikan masalah klasik ini. Dengan Docker, kamu bisa mengemas aplikasi beserta semua dependensinya ke dalam sebuah container yang bisa berjalan konsisten di mana saja — laptop, server, maupun cloud.

Docker tersedia untuk Windows, macOS, dan Linux. Pastikan kamu menggunakan sistem operasi 64-bit. Untuk Windows, disarankan menggunakan Windows 10/11 dengan WSL 2 (Windows Subsystem for Linux) aktif agar performa Docker lebih optimal.

Apa Itu Docker dan Mengapa Penting?

Docker adalah platform open-source yang memungkinkan kamu membuat, mendistribusikan, dan menjalankan aplikasi di dalam container. Container adalah lingkungan yang terisolasi — ia mengemas kode aplikasi, runtime, library, dan semua konfigurasi yang dibutuhkan menjadi satu paket portabel. Berbeda dengan Virtual Machine (VM) yang menjalankan sistem operasi penuh, container jauh lebih ringan karena berbagi kernel dengan sistem host.

"Docker is the new 'works on my machine' — except it actually works everywhere."

— — Komunitas Developer

Konsep Dasar yang Wajib Dipahami

Sebelum mulai praktik, penting untuk memahami tiga konsep inti Docker: Image, Container, dan Registry. Ketiganya saling berkaitan dan menjadi fondasi dari cara kerja Docker. Memahami perbedaan ketiganya akan membuat perintah-perintah Docker menjadi jauh lebih mudah dipahami.

#
Docker Image

Image adalah blueprint atau template read-only yang berisi instruksi untuk membuat container. Bayangkan image seperti resep masakan — ia mendefinisikan bahan-bahan (dependensi) dan langkah-langkah (konfigurasi) yang dibutuhkan. Satu image bisa digunakan untuk membuat banyak container sekaligus.

#
Langkah tutorial

Container adalah instance yang berjalan dari sebuah image — analogi resepnya: container adalah makanan jadinya. Kamu bisa menjalankan, menghentikan, menghapus, dan membuat banyak container dari image yang sama secara bersamaan.

#
Docker Registry

Registry adalah tempat menyimpan dan mendistribusikan image. Docker Hub adalah registry publik terbesar — di sini kamu bisa menemukan ribuan image siap pakai seperti Nginx, MySQL, Node.js, Python, dan lain-lain. Kamu juga bisa membuat registry privat untuk kebutuhan internal tim.

Langkah 1: Instalasi Docker

Cara termudah untuk menginstal Docker adalah melalui Docker Desktop — aplikasi GUI yang sudah menyertakan Docker Engine, Docker CLI, dan Docker Compose dalam satu installer. Docker Desktop tersedia untuk Windows dan macOS, sedangkan untuk Linux kamu bisa menginstal Docker Engine langsung via package manager.

#
Bash
# Cek versi Docker
docker --version
# Output: Docker version 26.1.1, build 4cf5afa
Download dan instal Docker Desktop

Kunjungi docker.com/products/docker-desktop dan download installer sesuai sistem operasimu. Jalankan installer dan ikuti prosesnya. Untuk Windows, pastikan opsi "Use WSL 2 instead of Hyper-V" dicentang saat proses instalasi.

#
PHP
# Cek versi Docker Compose
docker compose version
Verifikasi instalasi

Setelah instalasi selesai dan Docker Desktop berjalan, buka terminal dan jalankan perintah verifikasi. Jika berhasil, kamu akan melihat versi Docker yang terinstal.

#
PHP
# Jalankan container hello-world
docker run hello-world

# Jika berhasil, kamu akan melihat pesan:
# "Hello from Docker!"
# "This message shows that your installation appears to be working correctly."
Jalankan container pertamamu

Docker menyediakan image "hello-world" khusus untuk memverifikasi bahwa instalasi berjalan dengan benar. Ini adalah cara paling mudah memastikan Docker siap dipakai.

Langkah 2: Perintah Docker Dasar

Docker dioperasikan melalui CLI (Command Line Interface). Ada beberapa perintah inti yang akan kamu gunakan hampir setiap hari. Kuasai perintah-perintah ini dan kamu sudah bisa mengelola container dengan lancar.

#
PHP
# ── MENGELOLA IMAGE ───────────────────────────────────
# Download image dari Docker Hub
docker pull nginx

# Lihat semua image di lokal
docker images

# Hapus image
docker rmi nginx
Mengelola Image

Sebelum menjalankan container, kamu perlu memiliki image-nya. Gunakan docker pull untuk mengunduh image dari Docker Hub, docker images untuk melihat semua image yang sudah ada di lokal, dan docker rmi untuk menghapus image yang tidak diperlukan.

#
Bash
# ── MENJALANKAN CONTAINER ─────────────────────────────
# Jalankan container Nginx (mode foreground)
docker run nginx

# Jalankan di background (-d) + mapping port (-p)
# Port 8080 di host → Port 80 di dalam container
docker run -d -p 8080:80 --name my-nginx nginx

# Buka browser: http://localhost:8080 → Nginx berjalan!
Menjalankan Container

Perintah docker run adalah yang paling penting — ia mengunduh image (jika belum ada) dan langsung menjalankan container. Ada beberapa flag penting yang sering digunakan: -d untuk mode detached (background), -p untuk mapping port, dan --name untuk memberi nama container.

#
Bash
# ── MEMANTAU CONTAINER ────────────────────────────────
# Lihat container yang sedang berjalan
docker ps

# Lihat semua container (termasuk yang sudah berhenti)
docker ps -a

# Hentikan container
docker stop my-nginx

# Jalankan kembali container yang berhenti
docker start my-nginx

# Hapus container (harus dihentikan dulu)
docker rm my-nginx

# Hentikan dan hapus sekaligus
docker rm -f my-nginx
Memantau dan Mengelola Container

Gunakan docker ps untuk melihat container yang sedang berjalan, docker stop untuk menghentikannya, docker start untuk menjalankan kembali, dan docker rm untuk menghapus container yang sudah dihentikan.

Flag -p 8080:80 artinya: port 8080 di komputermu diteruskan ke port 80 di dalam container. Format penulisannya selalu HOST_PORT:CONTAINER_PORT. Kamu bebas mengganti angka 8080 dengan port lain yang tersedia di komputermu.

Langkah 3: Membuat Dockerfile

Dockerfile adalah file teks berisi instruksi step-by-step untuk membangun image Docker kustom. Dengan Dockerfile, kamu bisa mengemas aplikasimu sendiri — bukan hanya menggunakan image siap pakai dari Docker Hub. Ini adalah keterampilan inti yang membedakan pengguna Docker pemula dan yang sudah mahir.

#
Buat struktur project

Mulai dengan membuat folder project dan file-file yang dibutuhkan. Dockerfile harus berada di root folder project. Nama file harus tepat "Dockerfile" tanpa ekstensi apapun.

#
PHP
# Dockerfile untuk aplikasi Node.js sederhana

# 1. Base image — gunakan Node.js versi LTS
FROM node:20-alpine

# 2. Set direktori kerja di dalam container
WORKDIR /app

# 3. Copy file package.json dulu (untuk cache layer)
COPY package*.json ./

# 4. Install dependencies
RUN npm install --production

# 5. Copy semua file source code
COPY . .

# 6. Dokumentasikan port yang digunakan aplikasi
EXPOSE 3000

# 7. Perintah yang dijalankan saat container start
CMD ["node", "server.js"]
Tulis Dockerfile

Setiap Dockerfile dimulai dengan instruksi FROM yang menentukan base image. Kemudian tambahkan instruksi lain seperti WORKDIR (direktori kerja), COPY (menyalin file), RUN (menjalankan perintah saat build), EXPOSE (mendokumentasikan port), dan CMD (perintah yang dijalankan saat container start).

#
Bash
# Build image dengan nama "my-app" dan tag "v1"
docker build -t my-app:v1 .

# Pantau proses build — setiap instruksi di Dockerfile
# akan menjadi satu "layer" yang terlihat di output

# Setelah build selesai, jalankan container-nya
docker run -d -p 3000:3000 --name my-app-container my-app:v1

# Buka browser: http://localhost:3000
Build image dari Dockerfile

Gunakan perintah docker build untuk membangun image dari Dockerfile. Flag -t digunakan untuk memberi nama dan tag pada image. Titik (.) di akhir menunjukkan bahwa Docker akan mencari Dockerfile di direktori saat ini.

Selalu copy package.json dan jalankan npm install SEBELUM meng-copy source code. Ini memanfaatkan layer caching Docker — jika source code berubah tapi dependencies tidak, Docker tidak perlu menjalankan npm install ulang sehingga proses build jauh lebih cepat.

Langkah 4: Menggunakan Docker Compose

Aplikasi modern jarang berdiri sendiri — biasanya terdiri dari beberapa service yang saling terhubung: web server, database, cache, dan lain-lain. Docker Compose memungkinkan kamu mendefinisikan dan menjalankan multi-container application hanya dengan satu file konfigurasi YAML dan satu perintah.

#
Buat file docker-compose.yml

File docker-compose.yml adalah deklarasi dari semua service yang dibutuhkan aplikasimu. Setiap service mendefinisikan image yang digunakan, port mapping, environment variable, dan volume. Taruh file ini di root folder project.

#
Bash
# docker-compose.yml
# Contoh: Aplikasi web + MySQL + phpMyAdmin

services:
  # Service 1: Aplikasi web (dari Dockerfile lokal)
  app:
    build: .
    container_name: my_app
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - DB_PORT=3306
      - DB_NAME=mydb
      - DB_USER=user
      - DB_PASSWORD=secret
    depends_on:
      - db
    restart: unless-stopped

  # Service 2: Database MySQL
  db:
    image: mysql:8.0
    container_name: my_mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: secret
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: unless-stopped

  # Service 3: phpMyAdmin untuk manajemen database via GUI
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: my_phpmyadmin
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
    depends_on:
      - db

# Volume untuk persistensi data MySQL
volumes:
  mysql_data:
Jalankan semua service sekaligus

Satu perintah docker compose up akan membangun semua image yang diperlukan (jika belum ada) dan menjalankan semua container secara bersamaan. Tambahkan flag -d untuk menjalankannya di background.

#
Bash
# Jalankan semua service di background
docker compose up -d

# Lihat status semua service
docker compose ps

# Lihat log semua service (tekan Ctrl+C untuk keluar)
docker compose logs -f

# Lihat log service tertentu saja
docker compose logs -f app

# Hentikan semua service (container tetap ada)
docker compose stop

# Hentikan DAN hapus semua container + network
docker compose down

# Hentikan + hapus container, network, DAN volume
docker compose down -v
Kelola service dengan Docker Compose

Docker Compose menyediakan perintah untuk mengelola lifecycle semua service sekaligus: melihat log, menghentikan, memulai ulang, dan menghapus semua container beserta network-nya.

Langkah 5: Mengelola Data dengan Volume

Secara default, semua data di dalam container bersifat ephemeral — jika container dihapus, datanya ikut hilang. Untuk menyimpan data secara permanen (misalnya data database atau file yang diupload user), kamu perlu menggunakan Volume. Volume adalah mekanisme Docker untuk menyimpan data di luar lifecycle container.

contoh
Bash
# Buat named volume
docker volume create my_data

# Jalankan container dengan volume
# Format: -v NAMA_VOLUME:PATH_DI_CONTAINER
docker run -d \
  -p 5432:5432 \
  -v my_data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  --name my_postgres \
  postgres:16

# Bind mount: hubungkan folder lokal ke container
# Berguna saat development (perubahan file langsung terlihat)
docker run -d \
  -p 3000:3000 \
  -v $(pwd):/app \
  -v /app/node_modules \
  --name dev-server \
  my-app:v1

# Lihat semua volume
docker volume ls

# Hapus volume (hati-hati: data akan hilang!)
docker volume rm my_data

# Hapus semua volume yang tidak dipakai
docker volume prune

Berhati-hatilah dengan perintah docker volume prune dan docker system prune — keduanya akan menghapus data secara permanen dan tidak bisa dibatalkan. Selalu pastikan kamu sudah backup data penting sebelum menjalankan perintah prune.

Langkah 6: Masuk ke Dalam Container

Saat debugging atau eksplorasi, sering kali kamu perlu masuk ke dalam container dan menjalankan perintah langsung di dalamnya — seperti SSH ke server, tapi untuk container. Perintah docker exec memungkinkan kamu menjalankan perintah apapun di dalam container yang sedang berjalan.

contoh
Bash
# Masuk ke dalam container secara interaktif (shell bash)
docker exec -it my-nginx bash

# Jika image tidak punya bash, gunakan sh
docker exec -it my-nginx sh

# Jalankan perintah spesifik tanpa masuk ke shell
docker exec my-nginx ls -la /etc/nginx

# Lihat log container secara realtime
docker logs -f my-nginx

# Lihat resource usage (CPU, RAM) semua container
docker stats

# Inspeksi detail konfigurasi container
docker inspect my-nginx

Cheat Sheet: Perintah Docker Paling Sering Dipakai

Berikut adalah referensi cepat semua perintah Docker yang sudah kita pelajari — plus beberapa perintah bonus yang sangat berguna untuk maintenance dan debugging sehari-hari.

Cheat Sheet
Bash
# ── IMAGE ─────────────────────────────────────────────
docker pull <image>              # Download image
docker images                    # List semua image lokal
docker rmi <image>               # Hapus image
docker build -t <nama>:<tag> .   # Build image dari Dockerfile
docker image prune               # Hapus image yang tidak terpakai

# ── CONTAINER ─────────────────────────────────────────
docker run <image>               # Buat dan jalankan container
docker run -d -p HOST:CONT <img> # Background + port mapping
docker run --name <nama> <image> # Beri nama container
docker ps                        # Container yang berjalan
docker ps -a                     # Semua container
docker stop <container>          # Hentikan container
docker start <container>         # Jalankan container
docker restart <container>       # Restart container
docker rm <container>            # Hapus container
docker rm -f <container>         # Paksa hapus (walau berjalan)

# ── EXEC & LOGS ───────────────────────────────────────
docker exec -it <cont> bash      # Masuk ke container
docker logs <container>          # Lihat log
docker logs -f <container>       # Ikuti log realtime
docker stats                     # Monitor resource usage
docker inspect <container>       # Detail konfigurasi

# ── VOLUME ────────────────────────────────────────────
docker volume create <nama>      # Buat volume
docker volume ls                 # List volume
docker volume rm <nama>          # Hapus volume
docker volume prune              # Hapus volume tidak terpakai

# ── DOCKER COMPOSE ────────────────────────────────────
docker compose up -d             # Jalankan semua service
docker compose down              # Hentikan + hapus container
docker compose down -v           # + hapus volume
docker compose ps                # Status semua service
docker compose logs -f           # Log semua service
docker compose build             # Rebuild semua image

# ── MAINTENANCE ───────────────────────────────────────
docker system df                 # Cek penggunaan disk
docker system prune              # Bersihkan semua yang unused
docker system prune -a           # Termasuk semua image unused

Langkah Selanjutnya

Selamat! Kamu sudah mempelajari fondasi Docker — dari konsep dasar, instalasi, perintah CLI, membuat Dockerfile, menggunakan Docker Compose, mengelola volume, hingga debugging container. Dengan skill ini, kamu sudah bisa mengontainerisasi aplikasimu sendiri dan menjalankannya secara konsisten di environment manapun. Langkah selanjutnya adalah mempelajari Docker Networking lebih dalam, lalu naik level ke Kubernetes untuk orkestrasi container di skala production.

🚀 Cara terbaik belajar Docker adalah langsung praktik: coba kontainerisasi project yang sedang kamu kerjakan — misalnya aplikasi Laravel atau Node.js-mu. Mulai dari membuat Dockerfile, lalu tambahkan database dengan Docker Compose. Dokumentasi resmi Docker di docs.docker.com sangat lengkap dan mudah dipahami sebagai referensi lanjutan.