基于docker的mongodb安装以及PHP使用

说明:用docker基于单服务器,虚拟多个服务器的方案,

一下配置是两个config服务器,两个分片,以及每个分片有一个副本的方案

1、安装docker

#前往阿里云,搜索<容器镜像服务>开启服务

#安装参考阿里云文档
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.320d19912gmHZ6

#开启镜像加速使用阿里云镜像服务器
#进入阿里云<容器镜像服务> -- <镜像中心> -- <镜像加速器>
#按里面的步骤添加配置

2、安装docker-composer

#参考官方文档https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version 

3、启动docker-compose文件

首先启动,这时还没有设置远程账号密码

docker-compose-no-auth.yml

version: '3'
services:

  # config服务器一
  config_one:
    container_name: config_one
    image: mongo:4.1.11
    ports:
      - 27051:27019
    volumes:
      - ./config_one/db:/data/db
      - ./config_one/configdb:/data/configdb
    command: --configsvr --replSet "rs_config" --bind_ip_all
    restart: always

  # config服务器二
  config_two:
    container_name: config_two
    image: mongo:4.1.11
    ports:
      - 27052:27019
    volumes:
      - ./config_two/db:/data/db
      - ./config_two/configdb:/data/configdb
    command: --configsvr --replSet "rs_config" --bind_ip_all
    restart: always

  # 分片一的副本a
  shard_one_a:
    container_name: shard_one_a
    image: mongo:4.1.11
    ports:
      - 27011:27018
    volumes:
      - ./shard_one_a/db:/data/db
      - ./shard_one_a/configdb:/data/configdb
      - ./shard_one_a/backup:/data/backup
    command: --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片二的副本a
  shard_two_a:
    container_name: shard_two_a
    image: mongo:4.1.11
    ports:
      - 27012:27018
    volumes:
      - ./shard_two_a/db:/data/db
      - ./shard_two_a/configdb:/data/configdb
      - ./shard_two_a/backup:/data/backup
    command: --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片一的副本b
  shard_one_b:
    container_name: shard_one_b
    image: mongo:4.1.11
    ports:
      - 27021:27018
    volumes:
      - ./shard_one_b/db:/data/db
      - ./shard_one_b/configdb:/data/configdb
      - ./shard_one_b/backup:/data/backup
    command: --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片二的副本b
  shard_two_b:
    container_name: shard_two_b
    image: mongo:4.1.11
    ports:
      - 27022:27018
    volumes:
      - ./shard_two_b/db:/data/db
      - ./shard_two_b/configdb:/data/configdb
      - ./shard_two_b/backup:/data/backup
    command: --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two
      
  # mongos服务器一
  mongos_one:
    container_name: mongos-one
    image: mongo:4.1.11
    ports:
      - 27001:27017
    volumes:
      - ./mongos_one/db:/data/db
      - ./mongos_one/configdb:/data/configdb
    entrypoint: mongos
    command: --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all
    depends_on:
      - shard_one_a
      - shard_two_a

  # mongos服务器二
  mongos_two:
    container_name: mongos-two
    image: mongo:4.1.11
    ports:
      - 27002:27017
    volumes:
      - ./mongos_two/db:/data/db
      - ./mongos_two/configdb:/data/configdb
    entrypoint: mongos
    command: --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all
    depends_on:
      - shard_one_b
      - shard_two_b

4、配置分片,添加管理员

# 连接到任意一台配置服务器,初始化配置服副本
docker exec -it config_one /bin/bash
mongo --host localhost --port 27019
rs.initiate({
    _id: "rs_config",
    configsvr: true,
    members: [
        { _id : 0, host : "172.19.60.174:27101" },
        { _id : 1, host : "172.19.60.175:27101" }
    ]
});
rs.status()

# 连接到分片一,配置副本a、b
docker exec -it shard_one_a /bin/bash
mongo --host localhost --port 27018

rs.initiate({
    _id: "rs_shard_one_cluster",
    members: [
        { _id : 0, host : "172.19.60.174:27201" },
        { _id : 1, host : "172.19.60.175:27201" }
    ]
});
rs.status()

# 连接到分片二,配置副本a、b
docker exec -it shard_two_a /bin/bash
mongo --host localhost --port 27018

rs.initiate({
    _id: "rs_shard_two_cluster",
    members: [
        { _id : 0, host : "172.19.60.174:27202" },
        { _id : 1, host : "172.19.60.175:27202" }
    ]
});
rs.status()

# 连接到mongos服务器,添加分片
docker exec -it mongos-one /bin/bash
mongo --host localhost --port 27017
sh.addShard("rs_shard_one_cluster/172.19.60.174:27201,172.19.60.175:27201");
sh.addShard("rs_shard_two_cluster/172.19.60.174:27202,172.19.60.175:27202");
sh.status()

docker exec -it mongos-two /bin/bash
mongo --host localhost --port 27017
sh.addShard("rs_shard_one_cluster/172.19.60.174:27201,172.19.60.175:27201");
sh.addShard("rs_shard_two_cluster/172.19.60.174:27202,172.19.60.175:27202");
sh.status()

//为数据库启动分片
sh.enableSharding("test")
//在需要分片的集合上对分片键建索引
//如果集合是空的,可以不创建索引直接进行下一步的分片会自动创建索引
//如果集合不为空,必须为分片建创建索引才行
db.test.ensureIndex({"id":1})

//设置分片键
//其中第一种是基于hash的分片,第二种为基于值的分片
sh.shardCollection( "test.student", { "id" : "hashed" } )
sh.shardCollection("test.teacher", { "id" : 1 } )

//查看片的状态
sh.status();
//查看片状态(完整版);
printShardingStatus(db.getSisterDB("config"),1);
//查看所有的分片服务器状态
db.stats();

//测试分片数据
use test
for (var i = 1; i <= 1000; i++) {
  db.student.insert( { "id" : i , "name": "student" + i } )
}

//分别连接到两个mongos, 分片一主副节点,分片二主副节点,查看是否数据都有
use test
db.student.find().sort({id:1});

//生成管理员账号
docker exec -it mongos-one /bin/bash
mongo --host localhost --port 27017
use admin
db.runCommand({ 
    "createUser" : "qmmg", 
    "pwd" : "qimeng^mongo", 
    "customData" : {

    }, 
    "roles" : [
        {
            "role" : "dbAdminAnyDatabase", 
            "db" : "admin"
        }, 
        {
            "role" : "readWriteAnyDatabase", 
            "db" : "admin"
        }, 
        {
            "role" : "root", 
            "db" : "admin"
        }
    ]
});

5、生成keyfile

//生成keyfile
openssl rand -base64 756 > mongo-keyfile.jks
chmod 400 mongo-keyfile.jks

 

5、配置密钥,使mongodb访问需要带密码

带keyfile的docker-compose-auth.yml

version: '3'
services:

  # config服务器一
  config_one:
    container_name: config_one
    image: mongo:4.1.11
    ports:
      - 27051:27019
    volumes:
      - ./config_one/db:/data/db
      - ./config_one/configdb:/data/configdb
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --keyFile /data/configdb/mongo-keyfile.jks --configsvr --replSet "rs_config" --bind_ip_all
    restart: always

  # config服务器二
  config_two:
    container_name: config_two
    image: mongo:4.1.11
    ports:
      - 27052:27019
    volumes:
      - ./config_two/db:/data/db
      - ./config_two/configdb:/data/configdb
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --keyFile /data/configdb/mongo-keyfile.jks --configsvr --replSet "rs_config" --bind_ip_all
    restart: always

  # 分片一的副本a
  shard_one_a:
    container_name: shard_one_a
    image: mongo:4.1.11
    ports:
      - 27011:27018
    volumes:
      - ./shard_one_a/db:/data/db
      - ./shard_one_a/configdb:/data/configdb
      - ./shard_one_a/backup:/data/backup
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片二的副本a
  shard_two_a:
    container_name: shard_two_a
    image: mongo:4.1.11
    ports:
      - 27012:27018
    volumes:
      - ./shard_two_a/db:/data/db
      - ./shard_two_a/configdb:/data/configdb
      - ./shard_two_a/backup:/data/backup
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_two_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片一的副本b
  shard_one_b:
    container_name: shard_one_b
    image: mongo:4.1.11
    ports:
      - 27021:27018
    volumes:
      - ./shard_one_b/db:/data/db
      - ./shard_one_b/configdb:/data/configdb
      - ./shard_one_b/backup:/data/backup
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --keyFile /data/configdb/mongo-keyfile.jks --shardsvr --replSet "rs_shard_one_cluster" --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two

  # 分片二的副本b
  shard_two_b:
    container_name: shard_two_b
    image: mongo:4.1.11
    ports:
      - 27022:27018
    volumes:
      - ./shard_two_b/db:/data/db
      - ./shard_two_b/configdb:/data/configdb
      - ./shard_two_b/backup:/data/backup
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    command: --shardsvr --replSet "rs_shard_two_cluster" --keyFile /data/configdb/mongo-keyfile.jks --bind_ip_all
    restart: always
    depends_on:
      - config_one
      - config_two
      
  # mongos服务器一
  mongos_one:
    container_name: mongos-one
    image: mongo:4.1.11
    ports:
      - 27001:27017
    volumes:
      - ./mongos_one/db:/data/db
      - ./mongos_one/configdb:/data/configdb
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    entrypoint: mongos
    command:  --keyFile /data/configdb/mongo-keyfile.jks --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all
    depends_on:
      - shard_one_a
      - shard_two_a

  # mongos服务器二
  mongos_two:
    container_name: mongos-two
    image: mongo:4.1.11
    ports:
      - 27002:27017
    volumes:
      - ./mongos_two/db:/data/db
      - ./mongos_two/configdb:/data/configdb
      - ./mongo-keyfile.jks:/data/configdb/mongo-keyfile.jks
    entrypoint: mongos
    command: --keyFile /data/configdb/mongo-keyfile.jks --configdb rs_config/192.168.10.188:27051,192.168.10.188:27052 --bind_ip_all
    depends_on:
      - shard_one_b
      - shard_two_b

  

最后再次启动docker,这时候的mongodb访问就需要账号密码了

docker-compose -f docker-compose-auth.yml up -d

猜你喜欢

转载自www.cnblogs.com/werben/p/11713818.html