如何在 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 容器的连接的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接
如何在 PEP484 之后的方法参数中设置与类相同的类型? [复制]
如何在 Perl 中设置与 DBIx::Class 的多主列 1:n 关系?