在 Docker 中初始化 MongoDB 数据库,可以通过挂载初始化脚本或直接使用环境变量来完成。
1. 使用初始化脚本
MongoDB 官方镜像支持通过挂载初始化脚本来创建数据库、用户和插入初始数据。Docker 在启动容器时会自动执行位于 /docker-entrypoint-initdb.d/
目录下的 .js
或 .sh
文件。
(1) 创建初始化脚本
在主机上创建一个初始化脚本文件(如 mongo-init.js
),并定义初始化逻辑。
示例:mongo-init.js
// 创建一个新的数据库
use my_php_db;
// 创建一个普通用户
db.createUser({
user: "php_user",
pwd: "php_password",
roles: [{ role: "readWrite", db: "my_php_db" }]
});
// 插入一些测试数据
db.test_collection.insertOne({ name: "test", value: "Hello, MongoDB!" });
use my_php_db
:切换到my_php_db
数据库。db.createUser()
:创建一个具有读写权限的用户。db.test_collection.insertOne()
:向test_collection
集合中插入一条测试数据。
(2) 挂载初始化脚本
在 docker-compose.yml
中,将初始化脚本挂载到容器的 /docker-entrypoint-initdb.d/
目录。
修改后的 docker-compose.yml
mongodb:
image: mongo:6.0 # 使用官方 MongoDB 镜像(版本 6.0)
container_name: mongodb # 设置容器名称为 "mongodb"
environment: # 环境变量
MONGO_INITDB_ROOT_USERNAME: root # 设置 MongoDB 的超级用户名称
MONGO_INITDB_ROOT_PASSWORD: example # 设置 MongoDB 的超级用户密码
TZ: Asia/Shanghai # 设置时区为上海
volumes: # 数据卷挂载
- mongo_data:/data/db # 挂载数据卷以持久化 MongoDB 数据
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js # 挂载初始化脚本
ports: # 端口映射
- "27017:27017" # 主机的 27017 端口映射到容器的 27017 端口(MongoDB 默认端口)
networks: # 加入网络
- app-network # 加入名为 "app-network" 的桥接网络
restart: always # 自动重启策略
./mongo-init.js
:主机上的初始化脚本路径。/docker-entrypoint-initdb.d/mongo-init.js
:容器内的目标路径。
(3) 启动服务
运行以下命令启动 MongoDB 容器:
docker-compose up -d
- 当容器首次启动时,MongoDB 会自动执行
mongo-init.js
脚本,完成数据库初始化。
2. 使用环境变量(仅限简单场景)
如果只需要设置超级用户凭据,可以使用环境变量完成初始化。
(1) 配置环境变量
在 docker-compose.yml
中,通过 MONGO_INITDB_ROOT_USERNAME
和 MONGO_INITDB_ROOT_PASSWORD
设置超级用户。
示例:docker-compose.yml
mongodb:
image: mongo:6.0 # 使用官方 MongoDB 镜像(版本 6.0)
container_name: mongodb # 设置容器名称为 "mongodb"
environment: # 环境变量
MONGO_INITDB_ROOT_USERNAME: root # 设置 MongoDB 的超级用户名称
MONGO_INITDB_ROOT_PASSWORD: example # 设置 MongoDB 的超级用户密码
TZ: Asia/Shanghai # 设置时区为上海
volumes: # 数据卷挂载
- mongo_data:/data/db # 挂载数据卷以持久化 MongoDB 数据
ports: # 端口映射
- "27017:27017" # 主机的 27017 端口映射到容器的 27017 端口(MongoDB 默认端口)
networks: # 加入网络
- app-network # 加入名为 "app-network" 的桥接网络
restart: always # 自动重启策略
MONGO_INITDB_ROOT_USERNAME
:超级用户的用户名。MONGO_INITDB_ROOT_PASSWORD
:超级用户的密码。
(2) 启动服务
运行以下命令启动 MongoDB 容器:
docker-compose up -d
- 此方法仅适用于设置超级用户,无法创建普通用户或插入初始数据。
3. 手动初始化(适用于调试或临时操作)
如果需要手动初始化数据库,可以进入 MongoDB 容器并使用 mongo
命令行工具执行初始化脚本。
(1) 进入容器
运行以下命令进入 MongoDB 容器:
docker exec -it mongodb bash
(2) 连接到 MongoDB
运行以下命令连接到 MongoDB:
mongo -u root -p example --authenticationDatabase admin
-u root
:指定用户名为root
。-p example
:指定密码为example
。--authenticationDatabase admin
:指定认证数据库为admin
。
(3) 执行初始化命令
在 MongoDB Shell 中执行初始化命令。例如:
use my_php_db;
db.createUser({
user: "php_user",
pwd: "php_password",
roles: [{ role: "readWrite", db: "my_php_db" }]
});
db.test_collection.insertOne({ name: "test", value: "Hello, MongoDB!" });
4. 测试初始化结果
(1) 连接到 MongoDB
运行以下命令连接到 MongoDB:
mongo -u php_user -p php_password --authenticationDatabase my_php_db
(2) 查询数据
执行以下命令查询数据:
use my_php_db;
db.test_collection.find();
输出示例:
{ "_id": ObjectId("..."), "name": "test", "value": "Hello, MongoDB!" }
5. 总结
(1) 初始化方式
- 初始化脚本:推荐用于生产环境,支持复杂的初始化逻辑。
- 环境变量:适合简单的超级用户设置。
- 手动初始化:适合调试或临时操作。
(2) 使用场景
- 开发环境:快速启动带初始数据的 MongoDB。
- 生产环境:确保数据库初始化的一致性和安全性。
(3) 底层原理
- MongoDB 官方镜像会在容器首次启动时检查
/docker-entrypoint-initdb.d/
目录,并按顺序执行其中的脚本。 - 数据卷(如
mongo_data
)用于持久化数据,避免容器重启后数据丢失。