Skip to content

Docker - 设置 MongoDB

MongoDB 是一种流行的 NoSQL 文档型数据库,常用于现代 Web 应用中。Docker 使运行 MongoDB 实例进行开发、测试甚至生产变得容易。

本指南将展示如何运行一个 MongoDB 服务器容器,并使用 Docker 的网络功能从另一个容器连接到它。

步骤 1:从 Docker Hub 拉取官方的 MongoDB 镜像。

# Pull the latest official MongoDB image
docker pull mongo

步骤 2:创建一个用户自定义网络。这允许容器使用它们的名称轻松通信。

docker network create mongo-net

步骤 3:运行 MongoDB 服务器容器,将其连接到网络并设置必要的环境变量。

docker run -d \
--name mongodb-server \
--network mongo-net \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo

解释:

  • -d:以后台(分离)模式运行。
  • --name mongodb-server:为容器指定一个名称。
  • --network mongo-net:将容器连接到我们的用户自定义网络。
  • -e MONGO_INITDB_ROOT_USERNAME=...:在首次初始化时设置 root 用户名。
  • -e MONGO_INITDB_ROOT_PASSWORD=...:在首次初始化时设置 root 密码。在实际场景中请使用强密码!
  • mongo:要使用的镜像名称。

可选:为了数据持久化(强烈推荐),挂载一个卷 (volume):

# Create a named volume first (optional, Docker creates it if it doesn't exist)
# docker volume create mongo-data
docker run -d \
--name mongodb-server \
--network mongo-net \
-v mongo-data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo

-v mongo-data:/data/db 将名为 mongo-data 的卷映射到容器内默认的 MongoDB 数据目录,确保您的数据在容器重启或移除后仍然存在。

步骤 4:使用相同的 mongo 镜像运行另一个容器作为客户端。将其连接到同一个网络。

# Run a temporary interactive mongo container connected to the network
docker run -it --rm --network mongo-net mongo bash
  • -it:以交互模式运行并分配 TTY。
  • --rm:容器退出时自动移除。
  • --network mongo-net:连接到与服务器相同的网络。
  • mongo:使用 mongo 镜像。
  • bash:在客户端容器内部启动一个 bash shell。

步骤 5:在客户端容器的 bash shell 中,使用 mongosh(或旧版 mongo)客户端连接到服务器,通过服务器容器的名称(mongodb-server)进行引用。

# Inside the client container's shell:
mongosh --host mongodb-server --username mongoadmin --password secret

解释:

  • mongosh:MongoDB shell 命令。
  • --host mongodb-server:使用容器名称连接到服务器(Docker 会通过用户自定义网络解析此名称)。
  • --username mongoadmin:使用之前定义的 root 用户名。
  • --password secret:使用之前定义的 root 密码。(如果省略 --password secret,可能会交互式地提示您输入密码)。

如果连接成功,您将看到 MongoDB shell 提示符(>)。

步骤 6:现在可以运行 MongoDB 命令了。

# Example commands inside the MongoDB shell:
show dbs
use myNewDatabase
db.myCollection.insertOne({ name: "Docker Test" })
db.myCollection.find()

输入 exit 退出 MongoDB shell,再次输入 exit 退出客户端容器(该容器会因 --rm 选项而被移除)。您的 mongodb-server 容器会继续在后台运行。