想象一下,您正在膝上型電腦上進行開發,使用 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中國並向我們提出更多問題。