docker-compose部署mongodb集群

创建keyfile.sh

#!/bin/bash

DATA_PATH=./data
PWD='jdit.com'

function check_directory() {
  if [ ! -d "${DATA_PATH}" ]; then
    echo "directory: ${DATA_PATH} not exists."
  fi
}

function generate_keyfile() {
  mkdir -p "${DATA_PATH}/script"
  cd "${DATA_PATH}/script"
  if [ ! -f "${DATA_PATH}/script/mongo-keyfile" ]; then
    echo 'create mongo-keyfile.'
    openssl rand -base64 745 > mongo-keyfile
    echo "${PWD}" | sudo -S chmod 600 mongo-keyfile
    echo "${PWD}" | sudo -S chown 999 mongo-keyfile
  else
    echo 'mongo-keyfile already exists.'
  fi
}

check_directory
generate_keyfile

创建docker-compose.yml文件

version: '3'
services:
  mongo_shard1:
    image: mongo:latest
    container_name: mongo_shard1
    # --shardsvr: 这个参数仅仅只是将默认的27017端口改为27018,如果指定--port参数,可用不需要这个参数
    # --directoryperdb:每个数据库使用单独的文件夹
    command: mongod --shardsvr --directoryperdb --replSet mongo_shard1 --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/shard1:/data/db
      - ./data/script/mongo-keyfile:/data/mongo-keyfile
    privileged: true
    mem_limit: 1600000000

  mongo_shard2:
    image: mongo:latest
    container_name: mongo_shard2
    command: mongod --shardsvr --directoryperdb --replSet mongo_shard2 --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/shard2:/data/db
      - ./data/script/mongo-keyfile:/data/mongo-keyfile
    privileged: true
    mem_limit: 1600000000

  mongo_shard3:
    image: mongo:latest
    container_name: mongo_shard3
    command: mongod --shardsvr --directoryperdb --replSet mongo_shard3 --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/shard3:/data/db
      - ./data/script/mongo-keyfile:/data/mongo-keyfile
    privileged: true
    mem_limit: 1600000000

  mongo_config1:
    image: mongo:latest
    container_name: mongo_config1
    # --configsvr: 这个参数仅仅是将默认端口由27017改为27019, 如果指定--port可不添加该参数
    command: mongod --configsvr --directoryperdb --replSet fates-mongo-config  --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/config1:/data/configdb
      - ./data/script/mongo-keyfile:/data/mongo-keyfile

  mongo_config2:
    image: mongo:latest
    container_name: mongo_config2
    command: mongod --configsvr --directoryperdb --replSet fates-mongo-config  --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/config2:/data/configdb
      - ./data/script/mongo-keyfile:/data/mongo-keyfile

  mongo_config3:
    image: mongo:latest
    container_name: mongo_config3
    command: mongod --configsvr --directoryperdb --replSet fates-mongo-config  --keyFile /data/mongo-keyfile
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/config3:/data/configdb
      - ./data/script/mongo-keyfile:/data/mongo-keyfile

  mongo-mongos:
    image: mongo:latest
    container_name: mongo_mongos
    # mongo3.6版默认绑定IP为127.0.0.1,此处绑定0.0.0.0是允许其他容器或主机可以访问
    command: mongos --configdb fates-mongo-config/mongo_config1:27019,mongo_config2:27019,mongo_config3:27019 --bind_ip 0.0.0.0 --port 27017 --keyFile /data/mongo-keyfile
    ports:
      - 27017:27017
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/script/mongo-keyfile:/data/mongo-keyfile
    depends_on:
      - mongo_config1
      - mongo_config2
      - mongo_config3

networks:
  default:
    external:
      name: dev_network

创建启动脚本文件start.sh:

#!/bin/sh
mkdir -p ./data/shard1
mkdir -p ./data/shard2
mkdir -p ./data/shard3
mkdir -p ./data/config1
mkdir -p ./data/config2
mkdir -p ./data/config3

mkdir -p ./data/script

docker-compose up -d

#睡眠两分钟,等待mongodb所有容器起来之后将它们配置加入分片
sleep 30s

docker-compose  exec mongo_config1 bash -c "echo 'rs.initiate({_id: \"fates-mongo-config\",configsvr: true, members: [{ _id : 0, host : \"mongo_config1:27019\" },{ _id : 1, host : \"mongo_config2:27019\" }, { _id : 2, host : \"mongo_config3:27019\" }]})' | mongo --port 27019"
docker-compose  exec mongo_shard1 bash -c "echo 'rs.initiate({_id: \"mongo_shard1\",members: [{ _id : 0, host : \"mongo_shard1:27018\" }]})' | mongo --port 27018"
docker-compose  exec mongo_shard2 bash -c "echo 'rs.initiate({_id: \"mongo_shard2\",members: [{ _id : 0, host : \"mongo_shard2:27018\" }]})' | mongo --port 27018"
docker-compose  exec mongo_shard3 bash -c "echo 'rs.initiate({_id: \"mongo_shard3\",members: [{ _id : 0, host : \"mongo_shard3:27018\" }]})' | mongo --port 27018"
docker-compose  exec mongo-mongos bash -c "echo 'sh.addShard(\"mongo_shard1/mongo_shard1:27018\")' | mongo"
docker-compose  exec mongo-mongos bash -c "echo 'sh.addShard(\"mongo_shard2/mongo_shard2:27018\")' | mongo"
docker-compose  exec mongo-mongos bash -c "echo 'sh.addShard(\"mongo_shard3/mongo_shard3:27018\")' | mongo"
docker-compose  exec mongo-mongos bash -c "echo -e 'use admin\n db.createUser({user:\"admin\",pwd:\"admin\",roles:[{role:\"root\",db:\"admin\"}]})' | mongo"

运行脚本文件start.sh,记得第一次启动时执行该文件,以后重启时使用docker-compose自身的命令。

sh start.sh

你可能感兴趣的:(docker,数据库,docker,mongo,docker-compose,mongo集群)