Docker Compose Tutorial: Kelola Aplikasi Multi-Kontainer Auto Gampang
Gaes, ngaku deh, siapa di sini yang udah nyaman banget sama Docker buat nge-container-in aplikasi single-nya? Mantap! Tapi pernah ngerasa ribet gak sih pas project-nya makin gede, butuh database, backend, frontend, bahkan microservice lain yang semuanya harus jalan barengan? Nah, di sinilah vibes ribet itu muncul. Mesti docker run satu-satu? Aduh, pegel cuy!
Tenang, gak perlu panik! Ada jagoan kita yang siap bikin hidup kalian auto tenang: Docker Compose! Yup, tools kece ini bakal jadi bestie kalian buat ngatur 'orkestra' aplikasi multi-kontainer biar jalan mulus kayak jalan tol. Skuy, kita spill tuntas gimana caranya!
Apa Itu Docker Compose dan Kenapa Kita Butuh Banget?
Intinya gini gaes, Docker Compose itu semacam 'komandan' yang ngasih instruksi ke Docker buat ngidupin beberapa kontainer sekaligus, ngatur gimana mereka saling ngobrol, dan nge-link satu sama lain. Semua config-nya kalian tulis dalam satu file YAML aja, namanya docker-compose.yml. Jadi, cukup satu command, semua aplikasi kalian langsung ngacir!
Kenapa penting banget? Bayangin deh, punya aplikasi web yang butuh database (misal: PostgreSQL) sama backend (misal: Python Flask). Kalo manual, kalian harus:
docker runbuat kontainer database.docker runlagi buat kontainer backend.- Pastikan keduanya bisa saling komunikasi lewat network.
- Ngurusin port mapping, environment variable, dll. Pusing, kan? Nah, Compose ini nyatuin semua instruksi itu jadi satu script. Auto praktis, ngab! Ini solusi mantap buat development environment yang kompleks atau aplikasi produksi skala kecil-menengah.
docker-compose.yml: 'Kitab Suci' Orkestrasi Kita
Ini dia nih file paling penting di Docker Compose. Semua konfigurasi services (kontainer), network, volume, port, sampe environment variable, tumpah ruah di sini. Kalo diibaratkan, ini blueprint-nya gaes. Makanya, nulis file ini harus teliti ya.
Struktur dasar docker-compose.yml biasanya kayak gini:
version: '3.8' # Versi syntax Docker Compose
services: # Di sini tempat kita definisiin kontainer/service kita
web: # Nama service pertama (misal: aplikasi backend)
build: . # Atau image: nama_image
ports:
- "8000:8000"
environment:
VAR_INI: "nilai_ini"
depends_on:
- db # Service ini butuh 'db' buat jalan
networks:
- app-network
db: # Nama service kedua (misal: database)
image: postgres:13-alpine
environment:
POSTGRES_DB: nama_db
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
volumes: # Definisi volume buat persistent data
db-data:
networks: # Definisi custom network biar kontainer bisa ngobrol
app-network:
driver: bridge
Langkah Demi Langkah Praktis: Aplikasi Flask + PostgreSQL
Skuy, langsung kita praktik biar makin ngena! Kita bakal bikin contoh aplikasi sederhana pake Flask (Python) yang konek ke database PostgreSQL.
Folder Project Kita:
Buat folder baru, misal flask-compose-app, terus di dalamnya ada struktur gini:
flask-compose-app/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
Step 1: Persiapan Aplikasi Flask
Bikin file app.py yang isinya aplikasi Flask kita. Ini cuma aplikasi super simpel buat ngecek koneksi ke PostgreSQL.
app.py:
import os
from flask import Flask
import psycopg2
app = Flask(__name__)
# Konfigurasi koneksi database dari environment variable
DB_HOST = os.getenv('DB_HOST', 'db') # Nama service database di docker-compose.yml
DB_NAME = os.getenv('DB_NAME', 'mydatabase')
DB_USER = os.getenv('DB_USER', 'myuser')
DB_PASSWORD = os.getenv('DB_PASSWORD', 'mypassword')
@app.route('/')
def hello():
try:
# Coba konek ke PostgreSQL
conn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD)
cur = conn.cursor()
cur.execute('SELECT version();') # Query buat dapetin versi DB
db_version = cur.fetchone()[0]
cur.close()
conn.close()
return f"<h1>Hello from Flask!</h1><p>Connected to PostgreSQL successfully! Database version: {db_version}</p>"
except Exception as e:
return f"<h1>Hello from Flask!</h1><p>Failed to connect to PostgreSQL: {e}</p>", 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) # Aplikasi jalan di port 5000
Selanjutnya, kita perlu requirements.txt buat dependensi Python-nya.
requirements.txt:
Flask
psycopg2-binary
Step 2: Bikin Dockerfile untuk Aplikasi Flask
Dockerfile ini buat nge-build image Docker dari aplikasi Flask kita.
Dockerfile:
# Pake base image Python yang ringan
FROM python:3.9-slim-buster
# Bikin direktori kerja di dalam kontainer
WORKDIR /app
# Copy requirements.txt dan install dependensi
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy semua file aplikasi ke direktori kerja
COPY . .
# Set environment variable buat Flask
ENV FLASK_APP=app.py
# Command buat ngejalanin aplikasi Flask
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
Step 3: Nge-config docker-compose.yml
Nah, ini dia intinya! Kita akan definisiin dua service: web (aplikasi Flask) dan db (PostgreSQL).
docker-compose.yml:
version: '3.8' # Pake versi Compose yang paling baru
services:
web:
build: . # Suruh Docker Compose nge-build image dari Dockerfile di direktori saat ini
ports:
- "5000:5000" # Map port 5000 host ke port 5000 kontainer Flask
environment: # Environment variable buat aplikasi Flask
DB_HOST: db # Host database adalah nama service 'db'
DB_NAME: mydatabase
DB_USER: myuser
DB_PASSWORD: mypassword
depends_on:
- db # Service 'web' akan jalan SETELAH service 'db' siap
networks:
- app-network # Ikut jaringan 'app-network'
db:
image: postgres:13-alpine # Pake image PostgreSQL versi 13 yang ringan
environment: # Environment variable buat konfigurasi PostgreSQL
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
volumes:
- db-data:/var/lib/postgresql/data # Mount volume buat data PostgreSQL biar persistent
networks:
- app-network # Ikut jaringan 'app-network'
volumes: # Definisi named volume
db-data: # Volume ini buat nyimpan data PostgreSQL
networks: # Definisi custom bridge network
app-network:
driver: bridge # Jenis jaringan bridge
Step 4: Skuy, Jalankan Aplikasinya!
Udah siap semua file-nya? Gaspol! Buka terminal di folder flask-compose-app, terus jalanin command ini:
docker compose up -d
Penjelasan:
docker compose up: Ini perintah buat bikin dan jalanin semua service yang ada didocker-compose.yml.-d(detach): Biar kontainer jalan di background dan terminal kalian gak ketahan.
Kalo semuanya lancar, kalian bakal liat proses build image dan launching kontainer web sama db.
Buat ngecek status kontainer yang jalan:
docker compose ps
Output-nya bakal nunjukkin kalo service web dan db kalian lagi Up.
Buat liat log dari service tertentu (misal 'web'):
docker compose logs web
Ini berguna banget buat debugging!
Step 5: Test Aplikasi Kita!
Buka browser kalian terus akses http://localhost:5000.
Kalo berhasil, kalian bakal liat tulisan kayak gini:
Hello from Flask!
Connected to PostgreSQL successfully! Database version: PostgreSQL 13.x...
Mantap! Berarti aplikasi Flask kalian udah sukses konek ke database PostgreSQL di kontainer yang berbeda, semua berkat Docker Compose!
Pas udah selesai, buat matiin dan ngehapus kontainer (beserta network dan volume anonymous):
docker compose down
Kalo kalian pengen ngehapus juga named volume (db-data kita), tambahin flag -v:
docker compose down -v
Peringatan: Hati-hati pake -v di production karena bakal ngehapus semua data di volume!
Tips Praktis & Best Practices dari Ngab Senior
- Volume buat Persistent Data: Penting banget pake
volumes(kayakdb-datadi contoh kita) buat nyimpan data yang gak boleh hilang tiap kontainer di-stop atau dihapus. Tanpa volume, data di database kalian bakal hilang tiap kali kontainer DB di-down. - Network itu Kunci Komunikasi: Docker Compose auto bikin default network buat semua service di file yang sama. Tapi, kayak di contoh kita, bikin
networkssecara eksplisit itu best practice. Ini bikin komunikasi antar service lebih rapi dan aman. - Lingkungan Fleksibel pake Environment Variables: Selalu pake
environmentdidocker-compose.ymlbuat konfigurasi aplikasi (kayak kredensial DB) daripada hardcode di dalam kode. Ini bikin aplikasi kalian fleksibel dan gampang diubah config-nya tanpa harus nge-build ulang image. depends_onuntuk Urutan Startup: Gunakandepends_onbuat ngasih tahu Docker Compose urutan start-up service. Contohnya,webkitadepends_ondb, jadidbpasti nyala duluan. Tapi inget, ini cuma ngatur urutan start-up, bukan memastikan service-nya benar-benar siap diakses. Untuk itu, kalian bisa implementasi health checks di aplikasi.restartPolicies: Didocker-compose.yml, kalian bisa tambahinrestart: alwaysataurestart: on-failuredi service biar kontainer auto nyala lagi kalo mati mendadak atau ada error.- Compose untuk Dev vs. Prod: Docker Compose ini jagoan buat development environment karena gampang banget ngatur multi-service. Untuk production skala besar, biasanya orang pake Docker Swarm atau Kubernetes karena punya fitur orkestrasi yang lebih advance (auto-scaling, load balancing, high availability). Tapi buat project kecil, Compose juga oke di production!
- Debugging Kontainer: Kalo mau masuk ke dalam kontainer buat debugging (misal ngecek file atau jalanin command), pake
docker compose exec [nama_service] bash(ataush). Contoh:docker compose exec web bash.
Kesimpulan
Gimana, gaes? Auto kebuka kan pencerahannya tentang Docker Compose? Dari yang tadinya mungkin pusing ngurusin banyak kontainer, sekarang jadi gampang banget cuma pake satu file YAML doang. Vibes coding jadi lebih asik, kan?
Docker Compose ini bener-bener game-changer buat kalian yang sering ngembangin aplikasi multi-kontainer. Dengan tools ini, kalian bisa fokus ke ngoding aplikasi tanpa harus pusing mikirin infrastruktur yang ruwet. Nah, sekarang giliran kalian buat gaspol nge-explore lebih jauh lagi. Coba bikin aplikasi yang lebih kompleks, mainin network config-nya, atau eksplor fitur lain yang ada di Docker Compose. Ini cuma permulaan, perjalanan kalian masih panjang! Keep ngoding, ngab!
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangKata Kunci
Belum ada komentar. Jadilah yang pertama!