Skip to content

部署 MongoDB

快速启动

bash
docker run -d \
  --name mongodb \
  --restart unless-stopped \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -p 27017:27017 \
  -v mongo-data:/data/db \
  mongo:7.0

环境变量

变量说明
MONGO_INITDB_ROOT_USERNAME管理员用户名
MONGO_INITDB_ROOT_PASSWORD管理员密码
MONGO_INITDB_DATABASE初始化数据库名

连接 MongoDB

bash
# 进入容器
docker exec -it mongodb mongosh \
  -u admin -p secret \
  --authenticationDatabase admin

# 常用操作
test> show dbs
test> use mydb
mydb> db.createCollection("users")
mydb> db.users.insertOne({name: "张三", age: 25})
mydb> db.users.find()
mydb> show collections

初始化脚本

bash
mkdir -p ./mongo-init

cat > ./mongo-init/init.js <<'EOF'
// 切换到 myapp 数据库
db = db.getSiblingDB('myapp');

// 创建应用用户
db.createUser({
  user: 'appuser',
  pwd: 'apppassword',
  roles: [{ role: 'readWrite', db: 'myapp' }]
});

// 创建初始集合和索引
db.createCollection('users');
db.users.createIndex({ email: 1 }, { unique: true });
db.users.createIndex({ createdAt: -1 });
EOF

docker run -d \
  --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -e MONGO_INITDB_DATABASE=myapp \
  -v mongo-data:/data/db \
  -v $(pwd)/mongo-init:/docker-entrypoint-initdb.d:ro \
  mongo:7.0

自定义配置

bash
cat > ./mongod.conf <<'EOF'
storage:
  dbPath: /data/db
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: 0.0.0.0

security:
  authorization: enabled

operationProfiling:
  slowOpThresholdMs: 100
  mode: slowOp
EOF

docker run -d \
  --name mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  -v mongo-data:/data/db \
  -v $(pwd)/mongod.conf:/etc/mongod.conf:ro \
  mongo:7.0 \
  mongod --config /etc/mongod.conf

备份与恢复

bash
# 备份整个数据库
docker exec mongodb mongodump \
  -u admin -p secret \
  --authenticationDatabase admin \
  --out /backup

docker cp mongodb:/backup ./mongo-backup

# 备份指定数据库
docker exec mongodb mongodump \
  -u admin -p secret \
  --authenticationDatabase admin \
  --db myapp \
  --out /backup

# 恢复
docker cp ./mongo-backup mongodb:/backup
docker exec mongodb mongorestore \
  -u admin -p secret \
  --authenticationDatabase admin \
  /backup

Docker Compose

yaml
services:
  mongodb:
    image: mongo:7.0
    restart: unless-stopped
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_USERNAME:-admin}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
      MONGO_INITDB_DATABASE: ${MONGO_DATABASE:-myapp}
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
      - ./mongo-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  mongo-data: