Skip to main content

docker安装mongodb

使用 Docker 安装 MongoDB 有多种方式,以下是详细的安装方法和配置:

1. 使用 Docker Run 命令安装

基本安装

# 拉取最新版 MongoDB 镜像
docker pull mongo:latest

# 运行 MongoDB 容器
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongo:latest

带数据持久化的安装

# 创建数据目录
mkdir -p ~/docker/mongodb/data

docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -v ~/docker/mongodb/data:/data/db \
  mongo:latest

完整配置的安装

docker run -d \
  --name mongodb \
  --restart unless-stopped \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -e MONGO_INITDB_DATABASE=myapp \
  -v ~/docker/mongodb/data:/data/db \
  -v ~/docker/mongodb/logs:/var/log/mongodb \
  -v ~/docker/mongodb/config:/etc/mongo \
  mongo:latest \
  --logpath /var/log/mongodb/mongod.log \
  --logappend \
  --bind_ip_all

2. 使用 Docker Compose 安装(推荐)

基础 docker-compose.yml

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
      MONGO_INITDB_DATABASE: myapp
    volumes:
      - mongodb_data:/data/db
      - ./mongodb/init:/docker-entrypoint-initdb.d  # 初始化脚本目录

volumes:
  mongodb_data:
    driver: local

完整的生产环境配置

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: your_secure_password
      MONGO_INITDB_DATABASE: myapp
    volumes:
      - mongodb_data:/data/db
      - mongodb_config:/etc/mongo
      - mongodb_logs:/var/log/mongodb
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
    command: 
      - "--auth"
      - "--bind_ip_all"
      - "--logpath"
      - "/var/log/mongodb/mongod.log"
      - "--logappend"
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
      interval: 30s
      timeout: 10s
      retries: 3

  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: your_secure_password
      ME_CONFIG_MONGODB_URL: mongodb://admin:your_secure_password@mongodb:27017/
      ME_CONFIG_BASICAUTH_USERNAME: admin
      ME_CONFIG_BASICAUTH_PASSWORD: express_password
    depends_on:
      - mongodb

volumes:
  mongodb_data:
  mongodb_config:
  mongodb_logs:

3. 初始化脚本配置

创建初始化脚本

// init-mongo.js
db = db.getSiblingDB('myapp');

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

// 创建初始集合和文档
db.createCollection('users');
db.users.insertOne({
  username: 'admin',
  email: 'admin@example.com',
  createdAt: new Date()
});

db.createCollection('products');
db.products.insertOne({
  name: 'Sample Product',
  price: 99.99,
  category: 'electronics'
});

print('MongoDB initialization completed!');

创建初始化目录结构

mkdir -p ~/docker/mongodb/init
chmod +x ~/docker/mongodb/init/init-mongo.js

4. 不同版本的 MongoDB 安装

安装特定版本

version: '3.8'

services:
  mongodb-5:
    image: mongo:5.0
    container_name: mongodb-5
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb5_data:/data/db

  mongodb-6:
    image: mongo:6.0
    container_name: mongodb-6
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb6_data:/data/db

volumes:
  mongodb5_data:
  mongodb6_data:

5. 副本集配置(生产环境)

副本集 docker-compose.yml

version: '3.8'

services:
  mongodb1:
    image: mongo:latest
    container_name: mongodb1
    command: ["--replSet", "rs0", "--bind_ip_all"]
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb1_data:/data/db
    healthcheck:
      test: test $$(echo "rs.status().ok" | mongosh -u admin -p password --quiet) -eq 1
      interval: 10s
      start_period: 30s

  mongodb2:
    image: mongo:latest
    container_name: mongodb2
    command: ["--replSet", "rs0", "--bind_ip_all"]
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb2_data:/data/db
    depends_on:
      - mongodb1

  mongodb3:
    image: mongo:latest
    container_name: mongodb3
    command: ["--replSet", "rs0", "--bind_ip_all"]
    ports:
      - "27019:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    volumes:
      - mongodb3_data:/data/db
    depends_on:
      - mongodb1

  mongo-setup:
    image: mongo:latest
    container_name: mongo-setup
    depends_on:
      - mongodb1
      - mongodb2
      - mongodb3
    restart: "no"
    volumes:
      - ./replica-setup.js:/replica-setup.js
    command: >
      bash -c "
        sleep 20 &&
        mongosh --host mongodb1:27017 -u admin -p password --eval \"$$(cat /replica-setup.js)\"
      "

volumes:
  mongodb1_data:
  mongodb2_data:
  mongodb3_data:

副本集初始化脚本

// replica-setup.js
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongodb1:27017" },
    { _id: 1, host: "mongodb2:27017" },
    { _id: 2, host: "mongodb3:27017" }
  ]
});

6. 管理和操作命令

常用 Docker 命令

# 查看运行状态
docker ps | grep mongo

# 查看日志
docker logs mongodb

# 进入容器
docker exec -it mongodb bash

# 连接 MongoDB
docker exec -it mongodb mongosh -u admin -p password

# 停止容器
docker stop mongodb

# 启动容器
docker start mongodb

# 重启容器
docker restart mongodb

# 删除容器
docker rm -f mongodb

# 查看资源使用
docker stats mongodb

数据库操作命令

# 连接数据库
docker exec -it mongodb mongosh -u admin -p password --authenticationDatabase admin

# 在容器内执行命令
docker exec -it mongodb mongosh --eval "db.adminCommand('listDatabases')"

# 备份数据库
docker exec mongodb mongodump -u admin -p password --out /backup
docker cp mongodb:/backup ./mongodb-backup

# 恢复数据库
docker cp ./mongodb-backup mongodb:/restore
docker exec mongodb mongorestore -u admin -p password /restore

7. 连接测试

PHP 测试脚本

<?php
// test_mongodb_connection.php
try {
    // 连接字符串
    $connectionString = "mongodb://admin:password@localhost:27017";
    
    // 创建连接
    $client = new MongoDB\Client($connectionString);
    
    // 测试连接
    $client->listDatabases();
    
    echo "✅ MongoDB 连接成功!\n";
    
    // 列出所有数据库
    $databases = $client->listDatabases();
    echo "可用数据库:\n";
    foreach ($databases as $database) {
        echo "- " . $database->getName() . "\n";
    }
    
    // 测试读写操作
    $collection = $client->myapp->test;
    $insertResult = $collection->insertOne(['name' => 'test', 'timestamp' => new MongoDB\BSON\UTCDateTime()]);
    echo "插入文档 ID: " . $insertResult->getInsertedId() . "\n";
    
    $document = $collection->findOne(['_id' => $insertResult->getInsertedId()]);
    echo "查询结果: " . json_encode($document) . "\n";
    
} catch (Exception $e) {
    echo "❌ 连接失败: " . $e->getMessage() . "\n";
}
?>

Laravel 环境变量配置

# .env
DB_CONNECTION=mongodb
DB_HOST=localhost
DB_PORT=27017
DB_DATABASE=myapp
DB_USERNAME=appuser
DB_PASSWORD=apppassword

8. 安全配置

生产环境安全配置

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD}
      MONGO_INITDB_DATABASE: ${MONGO_DATABASE}
    volumes:
      - mongodb_data:/data/db
      - ./mongod.conf:/etc/mongod.conf:ro
      - ./ssl:/etc/ssl/mongo
    command: 
      - "--config"
      - "/etc/mongod.conf"
    networks:
      - internal_network

networks:
  internal_network:
    driver: bridge

volumes:
  mongodb_data:

MongoDB 配置文件

# mongod.conf
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
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongo/mongodb.pem
    CAFile: /etc/ssl/mongo/ca.pem

security:
  authorization: enabled

9. 一键安装脚本

#!/bin/bash
# install_mongodb_docker.sh

set -e

echo "开始使用 Docker 安装 MongoDB..."

# 创建目录结构
mkdir -p ~/docker/mongodb/{data,logs,config,init}
cd ~/docker/mongodb

# 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: mongodb_password
      MONGO_INITDB_DATABASE: myapp
    volumes:
      - ./data:/data/db
      - ./logs:/var/log/mongodb
      - ./config:/etc/mongo
    command: 
      - "--auth"
      - "--bind_ip_all"
      - "--logpath"
      - "/var/log/mongodb/mongod.log"

  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: mongodb_password
      ME_CONFIG_MONGODB_URL: mongodb://admin:mongodb_password@mongodb:27017/
    depends_on:
      - mongodb
EOF

# 启动服务
docker-compose up -d

echo "等待 MongoDB 启动..."
sleep 10

# 检查状态
docker ps | grep mongo

echo "✅ MongoDB 安装完成!"
echo "📊 MongoDB 地址: localhost:27017"
echo "🖥️  Web 管理界面: http://localhost:8081"
echo "🔑 用户名: admin, 密码: mongodb_password"

给脚本执行权限并运行:

chmod +x install_mongodb_docker.sh
./install_mongodb_docker.sh

这样你就可以通过 Docker 快速安装和运行 MongoDB 了。使用 Docker Compose 方式是最推荐的方法,因为它便于管理和维护。