MongoDB标准软件基于Bitnami MongoDB 构建。当前版本未7.0.5
你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作
配置文件地址: https://gitee.com/qingplus/qingcloud-platform
Qinghub Studio 在线体验
使用Docker 容器网络,应用程序容器可以轻松访问容器内运行的 MongoDB® 服务器。
连接到同一网络的容器可以使用容器名称作为主机名来相互通信。
在此示例中,我们将创建一个 MongoDB® 客户端实例,该实例将连接到与客户端在同一 Docker 网络上运行的服务器实例。
docker network create app-tier --driver bridge
使用命令–network app-tier的参数, docker run将 MongoDB® 容器连接到网络app-tier。
docker run -d --name mongodb-server \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
最后,我们创建一个新的容器实例来启动 MongoDB® 客户端并连接到上一步中创建的服务器:
docker run -it --rm \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest mongo --host mongodb-server
如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。但是,我们将显式定义一个bridge名为app-tier的新网络。在此示例中,我们假设您希望从您自己的自定义应用程序映像连接到 MongoDB® 服务器,该映像在以下代码片段中通过服务名称进行标识myapp。
version: '2'
networks:
app-tier:
driver: bridge
services:
mongodb:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
networks:
- app-tier
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- app-tier
重要:
替换YOUR_APPLICATION_IMAGE占位符
在您的应用程序容器中,使用主机名mongodb连接到 MongoDB® 服务器
启动容器:
docker-compose up -d
当容器第一次执行时,它将执行扩展名为.sh和.js的文件,位于/docker-entrypoint-initdb.d.
为了将自定义文件放入 docker 映像中,您可以将它们挂载为卷。
可以通过以下环境变量将额外的命令行标志传递给 mongod 服务命令:
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_EXTRA_FLAGS='--wiredTigerCacheSizeGB=2' registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_EXTRA_FLAGS=--wiredTigerCacheSizeGB=2
...
可以通过以下环境变量配置系统日志详细级别:
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_SYSTEM_LOG_VERBOSITY='3' registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_SYSTEM_LOG_VERBOSITY=3
...
为了启用使用 numactl 启动命令,请将MONGODB_ENABLE_NUMACTL变量设置为 true。有关这方面的更多信息,请查看官方 [MongoDB 文档][( https://docs.mongodb.com/manual/administration/development-notes/#configuring-numa-on-linux )
可以通过以下环境变量启用/禁用 IPv6:
docker run --name
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_IPV6=yes
...
可以通过以下环境变量启用/禁用directoryPerDB :
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_ENABLE_DIRECTORY_PER_DB=yes registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_DIRECTORY_PER_DB=yes
...
可以通过以下环境变量启用/禁用日志:
docker run --name mongodb -e ALLOW_EMPTY_PASSWORD=yes -e MONGODB_ENABLE_JOURNAL=true registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MONGODB_ENABLE_JOURNAL=true
...
首次运行映像时传递环境变量会将MONGODB_ROOT_USER的密码设置为MONGODB_ROOT_PASSWORD的值。并在 MongoDB® 服务器上启用身份验证。如果未设置MONGODB_ROOT_USER,则默认为root.
docker run --name mongodb \
-e MONGODB_ROOT_PASSWORD=password123 registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- MONGODB_ROOT_PASSWORD=password123
...
用户MONGODB_ROOT_USER配置为具有 MongoDB® 服务器的完全管理访问权限。如果MONGODB_ROOT_PASSWORD未指定,服务器允许未经身份验证且不受限制的访问。
您可以在首次启动容器时创建对数据库具有受限访问权限的用户。为此,请提供MONGODB_USERNAME、MONGODB_PASSWORD和MONGODB_DATABASE环境变量。
docker run --name mongodb \
-e MONGODB_USERNAME=my_user -e MONGODB_PASSWORD=password123 \
-e MONGODB_DATABASE=my_database registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者通过修改docker-compose.yml文件:
services:
mongodb:
...
environment:
- MONGODB_USERNAME=my_user
- MONGODB_PASSWORD=password123
- MONGODB_DATABASE=my_database
...
警告!
创建用户可以在 MongoDB® 服务器上进行身份验证,因此不允许任何用户进行未经身份验证的访问。
可以使用以下环境变量复制集群:
primary
/secondary
/arbiter
没有默认值。注意:副本集场景下节点总数不能超过8个(1个主节点、6个从节点和1个仲裁节点)
第一步是启动 MongoDB® 主数据库。
docker run --name mongodb-primary \
-e MONGODB_REPLICA_SET_MODE=primary \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-primary \
-e MONGODB_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中,容器被配置为primary,使用MONGODB_REPLICA_SET_MODE参数。
接下来我们启动一个 MongoDB® 辅助容器。
docker run --name mongodb-secondary \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=secondary \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中,容器被配置为secondary使用MONGODB_REPLICA_SET_MODE参数。MONGODB_INITIAL_PRIMARY_HOST和参数MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于连接 MongoDB® 主数据库。
最后我们启动一个 MongoDB® 仲裁器容器。
docker run --name mongodb-arbiter \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=arbiter \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中,容器被配置为arbiter使用MONGODB_REPLICA_SET_MODE参数。MONGODB_INITIAL_PRIMARY_HOST和参数MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于连接 MongoDB® 主数据库。
您现在已经启动并运行了一个三节点 MongoDB® 复制集群,可以通过添加/删除辅助节点来扩展该集群。
如果我们想要一个复制hidden 节点,我们启动一个 MongoDB® hidden容器。
docker run --name mongodb-hidden \
--link mongodb-primary:primary \
-e MONGODB_REPLICA_SET_MODE=hidden \
-e MONGODB_ADVERTISED_HOSTNAME=mongodb-hidden \
-e MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary \
-e MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017 \
-e MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123 \
-e MONGODB_REPLICA_SET_KEY=replicasetkey123 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
在上面的命令中,容器被配置为hidden使用MONGODB_REPLICA_SET_MODE参数。MONGODB_INITIAL_PRIMARY_HOST和参数MONGODB_INITIAL_PRIMARY_PORT_NUMBER用于连接 MongoDB® 主数据库。
通过 Docker Compose,可以使用以下命令设置副本集:
version: '2'
services:
mongodb-primary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
- MONGODB_REPLICA_SET_MODE=primary
- MONGODB_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
- 'mongodb_master_data:/bitnami'
mongodb-secondary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary
- MONGODB_REPLICA_SET_MODE=secondary
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
mongodb-arbiter:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-arbiter
- MONGODB_REPLICA_SET_MODE=arbiter
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
mongodb_master_data:
driver: local
并使用以下命令运行 docker-compose:
docker-compose up --detach
如果您想使用 docker-compose 参数扩展辅助节点的数量–scale,则不得在 mongodb-secondary 和 mongodb-arbiter 定义中设置 MONGODB_ADVERTISED_HOSTNAME。
version: '2'
services:
mongodb-primary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
environment:
- MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
- MONGODB_REPLICA_SET_MODE=primary
- MONGODB_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
- 'mongodb_master_data:/bitnami'
mongodb-secondary:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=secondary
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
mongodb-arbiter:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=arbiter
- MONGODB_INITIAL_PRIMARY_HOST=mongodb-primary
- MONGODB_INITIAL_PRIMARY_PORT_NUMBER=27017
- MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD=password123
- MONGODB_REPLICA_SET_KEY=replicasetkey123
volumes:
mongodb_master_data:
driver: local
然后使用以下命令运行 docker-compose:
docker-compose up --detach --scale mongodb-primary=1 --scale mongodb-secondary=3 --scale mongodb-arbiter=1
上述命令将辅助节点的数量增加到3。您可以用同样的方法缩小规模。
注意:您不应增加/减少主节点的数量。始终只有一个主节点在运行。
注意:在这种情况下,客户端必须位于同一个 docker 网络中才能访问所有节点。
副本集配置中有四种不同的角色(primary, secondary, hidden or arbiter)。这些角色中的每一个都以不同的方式配置:
primary节点配置:
副本集通过rs.initiate()命令和一些配置选项启动,以强制主数据库成为主数据库。基本上,优先级从默认值 (1) 增加到 5。为了验证主节点实际上是主节点,我们使用命令对其进行验证db.isMaster().ismaster。
主节点附加了一个卷,因此只要该卷存在,数据就会在部署之间保留。
此外,主节点初始化脚本将检查文件夹/bitnami/mongodb是否存在文件.initialized,以判断是否应该创建新的副本集,或者相反,副本集已经被初始化。
如果主节点被杀死并且卷被删除,为了在同一个副本集中再次启动它,重要的是使用原始 IP 启动容器,以便副本集的其他成员已经知道它。
secondary节点配置:
一旦主节点启动并运行,我们就可以开始添加辅助节点(和仲裁器)。为此,辅助节点连接到主节点并使用命令将自身添加为辅助节点rs.add(SECONDARY_NODE_HOST)。
添加辅助节点后,我们通过执行查看它们rs.status().members是否出现在列表中来验证它们是否已成功添加。
arbiter节点配置:
仲裁器遵循与辅助节点相同的过程,但将其添加到副本集的命令是rs.addArb(ARBITER_NODE_HOST)。当主节点与从节点之和为偶数时,应添加仲裁器。
hidden节点配置:
最后,隐藏节点遵循与辅助节点相同的过程,除了将其添加到副本集的命令为rs.add(host: HIDDEN_NODE_HOST, hidden: true, priority: 0})。
该容器支持通过设置 和MONGODB_EXTRA_FLAGS环境MONGODB_CLIENT_EXTRA_FLAGS变量以及正确的MONGODB_ADVERTISED_HOSTNAME. 在启动集群之前,您需要根据 Mongo 的要求生成 PEM 证书 - 一种方法是使用openssl(参见http://www.openssl.org)创建自签名证书。
按所述生成的证书不用于生产用途
openssl genrsa -out mongoCA.key 2048
openssl req -x509 -new \
-subj "/C=US/ST=NY/L=New York/O=Example Corp/OU=IT Department/CN=mongoCA" \
-key mongoCA.key -out mongoCA.crt
export NODE_NAME=mongodb-primary
openssl req -new -nodes \
-subj "/C=US/ST=NY/L=New York/O=Example Corp/OU=IT Department/CN=${NODE_NAME}" \
-keyout ${NODE_NAME}.key -out ${NODE_NAME}.csr
openssl x509 \
-req -days 365 -in ${NODE_NAME}.csr -out ${NODE_NAME}.crt \
-CA mongoCA.crt -CAkey mongoCA.key -CAcreateserial -extensions req
cat ${NODE_NAME}.key ${NODE_NAME}.crt > ${NODE_NAME}.pem
注意:此后您不需要证书签名请求。
rm ${NODE_NAME}.csr
重复此过程,为集群中的所有节点生成 PEM 捆绑包。
生成证书并使它们可用于正确挂载点(如:/certificates/)的容器后,可以按照以下示例设置环境变量。
主节点的设置示例mongodb-primary:
MONGODB_ADVERTISED_HOSTNAME=mongodb-primary
MONGODB_EXTRA_FLAGS=–tlsMode=requireTLS --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsClusterFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
MONGODB_CLIENT_EXTRA_FLAGS=–tls --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
辅助节点的相应设置示例mongodb-secondary:
MONGODB_ADVERTISED_HOSTNAME=mongodb-secondary
MONGODB_EXTRA_FLAGS=–tlsMode=requireTLS --tlsCertificateKeyFile=/certificates/mongodb-secondary.pem --tlsClusterFile=/certificates/mongodb-secondary.pem --tlsCAFile=/certificates/mongoCA.crt
MONGODB_CLIENT_EXTRA_FLAGS=–tls --tlsCertificateKeyFile=/certificates/mongodb-secondary.pem --tlsCAFile=/certificates/mongoCA.crt
按照指定成功启动集群后,在容器内应该可以使用以下命令连接到主节点上的 mongo 守护进程:
/opt/bitnami/mongodb/bin/mongo -u ${MONGODB_ROOT_USER} -p ${MONGODB_ROOT_PASSWORD} --host mongodb-primary --tls --tlsCertificateKeyFile=/certificates/mongodb-primary.pem --tlsCAFile=/certificates/mongoCA.crt
注意:我们仅支持–clusterAuthMode=keyFile此配置。
还允许客户端使用用户名和密码进行连接(无需 X509 证书):https://docs.mongodb.com/manual/reference/configuration-options/#net.ssl.allowConnectionsWithoutCertificates
有关相关配置选项的更多详细信息:https://docs.mongodb.com/manual/reference/program/mongod/#tls-ssl-options
从宿主机挂载卷到/bitnami/mongodb/conf/,并复制/编辑相关文件到/path/to/mongodb-configuration-persistence/. 如果该目录为空,则默认配置将被填充到该/opt/bitnami/mongodb/conf/目录中。
运行 MongoDB® 映像,从主机安装目录。
docker run --name mongodb -v /path/to/mongodb-configuration-persistence:/bitnami/mongodb/conf registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或使用 Docker Compose:
...
services:
mongodb:
...
volumes:
- 'mongodb_data:/bitnami/mongodb'
+ - /path/to/mongodb-configuration-persistence:/bitnami/mongodb/conf
...
使用您喜欢的编辑器编辑主机上的配置。
vi /path/to/mongodb-configuration-persistence/mongodb.conf
更改配置后,重新启动 MongoDB® 容器以使更改生效。
docker restart mongodb
或使用 Docker Compose:
docker-compose restart mongodb
有关 MongoDB® 配置选项的完整列表,请参阅配置文件选项手册。
docker logs mongodb
或使用 Docker Compose:
docker-compose logs mongodb
如果您希望以不同方式使用容器日志,您可以使用该选项配置容器日志记录驱动程序。–log-driver在默认配置中,docker 使用json-file驱动程序。
docker pull registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或者,如果您使用的是 Docker Compose,请将image属性的值更新为registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest.
使用命令停止当前正在运行的容器
docker stop mongodb
或使用 Docker Compose:
docker-compose stop mongodb
接下来,使用持久卷的快照/path/to/mongodb-persistence:
rsync -a /path/to/mongodb-persistence /path/to/mongodb-persistence.bkp.$(date +%Y%m%d-%H.%M.%S)
如果升级失败,您可以使用此快照来恢复数据库状态。
docker rm -v mongodb
或使用 Docker Compose:
docker-compose rm -v mongodb
从新image重新创建容器。
docker run --name mongodb registry.cn-hangzhou.aliyuncs.com/qingcloudtech/mongodb:latest
或使用 Docker Compose:
docker-compose up mongodb