1. docker pull mongo
  2. docker network create mongors-cluster
  3. docker network ls
  4. docker run --name=mongodb1 --restart=always --log-opt max-size=1000m -d \
  5. -p 27017:27017 \
  6. -v /data/mongodb/data1:/data/db \
  7. --net mongors-cluster \
  8. mongo --replSet "rs"
  9. docker run --name=mongodb2 --restart=always --log-opt max-size=1000m -d \
  10. -p 27018:27017 \
  11. -v /data/mongodb/data2:/data/db \
  12. --net mongors-cluster \
  13. mongo --replSet "rs"
  1. echo "# mongod.conf
  2. storage:
  3. dbPath: /data/db
  4. journal:
  5. enabled: true
  6. systemLog:
  7. logAppend: true
  8. net:
  9. bindIp: 0.0.0.0
  10. port: 27017
  11. replication:
  12. replSetName: rs
  13. security:
  14. authorization: enabled
  15. keyFile: /data/autokey
  16. setParameter:
  17. enableLocalhostAuthBypass: true
  18. " > /data/mongodb/mongo1/mongod.conf
  19. cp /data/mongodb/mongo1/mongod.conf /data/mongodb/mongo2/mongod.conf
  20. openssl rand -base64 756 > /data/mongodb/mongo1/autokey
  21. chmod 400 /data/mongodb/mongo1/autokey
  22. cp /data/mongodb/mongo1/autokey /data/mongodb/mongo2/autokey
  23. chown 999 /data/mongodb/mongo1/autokey /data/mongodb/mongo2/autokey
  24. docker run --name=mongodb1 --restart=always --log-opt max-size=1000m -d \
  25. -p 27017:27017 \
  26. -v /data/mongodb/mongo1:/data \
  27. -v /data/mongodb/mongo1/db:/data/db \
  28. -v /data/mongodb/mongo1/configdb:/data/configdb \
  29. --net mongors-cluster \
  30. mongo --config /data/mongod.conf
  31. docker run --name=mongodb2 --restart=always --log-opt max-size=1000m -d \
  32. -p 27018:27017 \
  33. -v /data/mongodb/mongo2:/data \
  34. -v /data/mongodb/mongo2/db:/data/db \
  35. -v /data/mongodb/mongo2/configdb:/data/configdb \
  36. --net mongors-cluster \
  37. mongo --config /data/mongod.conf
  38. # enableLocalhostAuthBypass用于完全没有用户定义但在MongoDB上启用了auth并且您根本不想连接的情况.
  39. # 它并不意味着完全关闭localhost的身份验证.
  40. # 只要您定义了用户,则enabledLocalhostAuthBypass将不执行任何操作,您必须先进行身份验证.
  41. # 第一次登录: 定义用户前
  42. $ docker exec -it mongodb1 mongo
  43. # 第二次登录: 定义用户后
  44. $ docker exec -it mongodb1 mongo -u root -p mongors123456
  45. # URI连接字符串
  46. mongodb://user:pass@ip1:port1,ip2:port2/?authSource=admin&replicaSet=rs&readPreference=primary&appname=MongoDB%20Compass&ssl=false
  47. mongodb://root:mongors123456@127.0.0.1:27017,127.0.0.1:27018/?authSource=admin&replicaSet=rs&readPreference=primary&appname=MongoDB%20Compass&ssl=false
  1. #1 error
  2. std::exception::what(): boost::filesystem::status: Permission denied: "/data/mongod.conf"
  3. Actual exception type: boost::filesystem::filesystem_error
  4. #fix 映射到 /data 的目录必须把所有者设置成 999(mongodb)
  5. # -v $HOME/docker/mongo/mongo1:/data
  6. chown 999 $HOME/docker/mongo/mongo1
  7. chmod 770 $HOME/docker/mongo/mongo1
  8. #2 error
  9. "error":{"code":30,"codeName":"InvalidPath","errmsg":"permissions on /data/autokey are too open"}
  10. #fix 因为权限太大,需要降低权限
  11. chmod 600 $HOME/docker/mongo/mongo1/autokey
  12. #3 error
  13. "error":{"code":30,"codeName":"InvalidPath","errmsg":"error opening file: /data/autokey: bad file"}
  14. #fix autokey 文件的所有者必须是 999(mongodb)
  15. chown 999 $HOME/docker/mongo/mongo1/autokey
  16. #4 error
  17. "msg":"Read security file failed","attr":{"error":{"code":30,"codeName":"InvalidPath","errmsg":"Error reading file /home/admin/data/mongo1/autokey: No such file or directory"}}
  18. 大概率是配置文件里写了错误的路径
docker inspect mongodb1
docker inspect mongodb1 | grep IPAddress
docker update --restart=always mongodb1 mongodb2
docker restart mongodb1 mongodb2
docker stop mongodb1 mongodb2 && docker rm mongodb1 mongodb2

mongo --host 172.18.0.2 --port 27017 -u root -p mongors123456
--smallfiles --oplogSize 128
# 启动副本集
> rs.initiate({
  "_id" : "rs",
  "members" : [
    {"_id": 0, "host": "mongodb1:27017"},
    {"_id": 1, "host": "mongodb2:27017"},
  ]
})
{ "ok" : 1 }

> rs.initiate({
  "_id" : "rs",
  "members" : [
    {"_id": 0, "host": "127.0.0.1:27017"},
    {"_id": 1, "host": "127.0.0.1:27018"},
  ]
})
{ "ok" : 1 }

> rs.initiate({
  "_id" : "rs",
  "members" : [
    {"_id": 0, "host": "mongo1:27017"},
    {"_id": 1, "host": "mongo2:27017"},
  ]
})
{ "ok" : 1 }

rs:SECONDARY>
rs:PRIMARY>

rs:SECONDARY> rs.slaveOk()
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.

rs:SECONDARY> rs.secondaryOk()
# 创建用户必须在主节点和admin库上
rs:PRIMARY> rs.isMaster()
{
    "topologyVersion" : {
        "processId" : ObjectId("616fe12aae8ca456ca2144af"),
        "counter" : NumberLong(6)
    },
    "hosts" : [
        "mongo1:27017",
        "mongo2:27017"
    ],
    "setName" : "rs",
    "setVersion" : 1,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "mongo2:27017",
    "me" : "mongo2:27017",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "lastWrite" : {
        "opTime" : {
            "ts" : Timestamp(1634723214, 1),
            "t" : NumberLong(1)
        },
        "lastWriteDate" : ISODate("2021-10-20T09:46:54Z"),
        "majorityOpTime" : {
            "ts" : Timestamp(1634723214, 1),
            "t" : NumberLong(1)
        },
        "majorityWriteDate" : ISODate("2021-10-20T09:46:54Z")
    },
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 100000,
    "localTime" : ISODate("2021-10-20T09:46:54.781Z"),
    "logicalSessionTimeoutMinutes" : 30,
    "connectionId" : 16,
    "minWireVersion" : 0,
    "maxWireVersion" : 13,
    "readOnly" : false,
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1634723214, 1),
        "signature" : {
            "hash" : BinData(0,"FzJNWuymE1i1yZOd6hE1rQ5Ut+E="),
            "keyId" : NumberLong("7021079005520461827")
        }
    },
    "operationTime" : Timestamp(1634723214, 1)
}
rs:PRIMARY>

> use admin
switched to db admin

> db.createUser({
    user: "root",
    pwd: "mongors123456",
    roles: [ { role: "root", db: "admin" } ]
})
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

> db.auth("root","mongors123456")
1

> show users
{
        "_id" : "admin.root",
        "userId" : UUID("143ca2db-1cc7-4b38-921b-7ee121fe4ff4"),
        "user" : "root",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

> db.dropUser("root")
true
# 测试复制
> db.getName()
test

> db.test.insert({name : 'sample'})
WriteResult({ "nInserted" : 1 })

# 无密码
> db2 = (new Mongo('mongodb2:27017')).getDB('test')
# 有密码
> db2 = (new Mongo('mongodb://root:mongors123456@mongodb2:27017')).getDB('test')
test

# 废弃,不推荐使用
> db2.setSlaveOk()
WARNING: setSlaveOk() is deprecated and may be removed in the next major release. Please use setSecondaryOk() instead.

> db2.setSecondaryOk()

> db2.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }

> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }

# 测试事务-回滚
> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }

> session = db.getMongo().startSession()
session { "id" : UUID("b7f8b918-6754-4eee-8ab0-f0c4e87e1543") }

> db = session.getDatabase('test')
test

> session.startTransaction()

> db.test.insert({"name":"docker in action"})
WriteResult({ "nInserted" : 1 })

> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a511273e6a16645764531"), "name" : "docker in action" }

> session.abortTransaction()

> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }

# 测试事务-提交
> session.startTransaction()

> db.test.insert({"name":"docker in action"})
WriteResult({ "nInserted" : 1 })

> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a51cf73e6a16645764532"), "name" : "docker in action" }

> session.commitTransaction()

> db.test.find()
{ "_id" : ObjectId("609a4f1573e6a16645764530"), "name" : "sample" }
{ "_id" : ObjectId("609a51cf73e6a16645764532"), "name" : "docker in action" }

> rs.conf()
> rs.status()

MongoDB 错误汇总

MongoDB学习记录

Mongodb:通过配置文件启动,报error opening file: /mongo/key: bad file

MongoDb的“not master and slaveok=false”错误及解决方法

MongDB解决Authentication Failed导致的不能连接问题

mongodb开启登录认证后遇到Authentication failed.

mongodb 3.4复制集配置

mongo认证配置又出问题了?来看看这个

mongodb-创建复制集(replSet)

docker 部署 MongoDB 副本集

使用docker构建MongoDB副本集,支持事务

mongodb transaction + docker 搭建replica sets 测试

MongoDB参数详解之enableLocalhostAuthBypass

mongodb – 是否enableLocalhostAuthBypass覆盖–auth?

MongoDB:使用keyfile访问控制的方式部署副本集

docker学习笔记18:Dockerfile 指令 VOLUME 介绍

Dockerfile Volume指令与docker -v的区别

深入理解Docker Volume(一)

Dockerfile指令详解—VOLUME 指令

dockerfile中的VOLUME说明