How to simply set up Mongo's replica set locally with Docker

Trying to add MongoDB’s change stream support to my Go code I’ve find out it needs a replica set. Here is a quick tip how to set RS up on your local machine with Docker.

Before all, you’ll need the docker compose installed at your PC.

Check how to install it here

  • First step

Make a compose file docker-compose.yml with a following content:

version: "3"
services:
  mongo0:
    hostname: mongo0
    container_name: mongo0
    image: mongo
    ports:
      - 27017:27017
    command: --bind_ip_all --replSet rs0
    restart: always
  mongo1:
    hostname: mongo1
    container_name: mongo1
    image: mongo
    ports:
      - 27018:27017
    command: --bind_ip_all --replSet rs0
    restart: always
  mongo2:
    hostname: mongo2
    container_name: mongo2
    image: mongo
    ports:
      - 27019:27017
    command: --bind_ip_all --replSet rs0
    restart: always
  • Up containers

Now just say docker-compose up -d to start three instances of the MongoDB. Compose will make a network for these three containers so we don’t need to deal with this by ourself.

Look at the ports - each container exposes port from 27017(standart) to 27019 to the outer world. In our case outer - it’s your local machine.

From this moment you can connect to every instance of MongoDB inside Docker’s network.

Now let’s make our three containers to wark as a replica set.

  • Set up replica set

Connect to mongo shell at our primary container.

Say docker exec -it mongo0 mongo.

Type inside a shell

  1. config={"_id":"rs0","members":[{"_id":0,"host":"mongo0:27017"},{"_id":1,"host":"mongo1:27017"},{"_id":2,"host":"mongo2:27017"}]}
  2. rs.initiate(config)

And that’s it.

If you connect to each container, you’ll see rs0:PRIMARY> prompt at mongo0, and rs0:SECONDARY> at others two.

Now you can connect your code to replica set using a DSN string like this:

mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0