docker里面的mongodb如何初始化数据库?

在 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_USERNAMEMONGO_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)用于持久化数据,避免容器重启后数据丢失。
你可以使用以下的docker-compose.yml文件来初始化一个MongoDB容器: ```yaml version: '3' services: mongodb: image: mongo:latest container_name: mongodb-container command: [--auth] environment: TZ: Asia/Shanghai MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: mydatabase MONGO_USERNAME: cnode MONGO_PASSWORD: cnode restart: always volumes: - /data2/wuyongyu/mongo_data:/data/db - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh ports: - 27017:27017 ``` 这个docker-compose文件会创建一个名为`mongodb`的服务,使用最新版本的MongoDB镜像。容器会被命名为`mongodb-container`,并设置了身份验证。还定义了一些环境变量,比如时区、管理员用户名和密码、数据库名称、以及普通用户的用户名和密码。容器会在重启时自动启动,并将数据卷挂载到本地的`/data2/wuyongyu/mongo_data`目录。此外,还会将`mongo-init.sh`脚本挂载到容器的`/docker-entrypoint-initdb.d`目录,用于初始化数据库。容器的27017端口会映射到主机的27017端口,以便可以通过主机访问MongoDB。 希望这可以帮助到你!123 #### 引用[.reference_title] - *1* [docker-compose部署mongodb](https://blog.csdn.net/TH_NUM/article/details/125163584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* *3* [使用Docker一键部署MongoDB](https://blog.csdn.net/u011104991/article/details/81735960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值