Sharing Data #
Salah satu kekuatan utama Docker adalah kemampuannya menjalankan banyak container secara terisolasi namun tetap bisa saling berbagi data jika dibutuhkan. Dalam praktik nyata, hampir tidak ada aplikasi modern yang benar-benar berdiri sendiri. Biasanya ada kombinasi web server, database, cache, worker, dan service lain yang semuanya perlu mengakses data tertentu secara bersama.
Tanpa mekanisme sharing data yang benar, kita bisa menghadapi masalah seperti:
- Data hilang saat container mati
- Data tidak konsisten antar service
- Sulit melakukan backup dan migrasi
Docker menyediakan beberapa pendekatan resmi dan terstruktur untuk melakukan sharing data antar container, masing-masing dengan karakteristik, kelebihan, dan trade-off tersendiri.
Diagram Konsep Sharing Data Antar Container #
Diagram berikut menggambarkan dua container yang berbagi data melalui Docker Volume:
+-------------------+ +-------------------+
| Container A | | Container B |
| | | |
| /app/data | | /var/data |
| | | | | |
+-------|-----------+ +-------|-----------+
| |
+----------- Volume ---------+
(Docker Volume)
Pada diagram di atas:
- Container A dan Container B memiliki filesystem masing-masing
- Keduanya meng-mount Docker Volume yang sama
- Perubahan data di volume akan langsung terlihat oleh kedua container
Mengapa Dibutuhkan? #
Beberapa use case umum:
Web Server & Application Server Web server (Nginx) membaca file static yang dihasilkan oleh application container.
Application & Database Data database perlu disimpan secara persisten dan dapat diakses ulang meskipun container database direstart.
Producer & Consumer (Worker) Satu container menulis file, container lain memproses file tersebut.
Logging & Monitoring Banyak container menulis log ke satu lokasi yang sama.
Metode Sharing Data Antar Container #
Secara umum, ada tiga pendekatan utama:
- Docker Volume (recommended)
- Bind Mount
- Volume Container (legacy / pattern lama)
Mari kita bahas satu per satu secara mendalam.
Docker Volume #
Apa itu Docker Volume? #
Docker Volume adalah mekanisme resmi Docker untuk menyimpan dan berbagi data yang dikelola langsung oleh Docker Engine.
Ciri utama:
- Disimpan di host (biasanya
/var/lib/docker/volumes) - Tidak terikat lifecycle container
- Bisa di-mount ke banyak container
- Aman untuk production
Cara Kerja Docker Volume #
- Docker membuat volume terpisah dari filesystem container
- Container hanya melihat hasil mount, bukan lokasi fisik di host
- Docker mengatur permission, lifecycle, dan cleanup
Contoh Penggunaan #
Membuat volume:
docker volume create shared-data
Menggunakan volume di dua container:
docker run -d \
--name app1 \
-v shared-data:/app/data \
my-app-image
docker run -d \
--name app2 \
-v shared-data:/var/data \
my-worker-image
Sekarang:
- File yang ditulis
app1di/app/data - Bisa langsung dibaca oleh
app2di/var/data
Kelebihan Docker Volume #
- ✅ Direkomendasikan untuk production
- ✅ Lifecycle data terpisah dari container
- ✅ Mudah di-backup dan restore
- ✅ Bisa digunakan lintas container dan service
Kekurangan Docker Volume #
- ❌ Lokasi fisik di host tidak transparan
- ❌ Perlu tooling tambahan untuk inspect data langsung
Bind Mount #
Apa itu Bind Mount? #
Bind mount adalah teknik me-mount direktori host langsung ke container.
Diagram sederhananya:
Host Directory (/data/shared)
|
v
+-------------------+
| Container A |
| /app/data |
+-------------------+
Contoh Penggunaan Bind Mount #
docker run -d \
--name app1 \
-v /data/shared:/app/data \
my-app-image
Container lain:
docker run -d \
--name app2 \
-v /data/shared:/var/data \
my-worker-image
Kelebihan Bind Mount #
- ✅ Sangat fleksibel
- ✅ Mudah untuk development
- ✅ Bisa langsung melihat file di host
Kekurangan Bind Mount #
- ❌ Bergantung pada struktur filesystem host
- ❌ Lebih rawan error permission
- ❌ Kurang portable
- ❌ Tidak ideal untuk production
Kapan Bind Mount Digunakan? #
- Local development
- Hot reload source code
- Debugging
Volume Container (Legacy Pattern) #
Apa itu Volume Container? #
Volume container adalah pola lama di mana satu container khusus dibuat hanya untuk menyimpan volume, lalu container lain menggunakan volume tersebut.
Contoh:
docker create \
--name data-container \
-v /shared-data \
busybox
Container lain:
docker run -d \
--volumes-from data-container \
my-app-image
Status Saat Ini #
- ⚠️ Sudah jarang digunakan
- ⚠️ Tidak direkomendasikan untuk arsitektur modern
- ⚠️ Digantikan oleh Docker Volume
Sharing Data di Docker Compose #
Dalam praktik nyata, sharing data hampir selalu dilakukan lewat Docker Compose.
Contoh docker-compose.yml #
version: "3.9"
services:
app:
image: my-app
volumes:
- shared-data:/app/data
worker:
image: my-worker
volumes:
- shared-data:/var/data
volumes:
shared-data:
Keuntungan:
- Definisi volume jelas
- Mudah dikelola
- Reproducible
Best Practice #
Gunakan Docker Volume untuk Production Hindari bind mount kecuali untuk development.
Pisahkan Data dan Logic Container seharusnya stateless, data disimpan di volume.
Perhatikan Permission & Ownership Pastikan user di dalam container memiliki akses ke volume.
Jangan Gunakan Volume untuk Komunikasi Real-Time Untuk komunikasi antar service, gunakan:
- HTTP / gRPC
- Message Queue
- Event Streaming
Backup Volume Secara Berkala Volume adalah aset paling berharga di sistem containerized.
Kesimpulan #
Sharing data antar container adalah konsep fundamental dalam Docker dan arsitektur aplikasi modern. Docker menyediakan beberapa mekanisme, namun Docker Volume adalah solusi paling aman, fleksibel, dan direkomendasikan untuk hampir semua kebutuhan production.
Dengan memahami perbedaan antara Docker Volume, Bind Mount, dan pola lama seperti Volume Container, kita bisa merancang sistem yang:
- Lebih stabil
- Mudah dirawat
- Aman dari kehilangan data