想象一下,您正在笔记本电脑上进行开发,使用 docker 将应用程序容器化,以实现一致性和易于部署。 您当前的项目涉及使用 minio 进行对象存储,并且您在 docker 中设置得很好。 但这里有一个转折点:您的工作流程需要 Minio 与 localhost 上运行的 flask 应用程序进行交互,以处理事件和执行函数(在 minio 的上下文中称为事件通知和对象 lambda)。
在此设置中可能遇到的常见障碍之一是与网络相关的错误,通常表现为“错误 (flask-notification:webhook):d ial tcp 1270.0.1:5000”..
此错误表示运行 Minio 的 Docker 容器与 localhost 上托管的 Flask 应用程序之间存在根本的网络错位。 从本质上讲,当 Docker 内部的 Minio 尝试向 Flask 应用程序发送事件通知时,它会尝试连接到 localhost:5000。 但是,在 Docker 的上下文中,localhost 指的是 Docker 容器本身,而不是运行 Flask 应用的主机。 这会导致 minio 尝试在其容器内的 localhost:5000 上建立与服务的连接,而该容器中不存在该服务,从而导致连接被拒绝。
此方案强调了需要清楚地了解 docker 网络,尤其是在 docker 容器中如何以不同的方式解释 localhost。
然后,本指南将深入重新校准此通信的有效策略,以确保 docker 中的 minio 可以成功向主机上运行的 flask 应用程序发送事件通知。 通过应对这一挑战,我们创建了一个与生产设置非常相似的开发环境,从而提高了工作流程的可靠性和有效性。
本演练将指导您完成设置此环境的过程。 首先,我们将在 docker 中设置 minio,确保它被正确配置为发出事件。 然后,我们将继续讨论旨在响应这些事件的 Flask 应用程序。 本指南的关键部分将重点介绍如何在 minio 容器和 localhost 上运行的 flask 应用程序之间进行通信。 我们将解决常见的障碍,例如 docker 网络、地址解析和数据一致性。
Minio 事件通知错误演示:“错误(flask-notification:webhook):拨打 TCP 1270.0.1:5000:连接:连接被拒绝”。
当在 docker 容器中运行的 minio 无法连接到本地主机时,在本例中为主机上的 flask 应用程序。
我们在 docker-minio 屏幕截图中遇到的连接错误,其特征是消息 (flask-notification:webhook): dial tcp 1270.0.1:5000:连接:连接被拒绝,这最初看起来很复杂。 然而,仔细分析会揭示其根本原因。 代码片段 flask-notification:webhook 标识问题的根源——它是 minio 与我们的 flask 应用程序交互的机制。 短语拨号 tcp 1270.0.1:5000 表示 Minio 正在努力与 Flask 应用程序建立 TCP 连接,该应用程序可能位于 localhost:5000。 关键部分“连接被拒绝”表示 Minio 无法在指定地址访问 Flask 应用程序,这凸显了容器化网络的基本挑战。
为了解决这个问题,Minio 和 Flask 之间清晰直接的通信路径至关重要。 对于 Flask 托管在同一台机器上但在 Docker 之外的场景,解决方案包括配置 Minio 以连接到主机docker.internal:5000。这个特定的 DNS 地址就像一条直线,使容器内的 minio 能够访问主机上的 Flask 应用程序。
本指南基于 docker to localhost 目录中 GitHub Minio blog-assets 存储库中提供的已准备好的资产。 在这里,我提供了本指南中讨论的任何内容的来源**,在此存储库的核心,您将找到:
自述文件:此自述文件md 包含用于执行从 docker 到 localhost 的平稳航行中执行的操作的命令(本文)。
Flask 应用程序文件:这个主py 文件构成了 Flask 应用程序,作为我们设置中的关键组件。 它是量身定制的,可以与minio服务进行有效交互。
Flask 应用的 Docker 文件:此 Dockerfile 是用于创建 Docker 容器的蓝图。 它定义了生成和运行 Flask 应用程序的环境,确保不同设置之间的一致性。
docker compose 文件:作为编排器,这个 docker-composeYAML 定义了多个容器(如 Minio 和 Flask)如何在 Docker 环境中共存和通信。
在将 Flask 应用程序与 Dockerized Minio 服务集成的上下文中,让我们深入了解 Flask 应用程序的配置。 具体来说,我设置了一个标识符为“flask-minio-event”的 flask 端点,该端点旨在充当 Minio 的 webhook 事件的接收者,如以下屏幕截图所示:
下面是我们的 Flask 应用程序的演示,它在我们的本地机器上运行,并在端口 5000 上提供 minio 事件路由
from flask import flask, request, jsonify
import logging
import os
from dotenv import load_dotenv
app = flask(__name__)
load_dotenv()
logging.basicconfig(level=logging.info)
iapp.route('/minio_event', methods=['post'])
def log_bucket_event():
logs events received from minio to the python logger.
event_data = request.json
logging.info(f"event received: ")
return jsonify()
if __name__ == '__main__':
port = int(os.getenv('flask_port', 5000))
debug_mode = os.getenv('flask_debug', 'false') == 'true'
app.run(host='0.0.0.0', port=port, debug=debug_mode)
在上一节中,我们了解了 Docker 容器如何解释“localhost”,这是确保 Flask 应用程序正确接收来自 Docker 化 minio 实例的通知的重要考虑因素。
这个 Flask 应用程序更具体地配置为接收和记录来自 Minio 的事件。 端点 minio 事件设置为侦听 POST 请求,这应该是来自 minio 的事件通知。 请注意,应用程序在端口 5000 上运行,并配置为可从所有网络接口 (0.0.0.0) 访问,这对于接收来自在 docker 容器内运行的 minio 的请求至关重要。
部署 minio 容器以与 Flask API 等 localhost 服务交互需要特定的 Docker 网络配置。 此设置对于容器和本地计算机之间的无缝通信至关重要,尤其是对于本地开发或测试方案。
为此,必须将 minio 容器配置为使用主机的网络。 此方法允许容器直接与主机上运行的服务(如 Flask 应用程序)进行交互。 这在 Flask 应用程序需要在 Minio 中访问或存储数据的开发环境中特别有用。
此配置的命令简单而强大:
docker run --name minio --network="host" minio/minio server /data
使用 --network=“host” 选项可以消除 docker 默认网络桥接和端口**的复杂性。 这是一种更简单、更直接的方法,可以确保 minio 容器可以访问 localhost 上运行的任何服务,而不仅仅是 flask 应用程序。 这使得minio容器适用于广泛的本地服务,简化了开发和测试过程。
您可以使用 docker 网络功能(例如自定义网络或 docker compose)来促进容器之间的通信。 通过将两个容器放在同一个网络上,它们可以使用其容器名称作为主机名进行通信。
使用 Docker Compose 促进名为 Minio 的 minio 容器与指定为服务的名为 FlaskApp 的 Flask 应用容器之间的通信示例:
version: '3.8'
services:
minio:
image: minio/minio
command: server /data
ports:
extra_hosts:
host.docker.internal:host-gateway"
networks:
mynetwork
flaskapp:
image: python:3.9 # use an official python image
command: >
sh -c "pip install flask
flask_app=main.py flask_run_host=0.0.0.0 flask run" # install flask and run the app
volumes:
/app:/app # mount your flask app directory
working_dir: /app # set working directory to your app directory
ports:
depends_on:
minionetworks:
mynetwork
networks:
mynetwork:
driver: bridge
此设置将托管主机docker.内部映射到主机的 IP 地址,允许容器通过添加额外的 hosts 参数来访问主机上的服务。 此设置允许 minio 托管主机docker.Internal 被标识为主机,从而弥合了容器到主机的通信差距。 这是针对常见 docker 挑战的智能解决方法,可确保 minio 可以连接到主机上的服务,例如我们的 flask 应用程序。
此外,通过将 flask 安装包含在 docker-compose 文件中,我们将使应用程序侦听 00.0.0。此更改对于其他容器和主机的可访问性至关重要,从而扩展了 Flask 应用的通信范围。 对于烧瓶也可以容器化的设置来说,这是必不可少的步骤。
Flask 服务中的 Depend On 指令可确保有序启动顺序。 通过仅在 minio 运行后启动 Flask 应用程序,我们可以避免潜在的计时问题。 这种安排模拟了具有精心管理的服务依赖关系的生产环境,为我们的本地开发设置增加了健壮性。
这些示例是针对 dockerized minio 设置量身定制的,以确保与主机上运行的服务进行有效通信。 请注意安全隐患,尤其是在调整网络设置或公开端口时,并选择满足安全和体系结构要求的解决方案。我们已经研究了 Docker 网络的细微差别,揭示了如何有效地将 Docker 容器与本地主机环境桥接起来,以便 Docker 化的 minio 服务可以有效地与主机上运行的 Flask 应用程序进行通信。 对于希望在不影响本地开发的灵活性和便利性的情况下利用 Docker 的强大功能的开发人员来说,这些见解至关重要。
了解 Docker 网络不仅仅是技术上的需要;这是朝着掌握容器化环境迈出的一步。 在当今的云原生开发环境中,设置和管理这些交互的能力是一项要求。 无论您是在笔记本电脑上进行开发还是在全球范围内部署,这些技能都能确保您的应用程序保持稳健、可扩展和安全。
在开发云原生软件时,了解和实施最佳实践非常重要。 Docker 生态系统在不断发展。 您可以通过基于容器和对象存储的架构快速利用最新、最出色的云原生技术。 保持好奇心,不断探索。
Minio 支持这种探索。 Minio 容器化、Kubernetes 原生和 S3 API 兼容性让您可以自由地编写在任何地方一致可靠地运行的脚本。
祝您在 docker 和 minio 的旅程中好运。 愿您的发展稳定,您的解决方案安全,您的学习习继续。 如果您有任何问题,我们随时为您提供帮助,欢迎访问minio中国并向我们提出更多问题。