无法使用 pymongo 访问 dockerized MongoDB(使用 mongo express)- 被定向到另一个数据库

Can't access dockerized MongoDB (with mongo express) using pymongo - gets directed to another db

我正在尝试 运行 一个带有 python 与之交互的应用程序的数据库。我有数据库 运行ning 使用此 docker-compose.yml:

version: "3.8"
services:
    flask_app:
        build: ./flask_app
        container_name: flask_app
        ports:
            - "5000:5000"
    mongo:
        image: mongo:latest
        container_name: mongodb
        environment:
            - MONGO_INITDB_ROOT_USERNAME=root
            - MONGO_INITDB_ROOT_PASSWORD=pass
        volumes:
            - /data/db:/data/db
    mongo-express:
        image: mongo-express:latest
        container_name: mongo_express
        environment:
            - ME_CONFIG_MONGODB_SERVER=mongo
            - ME_CONFIG_MONGODB_PORT=27017
            - ME_CONFIG_MONGODB_ENABLE_ADMIN=true
            - ME_CONFIG_MONGODB_AUTH_DATABASE=admin
            - ME_CONFIG_MONGODB_ADMINUSERNAME=root
            - ME_CONFIG_MONGODB_ADMINPASSWORD=pass
            # Uncomment if a secure login via browser is required
            # - ME_CONFIG_BASICAUTH_USERNAME=root
            # - ME_CONFIG_BASICAUTH_PASSWORD=pass
        links:
            - mongo
        ports:
            - 8081:8081

我可以在 localhost:8081 访问数据库:

并且我希望使用 pymongo 访问相同的数据库,因为 /data/db 卷已从主机映射到容器。

但是,如下所示,我访问了另一个数据库(一个带有“todos”、“test_db”和“db”但没有“config”的数据库)[This python 运行在主机上,而不是在应用程序容器中,如果这改变了什么]:

In [1]: from pymongo import MongoClient; client = MongoClient(host='localhost', port=27017)

In [2]: client.list_database_names()
Out[2]: ['admin', 'local', 'db', 'todos', 'test_db']

我在这里错过了什么?为什么有 2 个数据库?

我们没有将容器 mongodb 的端口 27017 转发到 localhost,因此 localhost:27017 上没有应用程序 运行。

我们可以直接通过主机的 IP 地址访问容器,或者我们可以创建一个从 docker 主机到容器的端口转发,这样我们就可以访问 mongo通过 localhost:27017.

的数据库

为了实现后者,我们修改了在 docker-compose.yml 中向容器 mongodb 添加一个 ports 部分:

version: "3.8"
services:
    ...
    mongo:
        image: mongo:latest
        container_name: mongodb
        ...
        ports:
            - 27017:27017
    ...