【问题标题】:Docker container not able to connect to remote MongoDBDocker 容器无法连接到远程 MongoDB
【发布时间】:2018-08-21 08:12:41
【问题描述】:

我有一个基于flask 的python 代码,它简单地连接到mongodb。它有两条路由GetPostGet 只是打印hello world 并使用Post 我们可以发布任何后来保存在MongoDB 中的json 数据这个python 代码工作正常。 MongoDB 托管在云端。

我现在已经创建了一个 Dockerfile:

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7

RUN pip3 install pymongo

ENV LISTEN_PORT=8000
EXPOSE 8000

COPY /app /app

使用命令运行

docker run --rm -it -p 8000:8000 myflaskimage

启动此 docker 映像的容器后,我收到了 GET 的响应,但没有来自 POST 的响应。我正在使用Postman 软件发布 json 数据。我收到以下错误:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

我对为什么 python 代码工作正常感到有点困惑,但是当我把它放在 docker 中并启动容器时,它会抛出错误。我们是否必须在Dockerfile 中包含任何内容才能启用与MongoDB 的连接。

请帮忙。谢谢

Python 代码:

from flask import Flask, request
from pymongo import MongoClient

app = Flask(__name__)

def connect_db():
    try:
        client = MongoClient(<mongodbURL>)
        return client.get_database(<DBname>)

    except Exception as e:
        print(e)


def main():
    db = connect_db()
    collection = db.get_collection('<collectionName>')

    @app.route('/data', methods=['POST'])
    def data():
        j_data = request.get_json()
        x = collection.insert_one(j_data).inserted_id
        return "Data added successfully"

    @app.route('/')
    def hello_world():
        return "Hello World"

main()

if __name__ == '__main__':
   app.run()

【问题讨论】:

  • mongo 在哪里运行?容器可以连接到它吗?你在那里使用什么主机名?
  • @Thilo MongoDB 托管在云上。仅运行 python 代码并在本地主机上执行 Post 时,一切正常,但从容器端执行相同操作时,会显示错误。如何检查容器是否连接到 mongo。?
  • 你能在容器中启动一个shell并使用mongo命令行客户端吗?
  • @Thilo 我试过并运行mongo 命令行clinet,但它说找不到可能是因为在Dockerfile 中我刚刚安装了pymongo 这是mongodb 的python 模块。有没有其他方法可以尝试从容器内连接到 mongodb
  • 容器和你的本地环境是否使用相同版本的pymongo

标签: python-3.x mongodb docker flask


【解决方案1】:

您可能没有来自容器的互联网连接。从容器化 Java 应用程序连接到公共 Web 服务时,我遇到了类似的问题。

一开始我会尝试重启docker:

systemctl restart docker

如果没有帮助,请查看容器中的 resolv.conf:

docker run --rm myflaskimage cat /etc/resolv.conf

如果显示nameserver 127.x.x.x那么你可以试试:

1) 在 /etc/NetworkManager/NetworkManager.conf 文件中的主机系统注释 dns=dnsmasq 行上使用 # 并使用 systemctl restart network-manager 重新启动 NetworkManager

2) 或为 docker 显式设置 DNS,将其添加到 /etc/docker/daemon.json 文件中并重新启动 docker:

{
    "dns": ["my.dns.server"]
}

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 2019-08-09
    • 2019-05-24
    • 1970-01-01
    • 2016-03-02
    • 2022-01-11
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多