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

忘机山人

发布于336天前
博客图片修整中,看不了可以先搜索公众号“忘机山人”看。
# 懒猫微服开发篇(三):如何将已有 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](https://raw.githubusercontent.com/cloudsmithy/picgo-imh/master/image-20250702125730816.png)

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

```yaml
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/`,也算是为了简化程序移植和学习成本。和 Docker-compose 写绝对路径来说,这里的可移植性执行更好。

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

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

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

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

### 4. 镜像加速实践

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

```bash
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 集成等,我们将在后续文章继续分享。

评论

0

暂无评论

说点什么呢~
收藏
4
0
0