Volume & Network #
Docker Compose tidak hanya berfungsi untuk menjalankan banyak container sekaligus, tetapi juga mengatur bagaimana data disimpan (volume) dan bagaimana container saling berkomunikasi (network). Dua konsep ini sangat krusial untuk aplikasi modern, terutama yang:
- Menggunakan database
- Memiliki banyak service (microservices)
- Membutuhkan data yang persisten
- Berjalan di environment development, staging, hingga production
Artikel ini akan membahas secara mendetail, rinci, dan praktis mengenai Volume dan Network di Docker Compose, lengkap dengan contoh, skenario penggunaan, serta best practice.
Konsep Dasar Docker Compose #
Sebelum masuk lebih jauh, penting memahami bahwa Docker Compose bekerja di atas:
- Docker Engine (container runtime)
- Docker Volume (penyimpanan data)
- Docker Network (virtual networking)
Compose hanya mendeklarasikan semuanya dalam satu file docker-compose.yml, sedangkan eksekusinya tetap dilakukan oleh Docker.
Volume di Docker Compose #
Apa Itu Volume? #
Volume adalah mekanisme penyimpanan data yang terpisah dari lifecycle container. Artinya:
- Container boleh mati
- Container boleh di-recreate
- Data tetap aman
Tanpa volume, semua data di dalam container akan hilang ketika container dihapus.
Jenis Volume di Docker #
1. Named Volume #
Volume yang dikelola sepenuhnya oleh Docker.
volumes:
db-data:
Ciri-ciri:
- Persisten
- Aman untuk production
- Lokasi fisik dikelola Docker
2. Bind Mount #
Mapping langsung ke filesystem host.
volumes:
- ./data:/var/lib/mysql
Ciri-ciri:
- Cocok untuk development
- Mudah di-debug
- Bergantung pada struktur host
3. Anonymous Volume #
Volume tanpa nama eksplisit.
volumes:
- /var/lib/mysql
Ciri-ciri:
- Jarang direkomendasikan
- Sulit dikelola
- Biasanya tidak disengaja
Menggunakan Volume di Docker Compose #
Contoh Database dengan Named Volume #
version: "3.9"
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
Penjelasan:
db-datamenyimpan data MySQL- Container boleh restart tanpa kehilangan data
Volume Scope di Docker Compose #
- Volume didefinisikan di level root
- Digunakan oleh satu atau banyak service
services:
app:
volumes:
- shared-data:/app/data
worker:
volumes:
- shared-data:/worker/data
volumes:
shared-data:
Skenario ini umum untuk:
- App + background worker
- App + migration job
Volume Read-Only #
Untuk keamanan:
volumes:
- ./config:/app/config:ro
Manfaat:
- Mencegah aplikasi menulis ke config
- Mengurangi risiko exploit
Best Practice Volume #
- Gunakan named volume untuk production
- Gunakan bind mount hanya untuk development
- Jangan simpan credential di bind mount
- Gunakan
:rountuk file sensitif - Pisahkan data dan config
Network di Docker Compose #
Apa Itu Network? #
Docker Network memungkinkan container:
- Berkomunikasi satu sama lain
- Menggunakan DNS internal
- Terisolasi dari container lain
Setiap Docker Compose secara default membuat satu network.
Default Network Docker Compose #
Jika tidak didefinisikan:
services:
app:
image: myapp
db:
image: postgres
Docker otomatis membuat:
- Network bridge
- DNS internal
- Hostname = nama service
app bisa mengakses db via:
db:5432
Custom Network #
Mendefinisikan Network #
networks:
backend:
frontend:
Menggunakan Network #
services:
app:
networks:
- backend
- frontend
db:
networks:
- backend
Hasil:
dbtidak bisa diakses langsung dari frontendappmenjadi gateway
Isolasi Network #
Salah satu kekuatan Docker Compose adalah isolasi.
Contoh arsitektur:
- frontend network → web
- backend network → app, db
services:
web:
networks:
- frontend
app:
networks:
- frontend
- backend
db:
networks:
- backend
Manfaat:
- Keamanan meningkat
- Struktur lebih jelas
- Meniru arsitektur production
Expose vs Ports #
expose #
expose:
- "8080"
- Hanya untuk komunikasi internal
- Tidak diekspos ke host
ports #
ports:
- "8080:8080"
- Diekspos ke host
- Bisa diakses dari luar Docker
Best practice:
- Gunakan
exposeuntuk internal service - Gunakan
portshanya untuk entry point
Network Driver #
Umumnya:
networks:
backend:
driver: bridge
Driver lain:
overlay(Docker Swarm)macvlan(advanced networking)
Untuk Docker Compose lokal, bridge sudah cukup.
Multiple Compose Project & Network #
Setiap project Compose:
- Memiliki namespace sendiri
- Network otomatis diberi prefix nama project
Untuk berbagi network:
networks:
shared-net:
external: true
Digunakan untuk:
- API Gateway
- Observability stack
- Reverse proxy (Traefik, Nginx)
Best Practice Network #
- Jangan expose database ke host
- Gunakan multiple network untuk isolasi
- Gunakan nama service sebagai hostname
- Pisahkan frontend & backend network
- Gunakan external network untuk shared infra
Hubungan Volume & Network dalam Arsitektur #
Volume dan network sering digunakan bersamaan:
- Network → komunikasi
- Volume → persistensi data
Contoh umum:
- App ↔ DB (network)
- DB ↔ Disk (volume)
Jika salah satu salah konfigurasi:
- Network buruk → service tidak bisa komunikasi
- Volume buruk → data hilang
Penutup #
Volume dan Network adalah fondasi penting dalam Docker Compose:
- Volume memastikan data aman dan persisten
- Network memastikan service terhubung dengan aman dan terisolasi
Pemahaman yang baik akan dua konsep ini membuat:
- Environment lebih stabil
- Debugging lebih mudah
- Arsitektur lebih mendekati production