Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongo container with a replica set with only one node in docker-compose

I want to create a Docker container with an instance of Mongo. In particular, I would like to create a replica set with only one node (since I'm interested in transactions and they are only available for replica sets).

Dockerfile

FROM mongo
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD ["--replSet", "rs0"]

docker-compose.yml

version: "3"
services:
  db:
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - "27017:27017"

If I use the Dockerfile alone everything is fine, while if I use docker-compose it does not work: in fact if I then log to the container I got prompted as rs0:OTHER> instead of rs0:PRIMARY>.

I consulted these links but the solutions proposed are not working:

https://github.com/docker-library/mongo/issues/246#issuecomment-382072843 https://github.com/docker-library/mongo/issues/249#issuecomment-381786889

like image 975
StackUser Avatar asked Apr 28 '20 17:04

StackUser


People also ask

What is a single node replica set?

A single-node replica set would have the oplog which records all changes to its data sets . This means that you'll use more disk space to store the oplog, and also any insert/update operation would be written to the oplog as well (write amplification). It also supports point in time recovery.

What is the maximum number of nodes in a MongoDB replica set?

MongoDB supports replica sets, which can have up to 50 nodes.

How many primary nodes are there in a replica set?

Replica set can have only one primary node.

How do I set up a replica of MongoDB in Docker?

Fortunately, it is easy to establish a Mongo replica set by spinning up a temporary Docker container that runs a shell script to join the other Mongo containers into a cluster. This is the setup we use to deploy RocketChat using Docker, one of the applications that we support for our customers. Here is an excerpt from the docker-compose.yml file.

How many instances of Mongo are there in a docker container?

We are going to have three containers from the Mongo image, which are all inside their own Docker container network. Let’s name them mongo1, mongo2, and mongo3. These will be the three Mongo instances of our replica set.

How many replicas should a production MongoDB be deployed in?

A production MongoDB should be deployed in a replica set of no less than three (3) replicas. One (1) Mongo node is the primary (accepting writes from the application) and the writes are replicated to the other two (2) Mongo nodes which serve as secondaries.

What happens when a primary fails in Docker Compose?

When the failed primary is ready to rejoin the replica set, the data is copied to it from the other two (2) nodes. Many Docker Compose files for various applications rely on one Mongo container, which may be adequate for testing, but does not provide any redundancy or fault tolerance.


1 Answers

This is the compose file I have used for a while now for local development. You can remove the keyfile pieces if you don't need to connect via SSL.

version: "3.8"
services:
  mongodb:
    image : mongo:4
    container_name: mongodb
    hostname: mongodb
    restart: on-failure
    environment:
      - PUID=1000
      - PGID=1000
      - MONGO_INITDB_ROOT_USERNAME=mongo
      - MONGO_INITDB_ROOT_PASSWORD=mongo
      - MONGO_INITDB_DATABASE=my-service
      - MONGO_REPLICA_SET_NAME=rs0
    volumes:
      - mongodb4_data:/data/db
      - ./:/opt/keyfile/
    ports:
      - 27017:27017
    healthcheck:
      test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet) -eq 1
      interval: 10s
      start_period: 30s
    command: "--bind_ip_all --keyFile /opt/keyfile/keyfile --replSet rs0"
volumes:
  mongodb4_data:

It uses Docker's health check (with a startup delay) to sneak in the rs.initiate() if it actually needs it after it's already running.

To create a keyfile.

Mac:

openssl rand -base64 741 > keyfile
chmod 600 keyfile

Linux:

openssl rand -base64 756 > keyfile
chmod 600 keyfile
sudo chown 999 keyfile
sudo chgrp 999 keyfile
like image 144
Hermann Steidel Avatar answered Sep 18 '22 08:09

Hermann Steidel