快速参考
-
维护者:
Docker 社区 -
获取帮助的途径:
Docker 社区 Slack、Server Fault、Unix & Linux 或 Stack Overflow
支持的标签和相应的 Dockerfile 链接
(请参阅常见问题解答中的“‘共享’和‘简单’标签有什么区别?”)
简单标签
-
8.0.0-nanoserver-ltsc2022,8.0-nanoserver-ltsc2022,8-nanoserver-ltsc2022,nanoserver-ltsc2022 -
8.0.0-nanoserver-1809,8.0-nanoserver-1809,8-nanoserver-1809,nanoserver-1809 -
7.0.14-windowsservercore-ltsc2022,7.0-windowsservercore-ltsc2022,7-windowsservercore-ltsc2022 -
7.0.14-windowsservercore-1809,7.0-windowsservercore-1809,7-windowsservercore-1809 -
7.0.14-nanoserver-ltsc2022,7.0-nanoserver-ltsc2022,7-nanoserver-ltsc2022 -
7.0.14-nanoserver-1809,7.0-nanoserver-1809,7-nanoserver-1809 -
6.0.18-rc0-windowsservercore-ltsc2022,6.0-rc-windowsservercore-ltsc2022 -
6.0.18-rc0-windowsservercore-1809,6.0-rc-windowsservercore-1809 -
6.0.17-windowsservercore-ltsc2022,6.0-windowsservercore-ltsc2022,6-windowsservercore-ltsc2022 -
6.0.17-windowsservercore-1809,6.0-windowsservercore-1809,6-windowsservercore-1809 -
6.0.17-nanoserver-ltsc2022,6.0-nanoserver-ltsc2022,6-nanoserver-ltsc2022 -
6.0.17-nanoserver-1809,6.0-nanoserver-1809,6-nanoserver-1809 -
5.0.29-rc0-windowsservercore-ltsc2022,5.0-rc-windowsservercore-ltsc2022 -
5.0.29-rc0-windowsservercore-1809,5.0-rc-windowsservercore-1809 -
5.0.28-windowsservercore-ltsc2022,5.0-windowsservercore-ltsc2022,5-windowsservercore-ltsc2022 -
5.0.28-windowsservercore-1809,5.0-windowsservercore-1809,5-windowsservercore-1809 -
5.0.28-nanoserver-ltsc2022,5.0-nanoserver-ltsc2022,5-nanoserver-ltsc2022 -
5.0.28-nanoserver-1809,5.0-nanoserver-1809,5-nanoserver-1809
共享标签
-
8.0.0,8.0,8,latest:8.0.0-noble8.0.0-windowsservercore-ltsc20228.0.0-windowsservercore-1809-
8.0.0-windowsservercore,8.0-windowsservercore,8-windowsservercore,windowsservercore: 8.0.0-windowsservercore-1809-
8.0.0-nanoserver,8.0-nanoserver,8-nanoserver,nanoserver: 8.0.0-nanoserver-1809-
7.0.14,7.0,7: 7.0.14-windowsservercore-ltsc20227.0.14-windowsservercore-1809-
7.0.14-windowsservercore,7.0-windowsservercore,7-windowsservercore: 7.0.14-windowsservercore-1809-
7.0.14-nanoserver,7.0-nanoserver,7-nanoserver: 7.0.14-nanoserver-1809-
6.0.18-rc0,6.0-rc: 6.0.18-rc0-windowsservercore-ltsc20226.0.18-rc0-windowsservercore-1809-
6.0.18-rc0-windowsservercore,6.0-rc-windowsservercore: 6.0.18-rc0-windowsservercore-1809-
6.0.18-rc0-nanoserver,6.0-rc-nanoserver: 6.0.18-rc0-nanoserver-1809-
6.0.17,6.0,6: 6.0.17-windowsservercore-ltsc20226.0.17-windowsservercore-1809-
6.0.17-windowsservercore,6.0-windowsservercore,6-windowsservercore: 6.0.17-windowsservercore-1809-
6.0.17-nanoserver,6.0-nanoserver,6-nanoserver: 6.0.17-nanoserver-1809-
5.0.29-rc0,5.0-rc: 5.0.29-rc0-windowsservercore-ltsc20225.0.29-rc0-windowsservercore-1809-
5.0.29-rc0-windowsservercore,5.0-rc-windowsservercore: 5.0.29-rc0-windowsservercore-1809-
5.0.29-rc0-nanoserver,5.0-rc-nanoserver: 5.0.29-rc0-nanoserver-1809-
5.0.28,5.0,5: 5.0.28-windowsservercore-ltsc20225.0.28-windowsservercore-1809-
5.0.28-windowsservercore,5.0-windowsservercore,5-windowsservercore: 5.0.28-windowsservercore-1809-
5.0.28-nanoserver,5.0-nanoserver,5-nanoserver: 5.0.28-nanoserver-1809
快速参考(续)
-
支持的架构:(更多信息)
amd64,arm64v8,windows-amd64 -
已发布的映像工件详细信息:
repo-info repo 的repos/mongo/目录(历史记录)
(图像元数据、传输大小等) -
图像更新:
官方镜像仓库的library/mongo标签
官方镜像仓库的library/mongo文件(历史记录) -
来源:此描述的来源:
docs 存储库的mongo/目录(历史记录)
什么是 MongoDB?
MongoDB 是一个免费的开源跨平台面向文档的数据库程序。作为一个 NoSQL 数据库程序,MongoDB 使用带有模式的类似 JSON 的文档。MongoDB 由 MongoDB Inc. 开发,并根据服务器端公共许可证和 Apache 许可证的组合发布。
最初由软件公司 10gen(现 MongoDB Inc.)于 2007 年 10 月开发,作为计划中的平台即服务产品的一个组件,该公司于 2009 年转向开源开发模式,10gen 提供商业支持和其他服务。从那时起,MongoDB 已被许多主要网站和服务用作后端软件,包括大都会人寿、巴克莱、ADP、UPS、维亚康姆和纽约时报等。MongoDB 是最流行的 NoSQL 数据库系统。
安全
默认情况下,Mongo 的配置不需要任何身份验证即可访问,即使是管理员用户也是如此。如果您计划将 Mongo 实例暴露在互联网上,强烈建议设置一个 root 用户名和密码。请参阅下面的“ MONGO_INITDB_ROOT_USERNAME , MONGO_INITDB_ROOT_PASSWORD ”部分以获取说明,并参阅 MongoDB 安全文档以获取更完整的处理方法。
如何使用此图像
启动一个 mongo 服务器实例
$ docker run --name some-mongo -d mongo:tag
... 其中 some-mongo 是您要分配给容器的名称, tag 是指定您想要的 MongoDB 版本的标签。请参阅上面的列表以获取相关标签。
从另一个 Docker 容器连接到 MongoDB
该映像中的 MongoDB 服务器在标准 MongoDB 端口 27017 上进行监听,因此通过 Docker 网络进行连接与连接到远程 mongod 相同。以下示例启动另一个 MongoDB 容器实例,并针对上述示例中的原始 MongoDB 容器运行 mongosh (对于 4.x 版本,请使用 mongo )命令行客户端,允许您针对数据库实例执行 MongoDB 语句:
$ docker run -it --network some-network --rm mongo mongosh --host some-mongo test
... 其中 some-mongo 是您原始的 mongo 容器的名称。
...通过 docker-compose 或 docker stack deploy
示例 docker-compose.yml 用于 mongo :
# Use root/example as user/password credentials
version: '3.1'
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
ME_CONFIG_BASICAUTH: false
运行 docker stack deploy -c stack.yml mongo (或 docker-compose -f stack.yml up ),等待其完全初始化,然后访问 http://swarm-ip:8081 、 http://localhost:8081 或 http://host-ip:8081 (视情况而定)。
容器外壳访问和查看 MongoDB 日志
docker exec 命令允许您在 Docker 容器内运行命令。以下命令行将在您的 mongo 容器内为您提供一个 bash 外壳:
$ docker exec -it some-mongo bash
MongoDB 服务器日志可通过 Docker 的容器日志获取:
$ docker logs some-mongo
配置
请参考 MongoDB 手册,了解如何使用和配置 MongoDB 进行副本集和分片等操作。
无需配置文件即可自定义配置
大多数 MongoDB 配置可以通过标志设置为 mongod 。映像的入口点被创建为将其参数传递给 mongod 。请参阅下面的示例,通过 docker run 将 MongoDB 设置为使用不同的线程和执行模型。
$ docker run --name some-mongo -d mongo --serviceExecutor adaptive
这里是一个带有 docker-compose.yml 文件的相同情况
version: '3.1'
services:
mongo:
image: mongo
command: --serviceExecutor adaptive
若要查看所有可能的选项,请查看 mongod 上的 MongoDB 手册或查看 mongod 的 --help 输出:
$ docker run -it --rm mongo --help
设置 WiredTiger 缓存大小限制
默认情况下,Mongo 将把 wiredTigerCacheSizeGB 设置为与主机总内存成比例的值,而不管您可能对容器施加的内存限制。在这种情况下,您需要考虑到容器中可能运行的其他进程也会使用内存,将缓存大小设置为适当的值。
以上面的示例为例,您可以将缓存大小配置为使用 1.5GB,如下所示:
$ docker run --name some-mongo -d mongo --wiredTigerCacheSizeGB 1.5
请参阅上游的“WiredTiger 选项”文档以获取更多详细信息。
使用自定义的 MongoDB 配置文件
对于更复杂的配置设置,您仍然可以使用 MongoDB 配置文件。 mongod 默认情况下不会读取配置文件,因此需要指定带有配置文件路径的 --config 选项。创建自定义配置文件,并通过创建自定义 Dockerfile FROM mongo 或将其从主机挂载到容器中来将其放入容器中。有关配置文件选项的完整列表,请参阅 MongoDB 手册。
例如, /my/custom/mongod.conf 是自定义配置文件的路径。然后按照以下方式启动 MongoDB 容器:
$ docker run --name some-mongo -v /my/custom:/etc/mongo -d mongo --config /etc/mongo/mongod.conf
环境变量
启动 mongo 映像时,您可以通过在 docker run 命令行上传递一个或多个环境变量来调整 MongoDB 实例的初始化。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:任何预先存在的数据库在容器启动时始终保持不变。
MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD
这些变量结合使用,创建一个新用户并设置该用户的密码。此用户在 admin 身份验证数据库中创建,并被赋予 root 角色,这是一个“超级用户”角色。
以下是使用这两个变量创建 MongoDB 实例,然后使用 mongosh cli(在 mongo 版本中使用 4.x )连接到 admin 身份验证数据库的示例。
$ docker run -d --network some-network --name some-mongo \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo
$ docker run -it --rm --network some-network mongo \
mongosh --host some-mongo \
-u mongoadmin \
-p secret \
--authenticationDatabase admin \
some-db
> db.getName();
some-db
创建用户时需要这两个变量。如果两者都存在,则 MongoDB 将启用身份验证( mongod --auth )。
在 MongoDB 中进行身份验证相当复杂,因此更复杂的用户设置明确地通过 /docker-entrypoint-initdb.d/ 留给用户(有关更多详细信息,请参阅下面的初始化新实例和身份验证部分)。
MONGO_INITDB_DATABASE
此变量允许您在 /docker-entrypoint-initdb.d/*.js 中指定要用于创建脚本的数据库名称(请参阅下面的初始化新实例)。MongoDB 从根本上是为“首次使用时创建”而设计的,因此,如果您没有使用 JavaScript 文件插入数据,则不会创建数据库。
Docker 机密
作为通过环境变量传递敏感信息的替代方法,可以将 _FILE 添加到前面列出的环境变量中,导致初始化脚本从容器中存在的文件加载这些变量的值。特别是,这可用于从存储在 /run/secrets/<secret_name> 文件中的 Docker 机密加载密码。例如:
$ docker run --name some-mongo -e MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo-root -d mongo
当前,这仅支持 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD 。
初始化一个新实例
当容器第一次启动时,它将执行在 /docker-entrypoint-initdb.d 中找到的扩展名为 .sh 和 .js 的文件。文件将按字母顺序执行。 .js 文件将由 mongosh (在 6 以下的版本中为 mongo )使用 MONGO_INITDB_DATABASE 变量指定的数据库执行,如果存在,否则使用 test 。您也可以在 .js 脚本中切换数据库。
身份验证
如前所述,MongoDB 中的身份验证相当复杂(尽管默认情况下是禁用的)。有关 MongoDB 如何处理身份验证的详细信息,请参阅相关的上游文档:
除了上面记录的 /docker-entrypoint-initdb.d 行为(这是一种为不太复杂的部署配置用户进行身份验证的简单方法)之外,此映像还支持 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD ,用于在 admin 身份验证数据库中创建具有角色 root 的简单用户,如上面的环境变量部分所述。
注意事项
存储数据的位置
重要提示:在 Docker 容器中运行的应用程序使用的数据有多种存储方式。我们鼓励 mongo 映像的用户熟悉可用的选项,包括:
- 让 Docker 通过使用其自己的内部卷管理将数据库文件写入主机系统的磁盘来管理数据库数据的存储。这是默认设置,对用户来说简单且相当透明。缺点是,对于直接在主机系统上运行的工具和应用程序(即在容器外部运行),可能很难找到这些文件。
- 在主机系统(容器外部)上创建一个数据目录,并将其挂载到容器内部可见的目录。这将数据库文件放置在主机系统上的已知位置,并使主机系统上的工具和应用程序可以轻松访问这些文件。缺点是用户需要确保目录存在,并且例如主机系统上的目录权限和其他安全机制已正确设置。
警告(Windows 和 OS X):在 Windows 和 OS X 上运行基于 Linux 的 MongoDB 映像时,用于在主机系统和 Docker 容器之间共享的文件系统与 MongoDB 使用的内存映射文件不兼容(docs.mongodb.org 和相关的 jira.mongodb.org 错误)。这意味着无法将具有映射到主机的数据目录的 MongoDB 容器运行。为了在容器重启之间保留数据,我们建议使用本地命名卷代替(请参阅 docker volume create )。或者,您也可以在 Windows 上使用基于 Windows 的映像。
Docker 文档是了解不同存储选项和变体的良好起点,并且有多个博客和论坛帖子在这方面进行了讨论并提供了建议。我们将在此处简单地展示上述后一种选择的基本过程:
-
在主机系统的合适卷上创建一个数据目录,例如
/my/own/datadir。 -
像这样启动你的
mongo容器:$ docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo
该命令的 -v /my/own/datadir:/data/db 部分将底层主机系统中的 /my/own/datadir 目录挂载为容器内的 /data/db ,默认情况下 MongoDB 将在其中写入其数据文件。
此图像还为 /data/configdb 定义了一个卷,以便与 --configsvr 一起使用(有关详细信息,请参阅 docs.mongodb.com)。
创建数据库转储
大多数正常工具都可以工作,尽管在某些情况下,它们的使用可能有点复杂,以确保它们可以访问 mongod 服务器。确保这一点的一种简单方法是使用 docker exec 并从同一容器中运行该工具,类似于以下内容:
$ docker exec some-mongo sh -c 'exec mongodump -d <database_name> --archive' > /some/path/on/your/host/all-collections.archive
图像变体
mongo 图像有多种类型,每种都针对特定的用例进行了设计。
mongo:<version>
这是默认的镜像。如果您不确定自己的需求是什么,您可能想要使用这个。它被设计为既可以用作一次性容器(挂载您的源代码并启动容器以启动您的应用程序),也可以用作构建其他镜像的基础。
其中一些标签可能具有诸如 focal、jammy 或 noble 之类的名称。这些是 Ubuntu 发布的套件代号,表明该映像基于哪个版本。如果您的映像需要安装映像附带的任何其他软件包,您可能需要明确指定其中一个,以最大程度减少在有新的 Ubuntu 版本发布时出现故障的可能性。
mongo:<version>-windowsservercore
此映像基于 Windows Server Core ( microsoft/windowsservercore )。因此,它仅在该映像适用的位置工作,例如 Windows 10 专业版/企业版(周年纪念版)或 Windows Server 2016。
有关如何在 Windows 上运行 Docker 的信息,请参阅 Microsoft 提供的相关“快速入门”指南:
许可证
查看此映像中包含的软件的许可证信息。
需要注意的是,2018 年 10 月 16 日之后的所有版本都从 AGPL 变更为 SSPLv1。
与所有 Docker 镜像一样,这些镜像可能还包含其他软件,这些软件可能受其他许可证的约束(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。
一些能够自动检测到的额外许可证信息可能会在 repo-info 存储库的 mongo/ 目录中找到。
对于任何预构建的映像使用,映像用户有责任确保对此映像的任何使用都符合其中包含的所有软件的任何相关许可证。
