Pernahkah kamu mengalami momen “kok di komputermu jalan, di komputer saya malah error?” Masalah klasik ini hampir selalu disebabkan oleh perbedaan lingkungan: versi Python yang tidak sama, library yang belum terpasang, atau sistem operasi yang berbeda. Docker memecahkan masalah ini dengan mengemas aplikasi beserta seluruh dependensinya ke dalam sebuah container yang bisa berjalan konsisten di mana pun. Dalam tutorial ini kamu akan belajar Docker dari nol — mulai dari memahami konsep image dan container, menjalankan container pertama, menulis Dockerfile untuk aplikasi Python, sampai mengelola beberapa service sekaligus dengan Docker Compose.
Docker adalah platform yang memungkinkan kamu mengemas aplikasi ke dalam unit ringan bernama container. Berbeda dengan virtual machine yang menjalankan satu sistem operasi penuh, container berbagi kernel dengan host sehingga jauh lebih ringan, cepat dinyalakan, dan hemat sumber daya. Hasilnya, kode yang berjalan di laptopmu akan berjalan persis sama di server produksi — inilah yang sering disebut “works on my machine, works everywhere”.
Docker vs Virtual Machine: VM menjalankan OS tamu lengkap di atas hypervisor (butuh memori besar dan waktu boot lama), sedangkan container hanya mengisolasi proses aplikasi di atas kernel host. Karena itu container bisa menyala dalam hitungan detik dan mengonsumsi jauh lebih sedikit RAM.
Sebelum mulai, pastikan Docker sudah terpasang di komputermu. Unduh Docker Desktop untuk Windows dan macOS, atau pasang Docker Engine langsung dari repositori resmi untuk Linux. Setelah selesai, buka terminal dan verifikasi instalasi dengan perintah berikut:
docker --version
docker run hello-world
Perintah docker run hello-world akan mengunduh sebuah image uji coba lalu menjalankannya sebagai container. Jika kamu melihat pesan Hello from Docker!, berarti instalasimu sudah berfungsi dengan benar — dan itu sekaligus menjadi container pertamamu. 🎉
Dua istilah yang paling sering membingungkan pemula adalah image dan container. Anggap image sebagai blueprint atau cetakan — paket read-only berisi sistem file, dependensi, dan konfigurasi aplikasi. Sementara container adalah instance yang sedang berjalan dari image tersebut. Dari satu image yang sama, kamu bisa menjalankan banyak container sekaligus, persis seperti mencetak banyak kue dari satu cetakan.
Kamu bisa menganalogikan image sebagai class dalam pemrograman berorientasi objek, dan container sebagai object (instance) yang dibuat dari class tersebut. Satu class bisa menghasilkan banyak object dengan perilaku yang sama.
Setelah paham konsep dasarnya, mari kita buat image sendiri. Kita akan mengemas sebuah aplikasi web sederhana menggunakan Flask. Jika kamu lebih suka framework modern dan cepat, kamu bisa membaca tutorial Cara Membuat REST API dengan FastAPI terlebih dahulu — prinsip containerisasinya tetap sama untuk framework apa pun.
Buat folder baru bernama flask-docker, lalu buat file app.py dengan isi berikut:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Halo dari dalam container Docker! 🐳"
@app.route("/health")
def health():
return {"status": "ok"}
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Lalu buat file requirements.txt yang berisi dependensi yang dibutuhkan aplikasi:
flask==3.0.3
Dockerfile adalah resep berisi langkah-langkah untuk membangun image. Buat file bernama Dockerfile (tanpa ekstensi) di folder yang sama:
# Gunakan image dasar Python versi ringan
FROM python:3.12-slim
# Tentukan direktori kerja di dalam container
WORKDIR /app
# Salin requirements.txt terlebih dahulu (agar layer cache optimal)
COPY requirements.txt .
# Install dependensi aplikasi
RUN pip install --no-cache-dir -r requirements.txt
# Salin sisa kode aplikasi
COPY app.py .
# Dokumentasikan port yang dipakai aplikasi
EXPOSE 5000
# Perintah yang dijalankan saat container dimulai
CMD ["python", "app.py"]
Setiap baris membuat satu layer. Urutan penting: kita menyalin requirements.txt lalu menjalankan pip install sebelum menyalin app.py. Dengan begitu, selama requirements.txt tidak berubah, hasil instalasi dependensi akan di-cache sehingga proses build menjadi jauh lebih cepat.
Sekarang build image dari Dockerfile, lalu jalankan sebagai container yang memetakan port 5000 milik container ke port 5000 di host:
# Build image dengan tag 'flask-app'
docker build -t flask-app .
# Jalankan container di background, petakan port 5000
docker run -d -p 5000:5000 --name flask-app flask-app
Setelah itu buka http://localhost:5000 di browser. Kamu seharusnya melihat tulisan “Halo dari dalam container Docker! 🐳”. Coba juga endpoint http://localhost:5000/health untuk melihat respons JSON-nya.
Jika aplikasi berhenti atau tidak merespons, periksa log container dengan docker logs flask-app. Penyebab paling umum adalah port 5000 yang sudah dipakai proses lain — solusinya cukup ganti port host, misalnya -p 8080:5000.
Aplikasi nyata biasanya terdiri dari beberapa service, misalnya web server plus database. Daripada menjalankan banyak perintah docker run secara manual, gunakan Docker Compose untuk mendefinisikan semuanya dalam satu file deklaratif bernama docker-compose.yml:
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
volumes:
- .:/app
redis:
image: redis:7-alpine
ports:
- "6379:6379"
File di atas mendefinisikan dua service: web (aplikasi Flask yang di-build dari Dockerfile) dan redis (image resmi dari Docker Hub). Direktif volumes membuat kode lokal tersinkron langsung ke dalam container, sehingga kamu tidak perlu rebuild setiap kali mengubah kode saat development. Jalankan dengan satu perintah:
# Build (jika perlu) dan jalankan semua service
docker compose up
# Jalankan di background
docker compose up -d
# Hentikan semua service
docker compose down
# Melihat container yang sedang berjalan
docker ps
# Melihat semua container (termasuk yang berhenti)
docker ps -a
# Melihat log sebuah container
docker logs -f flask-app
# Masuk ke dalam shell container
docker exec -it flask-app bash
# Menghentikan dan menghapus container
docker stop flask-app
docker rm flask-app
# Melihat daftar image lokal
docker images
# Menghapus image
docker rmi flask-app
Docker tidak hanya untuk aplikasi web. Kamu bisa menjalankan model AI secara lokal lewat image resmi Ollama — baca tutorial menjalankan Small Language Model dengan Ollama untuk melihat betapa praktisnya menjalankan model bahasa di dalam container.
Selamat! Kamu baru saja membangun dan menjalankan aplikasi pertamamu di dalam container Docker. Kamu sudah memahami perbedaan image dan container, menulis Dockerfile yang efisien dengan memanfaatkan layer cache, serta mengelola banyak service menggunakan Docker Compose. Container adalah fondasi dari hampir semua workflow DevOps modern — jika kamu ingin melangkah lebih jauh, lanjutkan dengan Tutorial Terraform untuk Pemula untuk mengelola infrastruktur dengan pendekatan Infrastructure as Code, dan gabungkan keduanya untuk deployment yang benar-benar otomatis.
BengkelKode