docker-compose 一键部署mongodb单机 —— 筑梦之路

话不多说,直接上代码

version: '3.1'
services:
  mongo:
    image: mongo:3.4.24
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: admin123
    volumes:
    - ./data:/data/db
    - ./backup:/data/backup
    #ports:
    #- 27017:27017
  mongo-express:
    image: mongo-express
    restart: always
    ports:  
      - 8081:8081 
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: admin123
      ME_CONFIG_MONGODB_URL: mongodb://root:admin123@mongo:27017/

<think>好的,用户现在问的是如何使用Docker Compose部署MongoDB集群。之前他们遇到了MongoDB事务不支持单机模式的问题,所以这次可能是想搭建一个副本集环境来支持事务。我需要先理解他们的需求,可能是在开发或测试环境中快速搭建一个副本集,避免之前的错误。 首先,用户可能对DockerDocker Compose有一定的了解,但可能不熟悉具体的MongoDB副本集配置。我需要确保步骤清晰,从编写docker-compose.yml文件到初始化副本集都要详细说明。用户可能希望有一个简单直接的方法,避免复杂的配置。 接下来,我需要考虑如何结构化这个回答。可能需要分步骤说明,包括创建Docker Compose文件、配置网络、设置数据卷、环境变量,以及副本集的初始化。还要注意常见的陷阱,比如节点之间的通信,权限问题,或者初始化顺序的问题。 用户可能没有提到的是,他们是否需要数据持久化,所以在示例中应该包含volumes的配置。另外,安全方面,是否需要设置用户名密码?虽然在测试环境中可能不需要,但最好还是提一下,或者给出示例,让用户可以根据需要修改。 另外,初始化副本集的步骤是关键,因为即使容器启动了,如果不执行rs.initiate(),副本集也不会正常工作。可能需要用脚本或者通过进入容器手动执行命令。这里可能需要解释两种方法,或者提供一个自动化脚本的方法,比如使用wait-for-it.sh或其他工具来等待节点就绪后再执行初始化。 还有,网络配置也很重要,确保各个MongoDB实例能够互相通信,使用Docker的自定义网络,并正确设置主机名。可能需要提醒用户检查防火墙或端口设置,特别是如果他们在本地运行,可能需要映射端口到宿主机。 用户可能还想知道如何验证集群是否正常工作,所以需要包括检查副本集状态的命令,比如rs.status()或者通过Mongo Shell连接到其中一个节点。此外,可能还需要提到如何测试故障转移,添加或移除节点等高级操作,但可能超出了当前问题的范围,可以简要提及或提供参考链接。 最后,是否需要考虑版本兼容性?比如使用特定版本的MongoDB镜像,确保Docker Compose的语法兼容性,以及不同MongoDB版本在副本集配置上的差异。比如,用户使用的MongoDB版本是否支持某些特性,或者配置参数是否有变化。 总结一下,回答需要涵盖以下几点: 1. Docker Compose文件的结构和配置,包括服务定义、网络、卷。 2. 环境变量的设置,如副本集名称、端口等。 3. 初始化副本集的步骤,手动或自动化的方法。 4. 验证集群是否正常运行的方法。 5. 可能的常见问题及解决方法,比如节点无法通信,初始化失败等。 6. 安全方面的考虑,如认证和授权(如果需要的话)。 现在需要将这些点组织成一个连贯的步骤指南,确保用户能够按照步骤成功部署MongoDB集群。同时,使用代码块来展示Docker Compose文件和命令,方便用户复制粘贴。可能还需要解释每个部分的作用,帮助用户理解而不仅仅是复制配置。</think>--- ### 使用 Docker Compose 部署 MongoDB 集群(副本集)分步指南 以下是一个完整的 MongoDB 副本集部署方案,适用于开发或测试环境,支持事务功能。 --- ### 1. **创建 Docker Compose 文件** 新建 `docker-compose.yml`,定义 **3个MongoDB节点** 和 **初始化脚本**: ```yaml version: '3.8' services: mongo1: image: mongo:5.0 container_name: mongo1 restart: always ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example MONGO_REPLICA_SET_MODE: primary MONGO_REPLICA_SET_NAME: rs0 volumes: - mongo1_data:/data/db - ./init.js:/docker-entrypoint-initdb.d/init.js networks: - mongo-cluster mongo2: image: mongo:5.0 container_name: mongo2 restart: always ports: - "27018:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example MONGO_REPLICA_SET_MODE: secondary MONGO_REPLICA_SET_NAME: rs0 volumes: - mongo2_data:/data/db networks: - mongo-cluster mongo3: image: mongo:5.0 container_name: mongo3 restart: always ports: - "27019:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example MONGO_REPLICA_SET_MODE: secondary MONGO_REPLICA_SET_NAME: rs0 volumes: - mongo3_data:/data/db networks: - mongo-cluster volumes: mongo1_data: mongo2_data: mongo3_data: networks: mongo-cluster: driver: bridge ``` --- ### 2. **编写副本集初始化脚本** 创建 `init.js` 文件(自动初始化副本集): ```javascript // init.js db = db.getSiblingDB('admin'); db.auth('root', 'example'); // 等待所有节点启动(关键步骤) sleep(5000); // 初始化副本集配置 rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27017" }, { _id: 2, host: "mongo3:27017" } ] }); // 等待副本集选举完成 sleep(10000); ``` --- ### 3. **启动集群** ```bash # 启动服务 docker-compose up -d # 查看日志(确保所有节点正常启动) docker-compose logs -f ``` --- ### 4. **验证副本集状态** ```bash # 连接到主节点(mongo1) docker exec -it mongo1 mongosh -u root -p example # 执行副本集状态检查 rs.status(); ``` 预期输出应包含: ```json { "set": "rs0", "members": [ { "stateStr": "PRIMARY" }, { "stateStr": "SECONDARY" }, { "stateStr": "SECONDARY" } ] } ``` --- ### 5. **测试事务功能** 使用以下代码测试事务(示例为 Node.js): ```javascript const { MongoClient } = require('mongodb'); const uri = 'mongodb://root:example@localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0'; async function testTransaction() { const client = new MongoClient(uri); await client.connect(); const session = client.startSession(); try { await session.withTransaction(async () => { const db = client.db('test'); await db.collection('users').insertOne({ name: 'Alice' }, { session }); await db.collection('logs').insertOne({ event: 'create' }, { session }); }); console.log('事务执行成功'); } finally { await session.endSession(); await client.close(); } } testTransaction(); ``` --- ### 6. **常见问题解决 #### 问题1:节点无法加入副本集 - **检查网络连通性**: ```bash docker exec mongo1 ping mongo2 docker exec mongo1 ping mongo3 ``` - **重新初始化副本集**: 删除旧数据卷并重启服务: ```bash docker-compose down -v docker-compose up -d ``` #### 问题2:认证失败 - **确保环境变量正确**: 检查 `MONGO_INITDB_ROOT_USERNAME` 和 `MONGO_INITDB_ROOT_PASSWORD` 是否一致。 --- ### 7. **扩展配置(可选)** - **持久化数据**: 使用外部卷替代默认的 Docker 卷: ```yaml volumes: mongo1_data: driver: local driver_opts: type: none device: /path/to/host/dir/mongo1 o: bind ``` - **启用分片集群**: 添加 `mongos` 路由器和配置服务器(需更复杂的配置)。 --- ### 总结 通过以上步骤,您可以在 Docker 中快速部署一个支持事务的 MongoDB 副本集。关键点包括: 1. 使用 `replicaSet` 配置明确集群名称 2. 通过初始化脚本自动构建副本集 3. 验证网络连通性和状态一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值