web-dev-qa-db-fra.com

réplique Set mongo docker-compose

J'essaie de configurer un mongodb replicaSet en utilisant docker-compose, mais lorsque j'arrête le conteneur principal, il semble qu'il ne passe pas au secondaire.

redis:
 image: redis
 ports:
  - "6379:6379"

mongo3:
 hostname: mongo3
 image: mongo
 entrypoint: [ "/usr/bin/mongod", "--replSet", "rs", "--journal","--dbpath","/data/db","--smallfiles", "--rest" ]
 volumes:
  - ./data/mongo3:/data/db
 ports:
  - "27018:27017"
  - "28018:28017"
 restart: always

mongo2:
 hostname: mongo2
 image: mongo
 entrypoint: [ "/usr/bin/mongod", "--replSet", "rs", "--journal","--dbpath","/data/db","--smallfiles", "--rest" ]
 volumes:
  - ./data/mongo2:/data/db
 ports:
  - "27019:27017"
  - "28019:28017"
 restart: always

mongo1:
 hostname: mongo1
 image: mongo
 entrypoint: [ "/usr/bin/mongod", "--replSet", "rs", "--journal","--dbpath","/data/db","--smallfiles", "--rest" ]
 volumes:
  - ./data/mongo1:/data/db
ports:
  - "27017:27017"
  - "28017:28017"
links:
 - mongo2:mongo2
 - mongo3:mongo3
restart: always

web:
 build: .
 ports:
  - "2000:2000"
 volumes:
  - .:/vip
 links:
  - redis
  - mongo1
  - mongo2
  - mongo3

nginx:
 restart: always
 build: ./nginx/
 ports:
  - "80:80"
 links:
  - web:web

mongosetup:
 image: mongo
 links:
  - mongo1:mongo1
  - mongo2:mongo2
  - mongo3:mongo3
 volumes:
  - ./scripts:/scripts
 entrypoint: [ "/scripts/setup.sh" ]

setup.sh:

#!/bin/bash

MONGODB1=`ping -c 1 mongo1 | head -1  | cut -d "(" -f 2 | cut -d ")" -f 1`
MONGODB2=`ping -c 1 mongo2 | head -1  | cut -d "(" -f 2 | cut -d ")" -f 1`
MONGODB3=`ping -c 1 mongo3 | head -1  | cut -d "(" -f 2 | cut -d ")" -f 1`

echo "**********************************************" ${MONGODB1}
echo "Waiting for startup.."
until curl http://${MONGODB1}:28017/serverStatus\?text\=1 2>&1 | grep uptime | head -1; do
  printf '.'
  sleep 1
done

echo curl http://${MONGODB1}:28017/serverStatus\?text\=1 2>&1 | grep uptime | head -1
echo "Started.."


echo SETUP.sh time now: `date +"%T" `
mongo --Host ${MONGODB1}:27017 <<EOF
var cfg = {
    "_id": "rs",
    "version": 1,
    "members": [
        {
            "_id": 0,
            "Host": "${MONGODB1}:27017",
            "priority": 2
        },
        {
            "_id": 1,
            "Host": "${MONGODB2}:27017",
            "priority": 0
        },
        {
            "_id": 2,
            "Host": "${MONGODB3}:27017",
            "priority": 0
        }
    ],settings: {chainingAllowed: true}
};
rs.initiate(cfg, { force: true });
rs.reconfig(cfg, { force: true });
rs.slaveOk();
db.getMongo().setReadPref('nearest');
db.getMongo().setSlaveOk(); 
EOF
12
Kira Layto

Avec MongoDB 4.0, vous n'avez pas besoin d'un quatrième conteneur pour exécuter un script de configuration. Il est très simple de faire apparaître un replicaSet de 3 conteneurs:

version: "3"
services:
  mongo1:
    hostname: mongo1
    container_name: localmongo1
    image: mongo:4.0-xenial
    expose:
      - 27017
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  mongo2:
    hostname: mongo2
    container_name: localmongo2
    image: mongo:4.0-xenial
    expose:
      - 27017
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  mongo3:
    hostname: mongo3
    container_name: localmongo3
    image: mongo:4.0-xenial
    expose:
      - 27017
    restart: always
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]

Plus d'informations ici: https://github.com/msound/localmongo/tree/4.

6
msound

Je vous conseillerais de jeter un œil à khezen/mongo .

Vous pouvez déployer un jeu de répliques mongo sur un essaim de dockers à 3 nœuds avec les éléments suivants:

version: '3'

services:

  replica1:
    image: khezen/mongo:slim
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
      palcement:
        node.hostname: node-1
    environment:
      RS_NAME: shard1
      SHARD_SVR: 'y'
      AUTH: 'y'
    volumes:
      - /data/mongo/replica1:/data/db
    networks:
      - mongo_cluster

  replica2:
    image: khezen/mongo:slim
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
      palcement:
        node.hostname: node-2
    environment:
      RS_NAME: shard1
      SHARD_SVR: 'y'
      AUTH: 'y'
    volumes:
      - /data/mongo/replica2:/data/db
    networks:
      - mongo_cluster

  replica3:
    image: khezen/mongo:slim
    deploy:
      mode: replicated
      replicas: 1
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure
      palcement:
        node.hostname: node-3
    environment:
      RS_NAME: shard1
      SHARD_SVR: 'y'
      MASTER: replica3
      SLAVES: replica1 replica2
      AUTH: 'y'
    volumes:
      - /data/mongo/replica3:/data/db
    networks:
      - mongo_cluster

networks:
  mongo_cluster:
    driver: overlay

avis de non-responsabilité: Je suis le mainteneur de cette image.

3
Guillaume Simonneau

J'ai mis en place un Gist avec un guide sur la façon de le configurer à l'aide d'un fichier docker-compose et d'une mangouste. https://Gist.github.com/harveyconnor/518e088bad23a273cae6ba7fc4643549

0
Harvey Connor