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 方式是最推荐的方法,因为它便于管理和维护。
No Comments