Dua konsep yang sering membingungkan pemula Docker adalah Volume dan Network. Volume menangani masalah data yang hilang saat container dihapus, sementara Network mengatur bagaimana container-container bisa saling berkomunikasi. Keduanya fundamental untuk membangun aplikasi Docker yang nyata.
Docker Volume
Secara default, semua data di dalam container bersifat ephemeral — ketika container dihapus, semua datanya ikut hilang. Ini masalah besar untuk database dan file upload.
Docker Volume memecahkan masalah ini dengan menyimpan data di luar filesystem container, di area yang dikelola oleh Docker di host.
Tiga Jenis Mount di Docker
Host Machine
┌─────────────────────────────────────────┐
│ │
│ /home/user/data ──── Bind Mount │
│ │
│ Docker Area: │
│ /var/lib/docker/volumes/ ── Volume │
│ │
│ RAM ──────────────────── tmpfs Mount │
└─────────────────────────────────────────┘
1. Named Volume (Direkomendasikan untuk Data Persisten)
Dikelola sepenuhnya oleh Docker. Lokasi penyimpanannya di host diatur oleh Docker.
# Buat volume
docker volume create db_data
# Lihat semua volume
docker volume ls
# Inspect volume (lihat detail termasuk lokasi penyimpanan)
docker volume inspect db_data
# Hapus volume
docker volume rm db_data
# Hapus semua volume yang tidak dipakai
docker volume prune
Penggunaan di docker run:
docker run -d \
--name postgres \
-v db_data:/var/lib/postgresql/data \
postgres:16-alpine
Penggunaan di docker-compose.yml:
services:
db:
image: postgres:16-alpine
volumes:
- db_data:/var/lib/postgresql/data # named volume
volumes:
db_data: # deklarasikan di sini
2. Bind Mount (Untuk Development)
Mount langsung dari direktori di host ke container. Cocok untuk development karena perubahan file di host langsung terlihat di container.
# Sintaks -v host_path:container_path
docker run -v /path/di/host:/app node:20 node index.js
# Atau dengan flag --mount yang lebih eksplisit
docker run --mount type=bind,source=$(pwd),target=/app node:20 node index.js
Di docker-compose.yml:
services:
api:
volumes:
- ./src:/app/src # bind mount source code
- /app/node_modules # anonymous volume (jangan bind node_modules)
Catatan: Bind mount di Windows dan macOS lebih lambat dari native Linux karena overhead filesystem translation. Gunakan named volume untuk data yang butuh performa I/O tinggi.
3. tmpfs Mount (Data Sementara di RAM)
Data disimpan di RAM, bukan disk. Hilang saat container berhenti. Cocok untuk data sensitif sementara.
docker run --tmpfs /tmp nginx
Docker Network
Secara default, semua container terisolasi — tidak bisa berkomunikasi satu sama lain kecuali dikonfigurasi. Docker Network menyediakan jaringan virtual yang menghubungkan container.
Jenis-Jenis Network Docker
Bridge Network (Default)
Network default untuk container yang berjalan di satu host. Container dalam bridge network yang sama bisa saling berkomunikasi menggunakan nama container sebagai hostname.
# Buat custom bridge network
docker network create app_network
# Jalankan container di network tertentu
docker run -d --name api --network app_network blog-api
docker run -d --name db --network app_network postgres:16
# Dari container api, bisa ping container db dengan nama "db"
docker exec api ping db
Host Network
Container berbagi network stack langsung dengan host. Tidak ada isolasi network. Biasanya digunakan untuk performance testing atau tool monitoring.
docker run --network host nginx
None Network
Container tidak punya akses network sama sekali. Untuk isolasi penuh.
docker run --network none alpine
Network di Docker Compose
Saat menggunakan Docker Compose, semua service otomatis terhubung dalam satu bridge network dengan nama {project_name}_default. Service bisa berkomunikasi menggunakan nama service sebagai hostname.
services:
api:
build: .
environment:
# Gunakan nama service "db" sebagai hostname, bukan IP
DATABASE_URL: postgresql://user:pass@db:5432/mydb
REDIS_URL: redis://cache:6379
db:
image: postgres:16-alpine
cache:
image: redis:7-alpine
Container api bisa resolve db dan cache sebagai hostname karena Docker DNS menanganinya secara otomatis dalam satu Compose network.
Custom Network di Compose
Pisahkan service ke network berbeda untuk isolasi yang lebih ketat:
services:
frontend:
image: nginx
networks:
- public # bisa diakses publik
api:
build: .
networks:
- public # menerima request dari frontend
- private # bisa akses database
db:
image: postgres:16-alpine
networks:
- private # hanya bisa diakses dari api
networks:
public:
private:
internal: true # tidak punya akses internet keluar
Backup dan Restore Volume
# Backup volume ke file tar
docker run --rm \
-v db_data:/source \
-v $(pwd):/backup \
alpine tar czf /backup/db_backup.tar.gz -C /source .
# Restore volume dari backup
docker run --rm \
-v db_data:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/db_backup.tar.gz -C /target
Troubleshooting Network
# Lihat semua network
docker network ls
# Inspect network (lihat container yang terhubung)
docker network inspect app_network
# Test koneksi antar container
docker exec api ping db
docker exec api curl http://db:5432
# Lihat port yang di-expose container
docker port nama-container
Kesimpulan
Volume dan Network adalah dua pilar infrastruktur Docker yang tidak bisa diabaikan. Volume memastikan data tetap ada meski container dihapus, sementara Network memungkinkan container-container berkomunikasi dengan aman dan terorganisir.
Di artikel berikutnya, kita bahas Docker Registry — cara menyimpan dan mendistribusikan Image Docker ke tim atau server production.
Kiki/🎮🍉⌨️🍩💻