懒猫微服开发篇(三):如何将已有 Docker Compose 应用移植到懒猫微服

本文延续前两篇,演示如何把一个已经在本地运行良好的 Docker Compose 应用打包并上架到懒猫微服应用商店。以 Milvus 为例,逐步拆解 Manifest 配置、路由映射、数据卷绑定以及镜像加速等关键环节,帮助大家快速完成移植。

1. 目录结构与核心文件

在懒猫微服中,一个最小可用的应用包仅需两个文件:

文件 作用
lzc-build.yml 描述打包流程及应用图标。简单应用只需指定 icon 即可。
lzc-manifest.yml 定义应用元数据与服务编排,是移植的重点。

本文主要关注 lzc-manifest.yml 的编写。

2. lzc-manifest.yml 字段逐一解析

现在有了懒猫应用查看器很方便,我们以商店里的 Milvus 的示例 Manifest 为例,并附带注释说明。

image-20250702125730816

这个 lzc-mainfest.yml 解析是重点。主要是 subdomain,ingress,services 这几个字段。总体上还是延续了 Docker compose 的风格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
lzc-sdk-version: "0.1"
name: Milvus
package: in.zhaoj.milvus
version: 2.5.8
author: milvus
application:
# 子域名:应用上线后将访问 https://milvus.<机器名>.heiyu.space
subdomain: milvus
background_task: false # 是否允许后台运行
multi_instance: false # 是否允许多实例
gpu_accel: false # 是否请求 GPU
routes: # 七层(HTTP)路由
- /=http://attu.in.zhaoj.milvus.lzcapp:3000/
ingress: # 四层(TCP)转发
- protocol: tcp
port: 19530
service: standalone
- protocol: tcp
port: 9091
service: standalone
services: # 以下基本等同于 docker‑compose 中的 services
etcd:
image: registry.lazycat.cloud/longixaoyi/milvusdb/etcd:v3.5.18
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
command: >
etcd -advertise-client-urls=http://127.0.0.1:2379
-listen-client-urls http://0.0.0.0:2379
--data-dir /etcd
binds:
- /lzcapp/var/etcd:/etcd
minio:
image: registry.lazycat.cloud/longixaoyi/milvusdb/minio:RELEASE.2023-03-20T20-16-18Z
environment:
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
command: minio server /minio_data
binds:
- /lzcapp/var/minio_data:/minio_data
health_check:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
standalone:
image: registry.lazycat.cloud/longixaoyi/milvusdb/milvus:v2.6.0-rc1
command: milvus run standalone
environment:
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ADDRESS=minio:9000
depends_on:
- etcd
- minio
binds:
- /lzcapp/var/milvus:/var/lib/milvus
attu:
image: registry.lazycat.cloud/longixaoyi/zilliz/attu:latest
environment:
- MILVUS_URL=standalone:19530
depends_on:
- standalone

2.1 subdomain

subdomain 是应用程序上线的域名,例如上述配置上线后即为 https://milvus.<节点名>.heiyu.space

2.2 routes

route 来做七层的 HTTP 转发,类似 Nginx 的反向代理。规则格式为 本地路径 = 目标 URL。在示例中,根路径 / 被转发到前端服务 attu 的 3000 端口。

URL 规则:服务名.包名.lzcapp:端口。(包名随意起)

- /=http://attu.in.zhaoj.milvus.lzcapp:3000/

这里 attu 是服务名,端口是 3000,in.zhaoj.milvus 是包名。

2.3 ingress

用于四层直通转发,适用于非 HTTP 协议(数据库、SSH 等)。示例将 Milvus 的 gRPC (19530) 与 HTTP (9091) 端口暴露给外部。

2.4 bind

Manifest 中的绑定路径以 /lzcapp/var 为前缀。发布后会被映射到宿主机的 /data/app/var/<package>,也算是为了简化程序移植和学习成本。和 Docker-compose 写绝对路径来说,这里的可移植性执行更好。

健康检查在这里不是必须的,因为打包的上架的时候服务会帮忙做这个事情。

3. 服务映射与 docker-compose.yml 对照

懒猫 Manifest 的 services 段几乎一一复刻了传统 Compose 配置,常用键均保持一致。以下列出了 Milvus 官方 docker-compose.yml,方便对照理解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
version: "3.5"

services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.18
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3

minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
ports:
- "9001:9001"
- "9000:9000"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
command: minio server /minio_data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3

standalone:
container_name: milvus-standalone
image: milvusdb/milvus:v2.6.0-rc1
command: ["milvus", "run", "standalone"]
security_opt:
- seccomp:unconfined
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
MQ_TYPE: woodpecker
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
start_period: 90s
timeout: 20s
retries: 3
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- "etcd"
- "minio"

networks:
default:
name: milvus

差异点主要体现在:

  • 镜像源:建议通过 lzc-cli appstore copy-image <image> 把镜像同步到 registry.lazycat.cloud,解决国内网络拉取问题。
  • 端口声明:在 Manifest 中,外部访问端口通过 ingress,不再使用 Compose 的 ports
  • 健康检查:懒猫平台会统一探测容器存活,可按需省略 healthcheck

4. 镜像加速实践

一条命令即可完成镜像复制并输出新的仓库地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lzc-cli appstore copy-image nginx                                                                                                                           (base) 13:15:36
Waiting ... ( copy nginx to lazycat offical registry)
uploading
23e05839: [####################################################################################################] 100%
23e05839: [####################################################################################################] 100%
23e05839: [####################################################################################################] 100%
3da95a90: [####################################################################################################] 100%
48670a58: [####################################################################################################] 100%
6c8e51cf: [####################################################################################################] 100%
9bbbd7ee: [####################################################################################################] 100%
ce713206: [####################################################################################################] 100%
ee95256d: [####################################################################################################] 100%

uploaded: registry.lazycat.cloud/u04123229/library/nginx:d037205fbaf7d60a

将生成的地址替换到 Manifest 的 image 字段即可。

5. 小结

  • Manifest 为核心:lzc-manifest.yml 描述了全部运行时需求,移植时优先完善此文件。
  • 路由分层:routes 管理 HTTP,ingress 管理 TCP,二者配合即可覆盖绝大多数场景。
  • 统一数据目录:使用 /lzcapp/var 避免硬编码路径,便于跨节点迁移。
  • 镜像国内托管:通过 lzc-cli appstore copy-image 自动同步到 LazyCat Registry,稳定又快速。

至此,Milvus 的 Docker Compose 应用已成功移植到懒猫微服。更多进阶玩法,例如 OIDC、VNC 集成等,我们将在后续文章继续分享。

懒猫微服开发篇(三):如何将已有 Docker Compose 应用移植到懒猫微服

https://xu-hardy.github.io/懒猫微服开发篇(三):如何将已有-docker-compose-应用移植到懒猫微服/

作者

Xu

发布于

2025-07-08

更新于

2025-07-05

许可协议

评论