【问题标题】:unable to run docker flask image -pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused无法运行 docker flask image -pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection denied
【发布时间】:2020-10-18 12:50:29
【问题描述】:

我已经为我有一些 html 模板的烧瓶应用程序构建了一个 docker 映像,在运行我的映像后,我转到 localhost:5000,这会将我带到我的烧瓶应用程序的起始页。我按下注册按钮以使用烧瓶端点注册用户,但我得到了

pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

在访问 localhost 之前,我使用 sudo docker start mongodb 运行我的 mongodb 映像,每当我必须在我的 monogdb 数据库中搜索端点时,连接似乎都会遇到此错误。我是否需要一个 docker-compose.yml 来连接而没有一个我无法连接?

这就是我使用 pymongo 连接到 mongodb 的方式

client = MongoClient('mongodb://localhost:27017/')
db = client['MovieFlixDB']

users = db['Users']
movies = db['Movies']

我如何运行我的烧瓶应用程序:

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

感谢您的帮助。提前谢谢你

【问题讨论】:

  • @michalk 你能举个例子吗?

标签: mongodb docker flask pymongo


【解决方案1】:

我需要 docker-compose.yml 来连接吗?没有我就无法连接 一个?

如果你使用 docker-compose 会更容易,而且不需要使用太多命令来部署。看this example(太多了不过可以参考随机服务)。

步骤-

  1. 构建您的 docker-componse 文件 [我已经修改了随机服务示例中的那个,删除了其余部分] 例如
version: '3.3'
  
services:
    web-random:
        build:
            context: .
            args:
                requirements: ./flask-mongodb-example/requirements.txt
        image: web-random-image
        ports:
            - "800:5000"
        entrypoint: python ./flask-mongodb-example/random_demo.py
        depends_on:
            - mongo

    mongo:
        image: mongo:4.2-bionic
        ports:
            - "27017:27017"
  1. 请参考this example 在您的 python 代码中更新您的 mongo URL

  2. 现在,使用以下命令来组合和调出容器

docker-compose build
docker-compose up
  1. 现在,使用浏览器浏览您的 URL 或使用 curl 命令

【讨论】:

  • 所以我可以创建这样的文件,而无需测试我的烧瓶映像,也无需担心它是否可以单独运行 mongodb 运行?
  • 您仍然需要更改 MongoDB 连接 URL 以匹配 Compose 服务名称 mongo:27017;每个容器仍然是它自己的localhost
  • @DavidMaze 是正确的。删除导致混乱的最后一点。 github.com/danionescu0/docker-flask-mongodb-example/blob/master/…
【解决方案2】:

要将容器相互连接,您应该使用网络。

  1. 首先创建一个网络
docker network create my-network
  1. 运行 mongodb 指定网络。
docker container run -d --name mongodb -p 27017:27017 --network my-network mongodb:latest
  1. 修改您的应用程序以连接到mongodb 作为主机而不是本地主机。连接到公共网络的容器可以使用可以自动解析为容器 IP 的名称(DNS 名称)相互通信。
client = MongoClient('mongodb://mongodb:27017/')

您还可以考虑通过环境变量提供此类详细信息(数据库主机、用户、密码)并在您的应用中读取它们。

  1. 使用您的应用重建映像并运行它
docker container run --name flask-app -d --network my-network my-flaskapp-image

您可以在 docker docs 中阅读有关容器网络的更多信息。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2020-07-09
    • 2019-10-06
    • 2020-05-16
    • 2018-03-30
    • 2021-12-16
    • 2013-01-03
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多