Data Management in Microservices

Each microservice should manage its own data. Docker allows you to run separate database containers and persist data using volumes — following the database-per-service pattern.


Using Databases in Dockerized Microservices

It’s a best practice to give each microservice its own database. This prevents tight coupling and allows services to evolve independently.

  • PostgreSQL or MySQL for relational data
  • MongoDB or Redis for NoSQL or caching

Persistent Data Storage with Docker Volumes

Use named volumes to persist database data across container restarts:

volumes:
  user-db-data:
  order-db-data:

Then mount volumes in your service definitions:

services:
  user-db:
    image: postgres:14
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: users
    volumes:
      - user-db-data:/var/lib/postgresql/data

Database Per Service Pattern

This architecture ensures:

  • Loose coupling between services
  • Improved scalability and fault isolation
  • Freedom to choose the best database for each service

Example structure:

services:
  user-service:
    build: ./user-service
    depends_on:
      - user-db

  order-service:
    build: ./order-service
    depends_on:
      - order-db

  user-db:
    image: postgres
    volumes:
      - user-db-data:/var/lib/postgresql/data

  order-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - order-db-data:/var/lib/mysql

Using isolated databases and persistent volumes improves reliability and makes microservices more scalable and maintainable. Up next: how to handle service discovery and load balancing in your microservices setup.