Docker容器无法连接到远程MongoDB

9
我有一个基于flask的python代码,它简单地连接到mongodb。它有两个路由:GetPostGet只是简单地打印出“hello world”,而使用Post可以发布任何json数据,这些数据随后保存在MongoDB中。该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()

MongoDB运行在哪里?容器能够连接到它吗?你在那里使用什么主机名? - Thilo
@Thilo MongoDB托管在云上。当仅运行Python代码并在本地主机上进行Post时,一切正常,但是从容器端执行同样的操作时会显示错误。我该如何检查容器是否连接到mongo? - S Andrew
2
您能否启动一个 shell 进入容器,并使用 mongo 命令行客户端? - Thilo
如果您自己启动了服务,那么您是在哪里和如何托管MongoDB? - Luis Orduz
你能添加更多信息吗?例如来自容器的日志,调试MongoClient的输出等。 - Julian Camilleri
显示剩余4条评论
1个回答

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)或者将DNS明确设置为docker,将其添加到/etc/docker/daemon.json文件中,并重新启动docker。
{
    "dns": ["my.dns.server"]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接