尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

使用 Acorn 打包与部署 FerretDB 应用:Python Flask 应用的云原生实战

使用 Acorn 打包与部署 FerretDB 应用:Python Flask 应用的云原生实战 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一款真正开源的 MongoDB 替代方案可将 PostgreSQL 作为文档数据库后端而 Acorn 是一个基于 Kubernetes 的简化应用部署框架让开发者无需直接编写 Kubernetes YAML 即可完成云原生部署。本文以一套完整的 Python Flask Todo 应用为例讲解如何编写Acornfile将应用、FerretDB 与 PostgreSQL 后端一起打包成镜像并通过acorn run一键部署、acorn build/push完成镜像发布最终在任意 Kubernetes 环境复用这套工作流。为什么用 Acorn 部署 FerretDB 应用FerretDB 是 MongoDB 的替代方案应用通过 MongoDB 协议与 FerretDB 通信而数据实际存储在 PostgreSQL 或 SQLite 中从而避免厂商锁定。与 MongoDB 生态的高度兼容意味着任何使用pymongo、mongosh等 MongoDB 驱动与工具的应用都可以在不改动业务代码的前提下切换到 FerretDB。Acorn 则提供了位于 Kubernetes 之上的抽象层以 Docker 容器、应用配置、部署描述等应用级原语来声明整个应用。在 Acorn 的模型里Acornfile之于acorn run就如同Dockerfile之于docker build——前者描述容器、服务、应用、卷、密钥与部署信息并被编译成 Acorn 镜像。这样一个文件就能同时承载数据库、中间件与应用的全部配置。本指南将实现一个 Flask FerretDB 的 Todo 应用并使用 Acorn 完成部署、镜像构建与发布。前置条件要完成本指南需要准备Acorn CLI注册 Acorn 平台需要 GitHub 账号FerretDB 本身不需要在本机单独安装因为最终它会作为 Acorn 应用中的容器被一起构建和运行。安装 Acorn CLI安装 Acorn CLI 后即可在终端直接运行acorn命令。macOS 与 Linux 用户brew install acorn-io/cli/acornWindows 用户通过 Scoop 安装scoop install acorn安装完成后使用 GitHub 账号登录 Acorn 平台acorn login终端会引导你创建或登录Acorn 账号完成授权后回到终端即可继续后续操作。搭建 Python Flask 应用我们创建一个简单的 Todo 应用它通过pymongo连接 FerretDB后端为 PostgreSQL。先建立项目目录与文件mkdir -p my-ferret/templates cd my-ferret touch app.py requirements.txt templates/template.html Dockerfile Acornfile最终目录结构如下my-ferret/ │ ├── app.py # Python 主应用文件 ├── requirements.txt # Python 依赖清单 ├── Dockerfile # Docker 构建配置 ├── Acornfile # Acorn 部署配置 │ └── templates/ # HTML 模板目录 └── template.html # HTML 模板文件应用主代码 app.pyimport os from flask import Flask, render_template, request, redirect, url_for from pymongo import MongoClient from bson.objectid import ObjectId app Flask(__name__) db_uri os.environ[DB_URI] db_name os.environ[DB_NAME] print(DB_URI:, db_uri) print(DB_NAME:, db_name) client MongoClient(db_uri) db client[db_name] todos_collection db[todos] def redirect_url(): return request.args.get(next) or \ request.referrer or \ url_for(home) app.route(/) def home(): todo_list list(todos_collection.find({})) return render_template(template.html, todo_listtodo_list) app.route(/add, methods[POST]) def add(): title request.form.get(title) new_todo {title: title, done: False} todos_collection.insert_one(new_todo) return redirect(redirect_url()) app.route(/update/todo_id) def update(todo_id): todo todos_collection.find_one({_id: ObjectId(todo_id)}) todos_collection.update_one({_id: ObjectId(todo_id)}, {$set: {done: not todo[done]}}) return redirect(redirect_url()) app.route(/delete/todo_id) def delete(todo_id): todos_collection.delete_one({_id: ObjectId(todo_id)}) return redirect(redirect_url()) if __name__ __main__: app.run(debugTrue)应用通过 Flask 提供 Web 页面用pymongo与 FerretDB 通信——这正是 FerretDB 兼容 MongoDB 生态的体现驱动层无需任何改造。DB_URI与DB_NAME两个环境变量由 Acornfile 注入分别指向 FerretDB 的连接地址与数据库名CRUD 操作增删改查由insert_one、find_one、update_one、delete_one完成数据最终落盘到 PostgreSQL。前端模板 template.html!doctype html html langen head meta charsetUTF-8 / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleTodo App/title link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/semantic-ui2.4.2/dist/semantic.min.css / script srchttps://cdn.jsdelivr.net/npm/semantic-ui2.4.2/dist/semantic.min.js/script /head body div stylemargin-top: 50px; classui container h1 classui center aligned headerTo Do App/h1 form classui form action/add methodpost div classfield labelTodo Title/label input typetext nametitle placeholderEnter Todo... /br / /div button classui blue button typesubmitAdd/button /form hr / div classui items {% for todo in todo_list %} div classitem a href/update/{{ todo.id }} {% if todo.done False %} i classlarge square outline icon/i {% else %} i classlarge green check square icon/i {% endif %} /a div classmiddle aligned content div classheader{{ todo.title }}/div /div a href/delete/{{ todo.id }} i classred trash alternate icon/i /a /div {% endfor %} /div /div /body /html页面使用 Semantic UI 渲染 Todo 列表未完成项显示空心方框点击后可切换为绿色勾选删除按钮直接调用/delete/todo_id路由。依赖清单 requirements.txtFlask2.3.2 pymongo这两行依赖将在 Dockerfile 构建阶段安装到容器内。创建 Dockerfile 容器化 Python 应用Dockerfile 负责构建运行 Flask 应用所需的镜像设置环境、安装依赖、配置运行参数最终在隔离容器内启动服务。FROM cgr.dev/chainguard/python:latest-dev WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt --user COPY . . ENV FLASK_APP app.py ENV FLASK_ENV development ENV FLASK_RUN_HOST 0.0.0.0 ENV FLASK_RUN_PORT 8000 EXPOSE 8000 ENTRYPOINT [python, -m, flask, run]注意FLASK_RUN_HOST设为0.0.0.0确保容器外即 Acorn 的负载均衡层可以访问 8000 端口EXPOSE 8000与 Acornfile 中ports: publish: 8000/http的声明保持一致。编写 Acornfile一份文件描述整个应用Acornfile 是整个部署的核心它集中声明了 Docker 构建、数据库、密钥、容器、端口与部署信息。与 Dockerfile 构建出 Docker 镜像同理Acornfile 会被编译成 Acorn 镜像。services: postgres: { image: ghcr.io/acorn-io/postgres:v15.#-# } containers: { app: { build: context: . ports: publish: 8000/http env: { DB_URI: mongodb://{service.postgres.secrets.admin.username}:{service.postgres.secrets.admin.password}ferretdb/ferretdb?authMechanismPLAIN DB_NAME: ferretdb } dependsOn: [ ferretdb ] if args.dev { files: { /src: ./ }, env: FLASK_DEBUG: 1 } } ferretdb: { image: ferretdb/ferretdb ports: publish: 27017/tcp consumes: [postgres] env: { FERRETDB_POSTGRESQL_URL: postgres://{service.postgres.secrets.admin.username}:{service.postgres.secrets.admin.password}{service.postgres.address} } } }三个核心声明逐一拆解postgres 服务services: postgres声明了一个由 Acorn 托管的 PostgreSQL 服务镜像ghcr.io/acorn-io/postgres:v15运行在持久卷之上并提供admin凭据。默认配置下的该服务不具备高可用能力生产环境可以无缝替换为其他 PostgreSQL 服务接口如 AWS RDS for PostgreSQL——这正是 FerretDB 避免厂商锁定价值所在。Acorn 为该服务注入的admin凭据包括POSTGRES_HOST{service.db.address}POSTGRES_DB{service.db.data.dbName}POSTGRES_USER{service.db.secrets.admin.username}POSTGRES_PASSWORD{service.db.secrets.admin.password}ferretdb 容器通过consumes: [postgres]消费上述服务并用{service.postgres.xxx}变量组装FERRETDB_POSTGRESQL_URL环境变量指向 PostgreSQL 后端。这里的连接串格式与仓库中的配置体系完全一致在 配置文档 中FerretDB 通过--postgresql-url命令行标志或FERRETDB_POSTGRESQL_URL环境变量指定 PostgreSQL 连接 URL默认值为postgres://127.0.0.1:5432/postgres容器化部署时必须在环境变量中显式覆盖。仓库根目录的 docker-compose.yml 中 FerretDB 服务同样采用FERRETDB_POSTGRESQL_URLpostgres://pg-user:pg-passhost.docker.internal:5432/postgres的写法可作为对照。app 容器build: context: .让 Acorn 基于同目录 Dockerfile 构建应用镜像ports: publish: 8000/http将 8000 端口对外暴露为 HTTP 端点dependsOn: [ferretdb]保证 FerretDB 容器先就绪。DB_URI中值得注意的authMechanismPLAIN参数FerretDB 不自行存储用户认证信息详见 认证文档用户名与密码必须已存在于 PostgreSQL 中客户端携带的凭据会被校验并映射到数据库权限。dev 开发模式if args.dev块为开发场景注入files卷把源码挂载到/src并设置FLASK_DEBUG1实现本地代码改动即时生效的热加载与调试体验。使用 Acorn 部署应用一切就绪后在 Acornfile 所在目录执行acorn run -n my-ferret构建完成后终端会输出应用端点与控制面摘要┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ || STATUS: ENDPOINTS[https://my-ferret-91916df9.qactc6.on-acorn.io, tcp://k8s-myferret-ferretdb-0c404ccc3f-0e3f1499f0b768c7.elb.us-east-2.amazonaws.com:27017] HEALTHY[2] UPTODATE[2] OK | └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘https://my-ferret-...on-acorn.ioTodo 应用的 HTTP 访问端点tcp://...:27017FerretDB 的 MongoDB 协议端点端口 27017 与 Acornfile 中27017/tcp发布声明对应HEALTHY[2] UPTODATE[2]两个容器app 与 ferretdb均健康且版本一致。通过该 URL 即可访问 Todo 应用新增任务会写入 FerretDB底层 PostgreSQL勾选与删除操作同样实时反映到数据库中。如需本地验证 FerretDB 协议接入可参考 Docker 安装文档 中mongosh连接 URImongodb://username:password127.0.0.1/的用法——Acorn 部署后该连接串只需将主机替换为上面输出的 27017 TCP 端点。构建与发布 Acorn 镜像开发完成、准备交付时可以像传统 Docker 工作流一样把应用打包成 Acorn 镜像。通用构建命令格式为acorn build -t registry/organization/app-name:version .例如发布到 Docker Hubacorn build -t index.docker.io/organization/my-ferret:v1.0 .该命令会把应用源码与Acornfile中声明的全部依赖含 FerretDB、PostgreSQL 服务描述编译进镜像-t指定镜像标签。若非 Docker Hub请替换 registry 前缀并确保 organization/用户名正确。推送镜像前需先登录 registryacorn login index.docker.io随后上传镜像acorn push index.docker.io/organization/my-ferret:v1.0镜像进入 registry 后任何能访问该 registry 的环境都能直接部署acorn run会自动拉取并运行acorn run index.docker.io/organization/my-ferret:v1.0如需在本地手动拉取镜像acorn pull index.docker.io/organization/my-ferret:v1.0至此基于 FerretDB 的 Todo 应用已完成容器化、打标签并可在生产环境中跨环境部署。清理环境完成验证后删除应用及其容器acorn rm my-ferret总结本文演示了完整链路从 Flask pymongo编写业务代码到 Dockerfile 容器化再到用一份 Acornfile 同时声明 PostgreSQL 服务、FerretDB 容器与应用容器最后通过acorn run部署、acorn build/push发布镜像。关键要点回顾FerretDB 兼容 MongoDB 协议与驱动如pymongo业务代码无需改动即可切换FERRETDB_POSTGRESQL_URL是 FerretDB 连接后端的核心环境变量与仓库 flags.md 中的--postgresql-url配置一一对应Acorn 通过{service.postgres.xxx}模板变量自动注入Acorn 将复杂的服务、密钥、容器、任务与配置封装为应用级抽象一份 Acornfile 即可承载完整应用配合 FerretDB 的开源属性整套方案从应用层到数据库层都不存在厂商锁定问题。无论你正在快速原型验证还是构建面向生产的应用都可以参考本指南用 Acorn 将 FerretDB 应用一键部署到云原生环境。更多 FerretDB 能力可查阅仓库内 docs 目录 与 安装文档。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐实战使用Zappa部署Flask和Django应用实战使用Zappa部署Flask和Django应用 本文详细介绍了使用Zappa无服务器框架部署Flask和Django应用到AWS Lambda的完整配置指云原生DevOps后端使用 Waitress 部署 Flask 应用纯 Python WSGI 服务器实战指南使用 Waitress 部署 Flask 应用纯 Python WSGI 服务器实战指南 Waitress 是一个纯 Python 实现的 WSGI 服务器后端Web框架使用 Crossplane 与 OAM 在 Kubernetes 上管理云原生应用安装、部署与实战使用 Crossplane 与 OAM 在 Kubernetes 上管理云原生应用安装、部署与实战 本文以 Kubernetes 云原生基础设施为背景系统介教程云原生容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表