# docker_env **Repository Path**: ktianc/docker_env ## Basic Information - **Project Name**: docker_env - **Description**: docker-compose 创建 mysql mongodb redis容器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2023-10-03 - **Last Updated**: 2024-12-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 包括以下容器服务: 1. Mysql 2. MongoDB 3. Redis ## MongoDB 密钥文件官方文档:https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set-with-keyfile-access-control/ 配置文件详解:https://www.mongodb.com/docs/manual/reference/configuration-options/ **Motor 中使用事务** Motor与MongoDB事务一起使用需要MongoDB 4.0及以上版本,并且数据库需要配置为复制集(replica set)模式。 **MongoDB 复制集** MongoDB的复制集(replica set)模式是一种高可用性和数据冗余解决方案 复制集由一组MongoDB实例组成,这些实例维护相同的数据集副本,提供数据冗余和故障转移能力 复制集至少包含一个主节点(primary)和一个或多个从节点(secondary) 在复制集中,主节点负责处理所有写操作,而从节点则从主节点复制数据并保持数据的冗余 ### 启动容器前操作 当启用授权并使用复制集时,MongoDB 需要一个 `security.keyFile` 来进行内部成员之间的认证 所以需要在启动容器前先生成密钥文件 ```shell # 执行目录: cd ./docker_env/mongo/conf # 使用 OpenSSL 或其他工具生成一个 base64 编码的随机字符串作为密钥 openssl rand -base64 756 > keyfileone # 确保密钥文件的权限设置为 400,这意味着只有文件所有者可以读取它 chmod 400 keyfileone # 确保文件所有者是 MongoDB 用户(通常是 UID 999) # 在 Docker 容器中,MongoDB 通常以 UID 999 运行 # 如果不确定,也可以先启动一个没有配置的容器查看一下: # docker run --rm -it mongo:latest --name mongo # docker exec -it mongo id mongodb chown 999:999 keyfileone ``` ### MongoDB 容器创建后操作 启动 MongoDB 容器后,需要初始化复制集 可以通过 MongoDB Shell 连接到 MongoDB 并执行初始化命令,使用以下命令连接到 MongoDB 容器: ```shell # 进入容器 mongosh 控制台 docker exec -it kinit-mongo mongosh -u admin -p 123123 ``` 开始进行初始化操作 ```javascript // 初始化复制集 rs.initiate(); // 强制初始化复制集 rs.reconfig({ _id: "rs0", members: [ { _id: 0, host: "177.8.0.6:27017" } ] }, { force: true }) // 以上 host 中应该为容器ip,但是我填为容器IP后,使用Navicat是正常连接的 // 但是使用 Motor 无法连接,是连接超时,会使用容器IP进行连接 // 我改为使用宿主机IP后连接正常,目前还不知道为什么 // 查看复制集状态 rs.status() // 创建 kinit 数据库 db = db.getSiblingDB('kinit'); // 创建 kinit 用户并赋予权限 db.createUser({ user: 'kinit', pwd: '123123', roles: ["readWrite", "dbAdmin"] }); // 向数据库写入数据,确保数据库完成创建 rs0 [direct: primary] kinit> db.createCollection("exampleCol") // 返回: // { ok: 1 } rs0 [direct: primary] kinit> db.exampleCol.insertOne({version: "0.0.1"}) // 返回: // { // acknowledged: true, // insertedId: ObjectId('66534001b522666ccb2202d8') // } ```