使用docker,docker-compose 快速创建MongoDB

       mongoDB 提供的副本集是将数据同步至多个节点,提供了数据冗余备份和节点故障的情况下可以自动转移的高可用特性,架构图如下:
 

有时候需要要在本地搭建一套 mongoDB 副本集环境来做测试,如果用虚拟机的话还是比较麻烦的,这里记录下如何用 docker-compose 快速搭建 mongoDB 副本集。

构建镜像

  1. 准备秘钥用于节点之间的认证
  2. 编写 Dockerfile
  3. 构建镜像
  4. 编写 docker-compose
  5. 启动
  6. 检查
openssl rand -base64 756 > auth.key
FROM mongo:3.4.10
#将秘钥文件复制到镜像中
COPY auth.key /app/auth.key
RUN chown -R mongodb:mongodb /app/auth.key
#设置秘钥文件权限,这一步非常关键
RUN chmod 600 /app/auth.key
docker build -t mongo-replset .

开启三个容器,组成一主两从的副本集集群,另外再开启一个容器监听和初始化副本集,这里我的实现方式并不优雅,就是一直重试直到前面三个 mongod 进程启动完成(官方有个解决方案来检测依赖服务的启动,不过有点麻烦这里就略过了),启动完成之后执行副本集初始化命令:

mongo mongodb://root:123@mongo-1:27011/admin --eval 'rs.initiate({ _id: "rs", members: [{_id:1,host:"mongo-1:27011"},{_id:2,host:"mongo-2:27012"},{_id:3,host:"mongo-3:27013"}]})'
version: "3.1"
services:
  mongo-1:
    image: mongo-replset
    hostname: mongo-1
    restart: always
    ports:
      - 27011:27011
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123
    command:
      - --port
      - "27011"
      - --replSet
      - rs
      - --keyFile
      - /app/auth.key
  mongo-2:
    image: mongo-replset
    hostname: mongo-2
    restart: always
    ports:
      - 27012:27012
    command:
      - --port
      - "27012"
      - --replSet
      - rs
      - --keyFile
      - /app/auth.key
  mongo-3:
    image: mongo-replset
    hostname: mongo-3
    restart: always
    ports:
      - 27013:27013
    command:
      - --port
      - "27013"
      - --replSet
      - rs
      - --keyFile
      - /app/auth.key
  mongo-init:
    image: mongo:3.4.10
    depends_on:
      - mongo-1
      - mongo-2
      - mongo-3
    restart: on-failure:5
    command:
      - mongo
      - mongodb://root:123@mongo-1:27011/admin
      - --eval
      - 'rs.initiate({ _id: "rs", members: [{_id:1,host:"mongo-1:27011"},{_id:2,host:"mongo-2:27012"},{_id:3,host:"mongo-3:27013"}]})'

启动 

docker-compose up -d
Creating mongo-replica_mongo-1_1 ... done
Creating mongo-replica_mongo-3_1 ... done
Creating mongo-replica_mongo-2_1 ... done
Creating mongo-replica_mongo-init_1 ... done

最后一个初始化容器状态退出是正常的 

 

查看副本集状态

docker-compose exec mongo-1 mongo mongodb://root:123@mongo-1:27011/admin --eval 'rs.status()'
MongoDB shell version v3.4.10
connecting to: mongodb://root:123@mongo-1:27011/admin
MongoDB server version: 3.4.10
{
        "set" : "rs",
        "date" : ISODate("2020-03-10T07:01:59.764Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1583823710, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1583823710, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1583823710, 1),
                        "t" : NumberLong(1)
                }
        },
        "members" : [
                {
                        "_id" : 1,
                        "name" : "mongo-1:27011",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 263,
                        "optime" : {
                                "ts" : Timestamp(1583823710, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2020-03-10T07:01:50Z"),
                        "electionTime" : Timestamp(1583823469, 1),
                        "electionDate" : ISODate("2020-03-10T06:57:49Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "mongo-2:27012",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 261,
                        "optime" : {
                                "ts" : Timestamp(1583823710, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1583823710, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2020-03-10T07:01:50Z"),
                        "optimeDurableDate" : ISODate("2020-03-10T07:01:50Z"),
                        "lastHeartbeat" : ISODate("2020-03-10T07:01:59.120Z"),
                        "lastHeartbeatRecv" : ISODate("2020-03-10T07:01:58.109Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "mongo-1:27011",
                        "configVersion" : 1
                },
                {
                        "_id" : 3,
                        "name" : "mongo-3:27013",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 261,
                        "optime" : {
                                "ts" : Timestamp(1583823710, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1583823710, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2020-03-10T07:01:50Z"),
                        "optimeDurableDate" : ISODate("2020-03-10T07:01:50Z"),
                        "lastHeartbeat" : ISODate("2020-03-10T07:01:59.120Z"),
                        "lastHeartbeatRecv" : ISODate("2020-03-10T07:01:58.103Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "mongo-1:27011",
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}

转载:http://monkeywie.cn/2020/03/10/mongodb-replica-set/?utm_source=tuicool&utm_medium=referral

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Compose是一个用于定义和运行多个Docker容器的工具。而MongoDB是一个开源的非关系型数据库管理系统。通过使用Docker Compose,我们可以方便地启动和管理MongoDB容器。 要使用docker-compose启动MongoDB,你可以按照以下步骤进行操作: 1. 首先,在你的项目目录中创建一个Docker Compose文件(通常命名为docker-compose.yml),并在文件中定义MongoDB容器的配置。例如,你可以指定MongoDB的镜像以及需要的环境变量、挂载目录等。 2. 在命令行中,进入Docker Compose文件所在的目录。 3. 运行以下命令启动MongoDB容器:`docker-compose up -d` 这将会根据你在Docker Compose文件中定义的配置,自动下载MongoDB镜像并启动容器。同时,使用`-d`参数可以让容器在后台运行。 关于创建用户和库的操作,你可以在Docker Compose文件中通过定义初始化脚本来实现。在这个初始化脚本中,你可以使用MongoDB的客户端工具(如mongo shell)来执行相应的操作,例如创建用户和库。 综上所述,通过使用Docker Compose,你可以方便地启动和管理MongoDB容器,并通过定义初始化脚本来创建用户和库。希望这些信息对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [docker-compose安装mongoDB详细步骤](https://blog.csdn.net/weixin_43358050/article/details/127430557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [docker compose部署MongoDB教程](https://blog.csdn.net/u011019141/article/details/130651699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值