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-data menyimpan 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 :ro untuk 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:

  • db tidak bisa diakses langsung dari frontend
  • app menjadi 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 expose untuk internal service
  • Gunakan ports hanya 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact