1. 理解基础概念
在正式进入操作步骤之前,我们先来明确几个关键概念。
数据库初始化(Seeding)是指在数据库首次创建时自动填充初始数据的过程。对于 MongoDB 这种 NoSQL 数据库来说,它常用于在开发或测试环境中快速准备测试数据。
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它允许我们通过一个 YAML 文件统一管理多个服务(如数据库、Web 应用等),非常适合搭建本地开发环境。
2. 使用 Docker Compose 初始化 MongoDB 的准备工作
接下来,我们将一步步配置 Docker Compose 来自动完成 MongoDB 数据库的初始化。
2.1 创建 Docker Compose 文件
首先,在本地创建一个项目目录,比如 test
,然后在该目录下创建一个 docker-compose.yml
文件。这个文件将用于定义 MongoDB 服务及其配置:
version: '3.8'
services:
mongodb:
image: mongo
ports:
- "27017:27017"
volumes:
- ./data:/data/db
- ./mongo-seed:/docker-entrypoint-initdb.d
上面的配置中:
- 使用了官方的
mongo
镜像; - 将本地的 27017 端口映射到容器的 27017 端口,方便本地连接;
- 挂载了两个目录:
./data
用于持久化 MongoDB 的数据;./mongo-seed
是我们放置初始化脚本的地方,Docker 会自动执行该目录下的所有.js
文件。
2.2 编写初始化脚本
接下来,在项目根目录下创建 mongo-seed
文件夹,并在其中添加一个 seed.js
脚本,用于插入初始数据:
// seed.js
db = db.getSiblingDB("school");
db.students.insertMany([
{ name: "Gbenga Oyatoye", age: 22, major: "Computer Science" },
{ name: "John Doe", age: 24, major: "Mathematics" },
{ name: "Jimmy Azar", age: 28, major: "Physics" }
]);
这段脚本的作用是:
- 切换到
school
数据库(如果不存在则自动创建); - 在
students
集合中插入三条学生记录。
⚠️ 注意:MongoDB 容器启动时会自动执行 /docker-entrypoint-initdb.d
目录下的脚本,但仅在数据库第一次初始化时执行。如果你已经运行过一次,再修改脚本不会生效,除非清空 ./data
或者删除容器。
3. 启动 Docker 容器
进入项目目录,执行以下命令启动 MongoDB 容器:
docker-compose up -d
输出类似如下内容,表示容器已成功启动:
[+] Running 1/1
✔ Container test-mongodb-1 Started
Docker 会自动下载镜像、挂载目录,并执行 seed.js
中的脚本,完成数据库初始化。
4. 验证初始化数据
为了验证数据是否正确写入,我们需要连接 MongoDB 并查询数据。
4.1 安装 MongoDB 客户端(可选)
如果你本地还没有 MongoDB 客户端,可以使用以下命令安装(适用于 Ubuntu):
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg
echo "deb [ arch=amd64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-mongosh
4.2 连接 MongoDB 容器
使用 mongosh
命令连接本地 MongoDB:
mongosh --host localhost --port 27017
4.3 查询初始化数据
进入 MongoDB Shell 后,执行以下命令验证数据:
> show dbs
admin 40.00 KiB
config 12.00 KiB
local 72.00 KiB
school 40.00 KiB
> use school
switched to db school
> db.getCollectionNames()
[ 'students' ]
> db.students.find().pretty()
[
{
_id: ObjectId('66b9defc7373a94e19149f48'),
name: 'Gbenga Oyatoye',
age: 22,
major: 'Computer Science'
},
{
_id: ObjectId('66b9defc7373a94e19149f49'),
name: 'John Doe',
age: 24,
major: 'Mathematics'
},
{
_id: ObjectId('66b9defc7373a94e19149f4a'),
name: 'Jimmy Azar',
age: 28,
major: 'Physics'
}
]
✅ 如果你能看到上面这些数据,说明初始化脚本已成功执行。
5. 常见问题与注意事项
- 初始化脚本只在第一次启动时运行:如果数据库已经存在,脚本不会再次执行。要重新初始化,需要删除
./data
或使用docker-compose down -v
删除卷。 - 脚本路径必须正确挂载:确保
./mongo-seed
目录被正确挂载到容器中的/docker-entrypoint-initdb.d
。 - 脚本必须是
.js
文件:MongoDB 只会执行该目录下的.js
文件,.sh
或其他格式不会被识别。 - **避免在脚本中使用
db.createUser()
**:该命令在初始化时可能无法正确执行,建议使用环境变量配置用户权限。
6. 总结
通过本文我们学习了如何使用 Docker Compose 自动初始化 MongoDB 数据库。这种做法非常适合在开发、测试环境中快速部署带有初始数据的数据库服务。
主要步骤包括:
- 创建
docker-compose.yml
定义 MongoDB 服务; - 编写
.js
初始化脚本并挂载到容器; - 使用
docker-compose up
启动服务并自动执行脚本; - 使用
mongosh
连接数据库并验证数据。
掌握了这些技巧后,你可以在实际项目中轻松实现数据库的初始化流程,提高开发效率和环境一致性。