【问题标题】:How to setup the connection to MongoDB's Docker container in GCP如何在 GCP 中设置与 MongoDB Docker 容器的连接
【发布时间】:2023-03-04 01:22:01
【问题描述】:

我需要帮助我在 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 阻止吗?

干杯

【问题讨论】:

    标签: python mongodb docker google-cloud-platform pymongo


    【解决方案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": "stackoverflow", "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。
    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2022-11-11
    • 2019-01-12
    • 2016-10-05
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2023-02-14
    相关资源
    最近更新 更多