Docker 安装 MongoDB
MongoDB 容器的初始化用户、数据卷与副本集。
Key Points官方镜像用 MONGO_INITDB_ROOT_USERNAME/PASSWORD 建管理员;副本集必须显式 --replSet 并 rs.initiate()。
启动
Bash
docker run -d --name mongo \
-p 127.0.0.1:27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=adminpass \
-v mongo-data:/data/db \
mongo:7连进去
Bash
docker exec -it mongo mongosh -u admin -p adminpass --authenticationDatabase admin
# 或者
docker exec -it mongo mongosh "mongodb://admin:adminpass@localhost:27017/?authSource=admin"副本集
Bash
docker run -d --name mongo-rs \
-p 127.0.0.1:27017:27017 \
-v mongo-data:/data/db \
mongo:7 --replSet rs0 --bind_ip_all
docker exec -it mongo-rs mongosh --eval 'rs.initiate({_id:"rs0",members:[{_id:0,host:"127.0.0.1:27017"}]})'
docker exec -it mongo-rs mongosh --eval 'rs.status().ok'Transactions and change streams require a replica set. A single-member set is fine locally and costs nothing.
常见问题
| Symptom | Cause | Fix |
|---|---|---|
Authentication failed | Wrong authSource | Add ?authSource=admin |
not master and slaveOk=false | Replica set not initiated | Run rs.initiate() |
| Data gone after recreate | No volume | -v mongo-data:/data/db |
MongoDB 5+ ships
mongosh instead of the old mongo shell; scripts still calling mongo will get command not found.启动
Bash
docker run -d --name mongo \
-p 127.0.0.1:27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=adminpass \
-v mongo-data:/data/db \
mongo:7连进去
Bash
docker exec -it mongo mongosh -u admin -p adminpass --authenticationDatabase admin
# 或者
docker exec -it mongo mongosh "mongodb://admin:adminpass@localhost:27017/?authSource=admin"副本集
Bash
docker run -d --name mongo-rs \
-p 127.0.0.1:27017:27017 \
-v mongo-data:/data/db \
mongo:7 --replSet rs0 --bind_ip_all
docker exec -it mongo-rs mongosh --eval 'rs.initiate({_id:"rs0",members:[{_id:0,host:"127.0.0.1:27017"}]})'
docker exec -it mongo-rs mongosh --eval 'rs.status().ok'副本集是事务与 Change Stream 的前提。单节点也能组成副本集(成员只有一个),本地开发这样最省事。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 认证失败 | authSource 不对 | 加 ?authSource=admin |
| 不是主节点 | 副本集没初始化 | 执行 rs.initiate() |
| 重建后数据没了 | 没挂卷 | 挂 /data/db |
MongoDB 5+ 的
mongosh 替代了老的 mongo shell。脚本里还写 mongo 的话,进容器会提示 command not found。