跳至主要内容

在 Docker 中运行 MongoDB:完整指南与示例

本指南带您在 Docker 中运行 MongoDB,涵盖快速的命令行部署与完整的 Docker Compose 配置。非常适合想要自托管或在本地试验、且暂不打算立即上云的开发者。
· 5分钟 阅读

使用 AI 探索

想要自行托管 MongoDB,或在本地环境中先试一试?如果您暂时不想直接使用 MongoDB Atlas,可以从几种方式入手,其中一种就是使用 Docker 容器。

使用 Docker 管理您的 MongoDB 实例是一个稳妥的选择,配置不到一分钟即可完成,而且易于维护或在主机之间迁移。

本文将介绍几种使用 Docker 部署 MongoDB 的方法,并分享一些实用技巧。您也可以观看这段视频快速了解要点。

前提条件

要跟随本教程操作,您需要先在电脑上安装Docker Engine 。支持 macOS、Windows 或 Linux。您不一定要安装 Docker Desktop,但根据所用操作系统不同,它可能让您的 Docker 体验更顺畅。

例如,我在 macOS 上通过 Rancher Desktop 使用 Docker Engine,运行良好。

如果想温习 Docker 基础,建议查看 Docker for Beginners: A Practical Guide to Containers。

下载 MongoDB 的 Docker 镜像

在 Docker 容器中运行 MongoDB 之前,您需要先下载一个满足需求的镜像。请在命令行中执行以下命令:

docker pull mongodb/mongodb-community-server:latest

上述命令会下载带有“latest”标签的官方 MongoDB 社区版(CE)镜像。

需要注意的是,mongodb/mongodb-community-server 和 mongodb/mongodb-enterprise-server 是由 MongoDB 维护的官方 Docker 镜像。其他镜像由外部社区维护,可能会产生不同或意外的结果。

镜像下载完成后,我们就可以查看部署选项了。

使用 Docker Run 命令将 MongoDB 作为独立容器运行

要用 Docker 最快地部署 MongoDB,只需配合少量配置参数使用 docker run 命令。例如,您可以在命令行中执行以下命令:

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=nraboy -e MONGO_INITDB_ROOT_PASSWORD=password1234 --name mongodb mongodb/mongodb-community-server:latest

上述命令会将镜像部署为名为“MongoDB”的容器。容器会进行端口映射,这意味着主机可以通过“27017”端口与其交互。示例中也设置了 root 身份验证信息,但根据您的部署需求,您可以使用 Docker Secrets 或其他受保护的方式传递敏感信息。

在上述示例中,所有数据都存储在容器内。MongoDB 数据(包括数据库、集合,甚至文档)只会在该容器存在期间持久保存。这在测试时可能合适,但很多情况下,您会希望在 Docker 中可靠地持久化 MongoDB 数据。为此,应该使用以下命令创建一个 Docker 卷:

docker volume create mongodb

要让容器使用该卷,您可以将部署命令修改为如下形式:

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=nraboy -e MONGO_INITDB_ROOT_PASSWORD=password1234 -v mongodb:/data/db --name mongodb mongodb/mongodb-community-server:latest

请注意,这次我们指定了要使用的卷。使用卷时,即使终止或更新容器,您的数据也会保留。

在 Docker 容器中运行 MongoDB 后,您可以使用 mongodb://nraboy:password1234@localhost:27017 作为连接字符串,通过您偏好的工具进行连接。

通过 Docker Compose 将 MongoDB 纳入您的技术栈或项目

如果您计划在某个通过 Docker 管理的项目中使用 MongoDB,那么用 Docker Compose 配置来管理 MongoDB 可能更合适。这类配置通常用于为项目构建沙箱环境,常被称为“栈”。

在您的电脑某处创建一个 docker-compose.yml 文件,并写入以下内容:

services:
    mongodb:
        image: mongodb/mongodb-community-server:latest
        container_name: mongodb
        restart: unless-stopped
        ports:
            - "27017:27017"
        volumes:
            - mongodb:/data/db
        environment:
            MONGO_INITDB_ROOT_USERNAME: nraboy
            MONGO_INITDB_ROOT_PASSWORD: password1234

volumes:
    mongodb:
        external: true

上述配置使用了我们在单条命令行中已经见过的信息。与前一种方法一样,这里假设您已经创建了由 Docker 管理的 mongodb 卷。如果还未创建,请再次执行以下命令:

docker volume create mongodb

当然,您可以根据需要以其他方式管理 Docker 卷。创建卷只是多种做法之一。

将命令行的工作目录切换到 docker-compose.yml 文件所在目录后,执行以下命令:

docker compose up -d

上述命令会以分离模式启动您的栈。

您可以尝试使用 MongoDB Compass、某种语言驱动(如 Node.js),或 MongoDB Shell 连接实例,以验证一切是否正常工作。

如果严格按照示例操作,您的连接字符串将是 mongodb://nraboy:password1234@localhost:27017,但根据您的实际操作,可能会有所不同。

要关闭 MongoDB 实例,请在与该 YAML 配置同一工作目录的命令行中执行以下命令:

docker compose down

由于我们使用的是外部卷,下次启动容器时,一切数据仍会被保留。

结论

Docker 让在自托管或本地环境中使用 MongoDB 变得轻而易举。您无需担心通用操作系统配置,也无需担心不同电脑之间的差异。每次都能获得一致的体验。

想更进一步,值得学习如何在 MongoDB 中创建数据库。

FAQs

使用 Docker 时,我可以同时运行多个 MongoDB 容器吗?

可以。您可以同时运行多个 MongoDB 容器,只要确保每个容器映射到不同的端口,或在不同的 Docker 网络上运行以避免冲突。

如何在 Docker 中备份 MongoDB 容器的数据?

要备份数据,您可以使用 docker cp 从卷中提取文件,或在容器内使用 mongodump。持久化卷也有助于在各次会话之间保留数据。

在 Docker Compose 文件中存储 MongoDB 密码安全吗?

并不理想。建议使用 Docker Secrets 或不纳入版本控制的环境变量文件(.env)来安全管理敏感凭据。

MongoDB 在 Windows 上通过 Docker 运行得好吗?

可以。MongoDB 在 Windows、macOS 和 Linux 上通过 Docker 运行平稳,特别是在 Windows 上使用 WSL 2 或 Docker Desktop 可确保兼容性。

我可以在生产环境中将 MongoDB 与 Docker 一起使用吗?

可以,但在生产环境中使用容器化的 MongoDB 前,建议先正确配置网络、存储卷、身份验证和备份。

如何从另一个容器连接到 Docker 中的 MongoDB?

使用 Docker Compose,并将 MongoDB 容器的服务名作为主机名引用。这样可在同一网络中实现服务间通信。

如果我使用 Docker,还需要在本地安装 MongoDB 吗?

不需要。Docker 会在容器化环境中运行 MongoDB,您无需在主机上直接安装 MongoDB。

我可以将 MongoDB Compass 用于容器化的 MongoDB 实例吗?

当然可以。只需使用正确的连接字符串(例如 mongodb://user:pass@localhost:27017),即可从 MongoDB Compass 连接到本地容器。

如何监控 Docker 中 MongoDB 的性能?

您可以集成 mongostat、mongotop 等工具,或使用 Prometheus、Grafana 等外部监控解决方案来跟踪容器中的性能。

在 Docker 容器中,我的 MongoDB 数据会持久化吗?

只要您已将容器目录映射到主机上的卷,在更新与重启之间数据就应能顺利持久化。

我应该使用 Docker 还是 MongoDB Atlas?

在大多数场景下,基于其功能、定价和易用性,使用 MongoDB Atlas 更佳;但通过 Docker 使用 MongoDB 也是可行的选项。

使用 MongoDB 时,我必须搭配 Docker Desktop 吗?

Docker Desktop 在大多数情况下能让操作更简单,但不是必需的。多数 Linux 发行版内置 Docker Engine,其他界面如 Rancher Desktop 也同样可用。

Nic Raboy

作者

Nic Raboy

Nic Raboy 是 MongoDB 的开发者关系主管,带领一支由 Python、Java、C# 与 PHP 开发者组成的团队,创作优质内容,帮助开发者在项目中成功使用 MongoDB。他具备 Golang 与 JavaScript 经验,并常常撰写自己在开发过程中的见闻与实践。

主题