docker-compose部署mongodb副本集群

使用docker-compose首先需要先安装 docker和docker-compose

1、linux安装部署docker

# step 0:卸载旧版本 没有装的可以直接跳过
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
 
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
# Step 3: 更新并安装Docker-CE
sudo yum makecache 
sudo yum -y install docker-ce
 
# Step 4: 开启Docker服务
sudo service docker start
 
# Step 5: 安装校验
docker version

2、linux安装部署docker-compose

# Step 0:拉取镜像(国内镜像源拉取)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# Step 1:赋权,运行一个命令试试是否安装成功
docker-compose
常用docker-compose指令:
1、查看配置命令:docker-compose config
2、后台启动:docker-compose up -d
3、构建镜像:docker-compose bulid
4、下载镜像:docker-compose pull
5、查看运行的镜像:docker-compose ps
6、查看进程:docker-compose top
7、启动已存在的容器命令:docker-compose start
8、停止正在运行的容器命令:docker-compose stop
9、查看服务日志输出:docker-compose logs

3、mongodb的docker-compose.yml

配置文件详解:

1、keyfile:MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集,且副本集所有成员的keyFile内容必须相同。
2、volumes :主要是挂载的文件地址;
3、 chown 999:999 /data/mongodb.key 999用户是容器中的mongod用户,通过chown修改文件用户权限
4、 mongod --replSet mongos --keyFile /data/mongodb.key 启动命令, --replSet mongos 以副本集形式启动并将副本集名字命名为 mongos , --keyFile /data/mongodb.key 设置keyFile,用于副本集通信,文件通过 volumes 映射到容器内
5、networks 创建容器在同一局域网下,容器之间通信;
6、environment:配置环境变量,mongo的账号密码
7、image:拉取的mongo镜像,如果没有提前拉取,再执行docker-compose文件会自动去拉取镜像

生成keyfile命令

# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

docker-compose.yml:

version: '3.1'

services:
  mongodb1:
    image: mongo:latest
    restart: always
    container_name: mongo1
    volumes:
      - ./db/mongo1:/data/db
      - ./db/mongo1/conf/mongo1.conf:/etc/mongod.conf.orig
      - ./mongodb.key:/data/mongodb.key
    ports:
      - 27017:27017
    environment:
      TZ: Asia/Shanghai
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    networks:
      - mongoNetwork
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb2:
    image: mongo:latest
    restart: always
    container_name: mongo2
    volumes:
      - ./db/mongo2:/data/db
      - ./db/mongo2/conf/mongo2.conf:/etc/mongod.conf.orig
      - ./mongodb.key:/data/mongodb.key
    ports:
      - 27018:27017
    environment:
      TZ: Asia/Shanghai
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    networks:
      - mongoNetwork
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@
  mongodb3:
    image: mongo:latest
    restart: always
    container_name: mongo3
    volumes:
      - ./db/mongo3:/data/db
      - ./mongodb.key:/data/mongodb.key
      - ./db/mongo3/conf/mongo3.conf:/etc/mongod.conf.orig
    ports:
      - 27019:27017
    environment:
      TZ: Asia/Shanghai
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    networks:
      - mongoNetwork
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

networks:
  mongoNetwork:
    driver: bridge

PS:挂载的目录最好提前先创建好,注意创建的文件是文件夹还是文件(例如:mongo1.conf是文件而不是文件夹)

4、docker-compose启动mongodb

  1. 切换到docker-compose.yml所在目录,执行命令docker-compose up -d启动数据库,-d 表示后台启动并运行所有的容器。

docker-compose部署mongodb副本集群_第1张图片

2、通过命令 docker exec -it mongo1 /bin/bash 进入容器进行配置;

3、通过 Shell 连接 MongoDB 然后就可以执行mongo中的相应命令 :mongosh -u root -p root

docker-compose部署mongodb副本集群_第2张图片

4、配置副本集,使用 rs.initiate() 触发选举,并选举出一个成员作为primary。

rs.initiate({
    _id: "mongos",
    members: [
        { _id : 0, host : "192.168.0.1:27017" },
        { _id : 1, host : "192.168.0.1:27018" },
        { _id : 2, host : "192.168.0.1:27019" }
    ]
});

5、执行rs.status()就可查看到成员信息

docker-compose部署mongodb副本集群_第3张图片

能看到members就代表初始化成功

5、使用Navicat Premium 15远程连接mongodb

  • 新建mongodb连接

docker-compose部署mongodb副本集群_第4张图片

6、遇到的问题

  • 问题1:

"errmsg" : "no replset config has been received", "code" : 94,

错误原因:未初始化副本集群;

解决方案:使用初始化方法 rs.initiate()

  • 问题2

MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string

错误原因:默认不允许从从节点读取数据,需要做一个配置才可以读取

解决方案:在从节点 执行 rs.secondaryOk()

  • 问题3

ERROR: for mongo1  Cannot start service mongodb1: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/data/db/mongo1/conf/mongo1.conf" to rootfs at "/etc/mongod.conf.orig": mount /data/db/mongo1/conf/mongo1.conf:/etc/mongod.conf.oRecreating mongo2 ... error
xists and is the expected type

错误原因:在/data/db/mongo1/conf/mongo1.conf目录下创建的mongo1.conf是文件夹而不是.conf文件;

你可能感兴趣的:(docker,容器,mongodb)