tutorial, docker,

Docker Volume dan Network: Data Persisten dan Komunikasi Antar Container

Kiki/🎮🍉⌨️🍩💻 Kiki/🎮🍉⌨️🍩💻 Sep 01, 2026 · 5 mins read
Docker Volume dan Network: Data Persisten dan Komunikasi Antar Container
Share this

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/🎮🍉⌨️🍩💻
Written by Kiki/🎮🍉⌨️🍩💻
hello I'm friend K.