如何在 GCP 中设置与 MongoDB Docker 容器的连接

Posted

技术标签:

【中文标题】如何在 GCP 中设置与 MongoDB Docker 容器的连接【英文标题】:How to setup the connection to MongoDB's Docker container in GCP 【发布时间】:2022-01-06 11:36:09 【问题描述】:

我需要帮助我在 GCP 中设置两个虚拟机之间的连接。

我在 Google Compute Engine 中设置了第一个 VM,它使用容器优化操作系统 (cos-stable-93-16623-39-21) 并安装了 Docker,运行 MongoDB 映像 (mongo:5.0.4 )。我想在 GCP 上使用 Docker 和 Python 脚本创建另一个 VM,并使用 Python 和 Mongo 的 Python 驱动程序从它连接到 Mongo 数据库。

我怎样才能实现它?对于 Python 驱动,我需要一些 Mongo 数据库的 URL,但是如何获取我需要的 URL,它会被 Docker 阻止吗?

干杯

【问题讨论】:

【参考方案1】:

您需要在 mongo 部署中公开端口,然后您将使用运行 mongodb 的主机的 IP 地址从第二个 VM 连接到它(或者您也可以使用 fqdn) .然后你需要确保防火墙允许这样的通信。

用一个简单的例子更新:

mongo 虚拟机:

user@instance-mongo ~ $ docker run -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=example -p 27017:27017 -d mongo

user@instance-mongo ~ $ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                      PORTS                                           NAMES
ae19ede390eb   mongo     "docker-entrypoint.s…"   3 seconds ago        Up 2 seconds                0.0.0.0:27017->27017/tcp, :::27017->27017/tcp   frosty_bardeen

python 实例:

user@instance-python ~ $ docker run -it --rm python:3-alpine sh
/ #
/ # pip install ipython pymongo
...<omitted for brevity>
/ # ipython
Python 3.10.0 (default, Nov 13 2021, 03:23:03) [GCC 10.3.1 20210424]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.30.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from pymongo import MongoClient
In [2]: client = MongoClient('mongodb://instance-mongo:27017')
In [3]: client.admin.command('ping')
Out[3]: 'ok': 1.0

如您所见,我在 mongo 部署中暴露了端口 27017,然后从 python 实例连接到 instance-mongo(虚拟机的主机名)并发送了一个 mongo ping 命令。

示例 2:

mongo 虚拟机:

user@instance-mongo ~ $ docker run -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=example -e MONGO_INITDB_DATABASE=initdb -p 27017:27017 -d mongo
c541d683279802b2fd90f7e8ca1a8f5f74562b31170f0c80977a60387b74a595

python 虚拟机:

<installed pymongo, ipython>
/ # ipython

# createing a client and pinging the db
In [1]: client = MongoClient('mongodb://root:example@instance-mongo:27017')
In [2]: client.initdb.command('ping')
Out[2]: 'ok': 1.0

# db instance and checking for the list of collections
In [3]: db = client["initdb"]
In [4]: db.list_collection_names()
Out[4]: []

# collection instance and document instance
In [5]: collection = db['example_collection']
In [6]: document = "name": "Corgam", "source": "***", "question": 70157757

# inserting the document and listing collections again
In [7]: collection.insert_one(document)
In [8]: db.list_collection_names()
Out[8]: ['example_collection']

【讨论】:

您是否有关于 GCP 中两个虚拟机之间此类通信的教程?也许还有一些在 Mongo 中公开端口的教程? @Corgam,我已经用一个快速示例更新了答案,说明如何公开 mongo 端口,然后从另一个实例连接到 mongo @Corgam 添加了另一个示例,以防万一:) 如果您同时运行这些虚拟机,您可以使用虚拟机的名称而不是 IP,就像我在示例中所做的那样。 云防火墙(在 VPC 网络 - 防火墙下)具有描述 VPC 内可能进行的入口和出口通信的规则。你想确保有一个规则可以做到这一点。如果您使用的是默认 VPC 并且没有删除任何默认规则,则应该有一个已经允许内部通信(如在同一 VPC 中的虚拟机之间),称为 default-allow-internal。

以上是关于如何在 GCP 中设置与 MongoDB Docker 容器的连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中设置与主页的正文图像不同的样式?

如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接

如何在 PEP484 之后的方法参数中设置与类相同的类型? [复制]

如何在 Perl 中设置与 DBIx::Class 的多主列 1:n 关系?

如何在mysql,php的单个查询中设置与自动递增ID值相同的任何列值[重复]

在 THREE.JS 中设置与两个网格的最小距离