Running Multiple Microservices with multiple docker compose with NATS

1.5k views Asked by At

I am new to microservices and I have a project to setup multiple microservies, The project is setup like this. Every nest js application has

  • API Application exposed to a port
  • database
  • docker-compose file responsible which creates the containers for each microservice.

Now what I am doing is to have

Nest JS MICROSERVICE APP 1

- API exposed to port 5000
- Postgres database working on 5432
- NATS running on 4222

NEST JS APP MICROSERVICE 2

- API exposed to port 5001
- Postgres database working on 5433
- NATS not running on 4222 as it is already occupied. If I change the port how I am gonna use the same message broker on both services.

The problem is I wanted to use the same NATS message broker on the second microservice and all the newly created microservice. my docker-compose file for NEST JS APP 1 is as follows.

    version: '3.9'
    services:
      api:
        container_name: nest_app_1
        image: nest_app_1
        build:
          dockerfile: Dockerfile
          context: .
        ports:
          - 127.0.0.1:5000:5000
        env_file:
          - .env
        depends_on:
          - db
          - nats
        networks:
          - main
    
      db:
        container_name: postgres
        image: postgres:latest
        ports:
          - 127.0.0.1:5432:5432           
        volumes:
          - ./data:/var/lib/postgresql/data
        env_file:
          - .env
        networks:
          - main

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    ports:
      - 127.0.0.1:8080:80
    env_file:
      - .env
    networks:
      - main
  
  nats:
    image: nats-streaming:latest
    entrypoint:
      - /nats-streaming-server
      - -cid
      - main_cluster
    ports:
      - "127.0.0.1:4222:4222"
      - "127.0.0.1:6222:6222"
      - "127.0.0.1:8222:8222"
    restart: always
    tty: true
    networks:
      - main

networks:
  main:
    driver: bridge

Second NEST JS microservice docker-compose is as follows

version: '3.9'
services:
  api:
    container_name: nest_app_2
    image: nest_app_2
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - 127.0.0.1:5001:5001
    env_file:
      - .env
    depends_on:
      - app_db_2
    networks:
      - main

  app_db_2:
    container_name: postgres_2
    image: postgres:latest
    ports:
      - 127.0.0.1:5433:5432            
    volumes:
      - ./data:/var/lib/postgresql/data
    env_file:
      - .env
    networks:
      - main

  pgadmin:
    container_name: pgadmin_2
    image: dpage/pgadmin4
    ports:
      - 127.0.0.1:8081:80
    env_file:
      - .env
    networks:
      - main
  nats:
image: nats-streaming:latest
entrypoint:
  - /nats-streaming-server
  - -cid
  - main_cluster
ports:
  - "127.0.0.1:4222:4222"
restart: always
tty: true
networks:
  - main
networks:
  main:
    driver: bridge

Now I want to use NATS to communicate between both apps. So if I publish message from microservice 1 and I subscribe that message to microservice 2 and so on.

1

There are 1 answers

2
aholbreich On

yes, sure the host ports are occupied if you link it through the Host network stack. You can only have one service linked to ip:port

It looks like you trying to start two NATS instances and let them join the same NATS cluster. But maybe you need two instances for development. You just want to see messages passing through it.

Option 1: just put everything in one compose and use depends_on and the same NATS node for both services

Option 2: Use a separate compose stack to provision your NATS infrastructure and use extrnal_links.

Option 3: Define custom network for NATS cluster where every NATS container get's own iP.

But I would start with 1.