云原生微服务容器编排运维【免费下载链接】flynn[UNMAINTAINED] A next generation open source platform as a service (PaaS)项目地址https://gitcode.com/gh_mirrors/fl/flynn点击查看免费下载Flynn 是一个基于容器编排的下一代开源 PaaS 平台[UNMAINTAINED] 状态仓库位于 gh_mirrors/fl/flynn。除了通过git push部署源码之外Flynn 内置了一套名为tarreceive的镜像导入服务可以把本地dockerCLI 中已有的任意 Docker 镜像直接推送到集群并完成发布release与部署。本文以官方文档 docs/content/docker.md 为骨架结合 cli/docker.go 与 tarreceive/main.go 的源码实现完整讲解flynn docker push的用法、镜像导入的底层工作流、路由与端口约定以及一个从docker build到对外提供 HTTP 服务的端到端示例。读完本文你将掌握把现有 Docker 镜像快速迁移进 Flynn 集群的完整实战方案。flynn docker push与 tarreceive 概述Flynn 自带一个内置应用tarreceive其职责是把推送进来的 Docker 镜像导入import为 Flynn 自己的镜像格式并存入集群的 blobstore。用户侧只需一条命令即可完成推镜像 创建 release 部署$ flynn -a APPNAME docker push IMAGE其中APPNAME是 Flynn 中一个已存在应用的名称IMAGE是一个对本地dockerCLI 可见的镜像引用也就是会出现在docker images输出中的镜像名可带 tag如my-custom-image:v2。从 cli/docker.go 中注册的命令帮助信息可以看到flynn docker子命令族完整定义如下usage: flynn docker push image flynn docker set-push-url [url] flynn docker login flynn docker logout Commands: push push and release a Docker image to the cluster set-push-url [DEPRECATED] set the Docker push URL (defaults to https://docker.$CLUSTER_DOMAIN) login [DEPRECATED] run docker login against the clusters docker-receive app logout [DEPRECATED] run docker logout against the clusters docker-receive app其中set-push-url、login、logout均已被标记为DEPRECATED它们对应早期通过 Docker Registry 推送的旧机制。现代 Flynn集群版本不早于v20190425.0见 cli/docker.go 中的常量minDockerPushTarVersion直接使用基于 tar 分层的镜像服务无需先docker login或配置 push URL直接执行flynn docker push即可。如果集群版本过旧CLI 会自动回退到旧的 registry 推送路径runDockerPushLegacy同时输出升级建议。镜像导入的底层工作流理解flynn docker push在集群中到底做了什么有助于排查问题。从源码看新版本走的是 runDockerPushTar 这条路径整个流程分为五个阶段1. 用docker save导出镜像CLI 首先在本地执行$ docker save IMAGE并将输出流实时解包到临时目录cli/docker.go。在终端环境下CLI 还会用进度条显示导出字节数即文档示例中exporting image with docker save nodejs-flynn-example与650.67 MB 107.82 MB/s 6s这类输出的来源。随后读取docker save产物中的manifest.json与镜像 config 文件得到层列表、Env、Cmd、Entrypoint、WorkingDir等元数据对应 DockerManifest 与 DockerConfig 两个结构体。2. 逐层上传到 tarreceive对manifest.json中的每一层CLI 先以GetLayer查询 tarreceive 是否已存在同 ID 的层若不存在返回tarclient.ErrNotFound则以CreateLayer上传该层 tar 文件cli/docker.go。层 ID 取自镜像 config 中rootfs.diff_ids的 sha256 值。在 tarreceive/main.go 的handleCreateLayer处理函数中服务端会把收到的 tar 流写入临时文件同时计算SHA256并与 URL 路径中的层 ID 比对不匹配则报SHA256 mismatch解包 tar调用mksquashfs将解包目录压成squashfs 只读镜像层类型为application/vnd.flynn.image.squashfs.v1见 controller/types/types.go把 squashfs 文件与描述该层的 JSON 元数据分别上传到 blobstoreURL 模板见 tarreceive/utils/utils.gohttp://blobstore.discoverd/tarreceive/layers/{id}.squashfs与.../{id}.json。也就是说Docker 的 tar 层在进入 Flynn 后会被统一转换为 squashfs 层并最终以内容寻址的方式存放在集群 blobstore 中重复推送相同层不会产生冗余存储。3. 生成 Flynn 镜像清单并创建 artifact所有层上传完毕后CLI 把这些层组装成一个 Flynn 自己的镜像清单ImageManifestimage : ct.ImageManifest{ Type: ct.ImageManifestTypeV1, // application/vnd.flynn.image.manifest.v1json Entrypoints: map[string]*ct.ImageEntrypoint{_default: entrypoint}, Rootfs: []*ct.ImageRootfs{{ Platform: ct.DefaultImagePlatform, // linux/amd64 Layers: layers, }}, }其中entrypoint由镜像 config 转换而来cli/docker.goArgs Entrypoint CmdWorkingDir沿用镜像的WorkingDirEnv逐项拆分KEYVALUE并把 tab 转义为\\t后放入ImageEntrypoint.Env映射。随后通过CreateArtifact调用 tarreceive 的POST /artifact接口tarreceive/main.go。服务端把清单原文上传到http://blobstore.discoverd/tarreceive/images/{sha512_256}.json并据此在 Controller 中创建一个类型为ArtifactTypeFlynn、以sha512_256内容哈希为 ID 的 artifact 记录。4. 创建 releaseCLI 基于上一步的 artifact 与应用的既有 release 创建新 releasecli/docker.goArtifactIDs指向新创建的 artifactProcesses、Env、Meta继承上一次 release若应用此前没有 release则从零开始app进程的启动参数Args直接取自镜像的Entrypoint Cmd若app进程此前没有定义端口则自动补一个8080/tcp端口并创建名为app-web的 discoverd 服务。关于环境变量有一条重要的优先级规则cli/docker.go镜像 config 中的Env只会在 release 中不存在同名变量时才写入也就是说flynn env set设置过的变量不会被镜像内的ENV覆盖。5. 部署最后调用DeployAppRelease触发滚动部署并在日志中提示Docker image deployed, scale it with flynn scale appN需要说明的是flynn docker push只负责推送 发布并不会自动扩容。如果这是应用的首次部署app进程的实例数为 0需要手动执行flynn scale appN把进程拉起N 为目标实例数。路由与端口约定PORT环境变量与$CLUSTER_DOMAIN镜像部署完成后Flynn 会自动注册该应用的 HTTP 路由http://APPNAME.$CLUSTER_DOMAIN其中$CLUSTER_DOMAIN是集群在 bootstrap 阶段配置的主域名安装时可参考 docs/content/installation/manual.md 中CLUSTER_DOMAINdemo.localflynn.com的用法例如默认的1.localflynn.com。要让该路由真正对外提供服务应用进程必须监听PORT环境变量指定的端口。这是 Flynn 平台的通用约定调度器在启动容器时注入PORT在上述docker push场景中若app进程未显式定义端口自动补齐的端口即8080应用代码只需读取process.env.PORT/$PORT并监听即可无需关心端口号本身。同时docker push自动创建的app-web服务意味着集群内的其他应用可以通过 discoverd 服务发现机制访问该服务服务地址形如APPNAME-web.discoverd:PORT例如nodejs-web.discoverd:8080。这也是 Flynn 应用间互相通信的标准方式。端到端示例部署一个 Node.js 镜像应用下面完整演示从构建本地 Docker 镜像到对外访问的全过程命令与输出整理自官方文档 docs/content/docker.md这里使用一个监听8080端口、打印 Hello from Flynn on port 8080 ... 的 Node.js 示例应用。1. 构建本地 Docker 镜像在包含Dockerfile的项目目录中执行$ docker build -t nodejs-flynn-example .构建完成后nodejs-flynn-example即出现在docker images输出中满足flynn docker push对镜像可见性的要求。2. 创建 Flynn 应用$ flynn create --remote nodejs Created nodejs注意--remote 这个标志用于阻止 Flynn 尝试为本地 git 仓库配置名为flynn的 git remote。从 cli/app.go 可以看到flynn create默认-r/--remote的默认值为flynn见 cli/app.go会在检测到当前目录是 git 仓库时执行git remote add flynn url而该 remote 仅在通过git push部署时才有意义。既然本次采用flynn docker push部署把它置为空字符串即可跳过这一步。3. 推送 Docker 镜像$ flynn -a nodejs docker push nodejs-flynn-example deploying Docker image: nodejs-flynn-example exporting image with docker save nodejs-flynn-example 650.67 MB 107.82 MB/s 6s uploading layer 8fad67424c4e7098f255513e160caa00852bcff347bc9f920a82ddf3f60229de 123.29 MB 22.98 MB/s 5s uploading layer 86985c679800f423275a0ea3ad540e9b7f522dcdcd65ec2b20f407996162f2e0 43.35 MB 24.49 MB/s 1s uploading layer 6e5e20cbf4a7246b94f7acf2a2ceb2c521e95daca334dd1e8ba388fa73443dfe 121.03 MB 11.38 MB/s 10s uploading layer ff57bdb79ac820da132ad1fdc1e2d250de5985b264dbdf60aa4ce83a05c4da75 313.16 MB 7.18 MB/s 43s uploading layer 0e0b4ee1c6dc1f57a46071fc075ecf66b3164e637096197f10b89b6086942c7a 344.50 KB 632.22 KB/s 0s uploading layer 33aed7748ee38dd620489fce6366fab070591e3b5ec276b5f505ed957772d7bc 132.00 KB 3.73 MB/s 0s uploading layer 3b227e2efc63768cd4c62d5e7e6678b98064bf5bdbc40fc845913e970ccc5610 44.96 MB 13.26 MB/s 3s uploading layer 984a57f9e68ea548ace7b655095d109a94850c918d10707ac4c922c9d9778136 4.25 MB 36.01 MB/s 0s uploading layer 38a320798e65a1b2faed502dcac756feddcc85b3e83d72d7a57998fc992a2564 4.00 KB 159.07 KB/s 0s uploading layer 148577a474a5c57422278e836bf204288fae7bf9f3ab5d6643666c30abb9bd87 5.50 KB 150.91 KB/s 0s uploading layer 7779527ad11c4b4f1edb62e7f1391ee6cd82df898b8e96a16822ae79124669e2 108.00 KB 2.22 MB/s 0s Docker image deployed, scale it with flynn scale appN此刻应用已经拥有一个 release其中包含一个名为app的进程运行的就是刚才推送的镜像其ENTRYPOINT、CMD与ENV均取自 Docker 镜像自身的 config。4. 首次部署扩容app进程由于是首次部署需要把app进程从 0 个实例扩到 1 个$ flynn -a nodejs scale app1 scaling app: 01 16:24:31.397 app 4a7319af-af2c-4fe1-9a9a-2dd4d5bd3765 pending 16:24:31.398 app host0-4a7319af-af2c-4fe1-9a9a-2dd4d5bd3765 starting 16:24:31.527 app host0-4a7319af-af2c-4fe1-9a9a-2dd4d5bd3765 up scale completed in 140.63784ms5. 集群内验证服务发现app进程会以应用名-web作为服务名注册到 discoverd因此集群内的其他应用可以通过APPNAME-web.discoverd:PORT访问它。用flynn run在应用环境中执行一次内部请求$ flynn -a nodejs run curl http://nodejs-web.discoverd:8080 Hello from Flynn on port 8080 from container 4a7319af-af2c-4fe1-9a9a-2dd4d5bd37656. 集群外验证自动注册的路由由于 Flynn 已自动注册http://APPNAME.$CLUSTER_DOMAIN路由外部可以直接通过该地址访问示例集群域名为1.localflynn.com$ curl http://nodejs.1.localflynn.com Hello from Flynn on port 8080 from container 4a7319af-af2c-4fe1-9a9a-2dd4d5bd3765注意两次输出中的容器 ID 相同4a7319af-...说明内外访问命中同一个实例。关键注意点小结镜像必须对本地 docker 可见IMAGE引用需要出现在docker images中CLI 依赖本地docker可执行文件执行docker save以及旧路径下的docker inspect/docker tag/docker push。应用须先存在flynn docker push是针对已有应用的命令执行前需要先用flynn create或已有应用准备好APPNAME。--remote 只适用于纯docker push场景如果后续还打算用git push部署就不要加这个参数。首次部署需手动flynn scale appNpush 命令只负责发布 release不负责拉起进程。应用必须监听$PORT自动注册的 HTTP 路由才能把流量送达容器docker push自动补齐的默认端口为8080。环境变量优先级flynn env set设置的变量优先于镜像ENV不会被镜像 config 覆盖。版本兼容性若集群版本早于v20190425.0常量见 cli/docker.goCLI 会回退到已废弃的 registry 推送路径并提示升级届时才需要关注set-push-url/login/logout等旧命令。延伸阅读官方文档原文docs/content/docker.mdCLI 实现与命令帮助cli/docker.go镜像导入服务端实现层上传、squashfs 转换、artifact 创建tarreceive/main.gotarreceive 客户端与 blobstore URL 约定tarreceive/client/client.go、tarreceive/utils/utils.goFlynn 镜像清单与层的数据模型controller/types/types.go集群域名CLUSTER_DOMAIN的配置方式docs/content/installation/manual.md赞分享云原生微服务容器编排运维【免费下载链接】flynn[UNMAINTAINED] A next generation open source platform as a service (PaaS)项目地址https://gitcode.com/gh_mirrors/fl/flynn点击查看免费下载相关推荐searx Docker 部署实战指南镜像运行、配置注入与自建镜像searx Docker 部署实战指南镜像运行、配置注入与自建镜像 本篇指南围绕 searx 官方文档《Docker installation》展开系统讲解后端搜索引擎Cortex 集群自托管 Docker 镜像指南基于 ECR 的镜像导出与私有化部署Cortex 集群自托管 Docker 镜像指南基于 ECR 的镜像导出与私有化部署 Cortex 是一个面向大规模机器学习的生产级基础设施平台其集群中的全后端云原生模型推理服务MLOps人工智能CyberStrikeAI 部署教程10分钟从零到跑通 AI 安全测试平台CyberStrikeAI 部署教程10分钟从零到跑通 AI 安全测试平台 CyberStrikeAI 是一个 Go 编写的 AI 原生安全测试平台把一句话网络安全渗透测试人工智能大模型AI AgentRAG后端前端MCP 服务漏洞扫描上一篇RSS-Bridge 的 MastodonBridgeActivityPub Bridge配置指南为 ActivityPub 请求启用 HTTP 签名下一篇MaaAssistantArknights 如何一键长草明日方舟全日常自动化工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
