保姆级教程:在Ubuntu 20.04上用Docker Compose一键部署Milvus向量数据库(附可视化界面)
2026/6/11 8:29:46 网站建设 项目流程

基于Docker Compose的Milvus向量数据库全栈部署指南

在AI应用开发领域,向量数据库正成为处理非结构化数据的核心基础设施。作为一款开源的向量相似度搜索引擎,Milvus凭借其出色的性能和易用性,正在图像检索、推荐系统、自然语言处理等场景中快速普及。本文将分享如何通过Docker Compose在Ubuntu 20.04上快速搭建包含可视化管理的完整Milvus服务栈。

1. 环境准备与架构设计

在开始部署前,我们需要明确几个关键概念。Milvus 2.x版本采用存储与计算分离的架构,主要包含以下组件:

  • 协调器(Coordinator):管理集群状态和任务调度
  • 工作节点(Worker Node):执行数据插入、索引构建和查询操作
  • 元数据存储(Meta Store):记录集合、分区等元信息(推荐使用MySQL)
  • 对象存储(Object Storage):持久化向量数据(支持S3/MinIO等)
# 检查系统环境 lsb_release -a docker --version docker-compose --version

提示:建议使用至少8GB内存的机器,Milvus的索引构建过程对内存要求较高

对于生产环境,我们通常需要部署分布式集群。但本文演示的单机版方案已能满足大多数开发测试需求,且具有以下优势:

  • 资源占用可控:通过Docker资源限制避免影响主机其他服务
  • 一键启停:所有服务通过compose文件统一管理
  • 配置集中化:所有参数在YAML文件中明确定义
  • 扩展便捷:可随时添加新服务节点

2. Docker Compose编排配置

下面是我们精心设计的docker-compose.yml文件,整合了Milvus核心服务与可视化工具:

version: '3.5' services: etcd: container_name: milvus-etcd image: quay.io/coreos/etcd:v3.5.0 environment: - ETCD_AUTO_COMPACTION_MODE=revision - ETCD_AUTO_COMPACTION_RETENTION=1000 - ETCD_QUOTA_BACKEND_BYTES=4294967296 volumes: - etcd_data:/etcd ports: - "2379:2379" command: etcd -advertise-client-urls=http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 minio: container_name: milvus-minio image: minio/minio:RELEASE.2022-03-17T06-34-49Z environment: - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin volumes: - minio_data:/minio_data ports: - "9000:9000" command: minio server /minio_data --console-address ":9000" standalone: container_name: milvus-standalone image: milvusdb/milvus:v2.0.2 environment: - ETCD_ENDPOINTS=etcd:2379 - MINIO_ADDRESS=minio:9000 volumes: - milvus_data:/var/lib/milvus ports: - "19530:19530" - "9091:9091" depends_on: - etcd - minio attu: container_name: milvus-attu image: zilliz/attu:v2.0.5 environment: - MILVUS_URL=standalone:19530 ports: - "3000:3000" depends_on: - standalone volumes: etcd_data: minio_data: milvus_data:

关键配置说明:

  1. etcd服务:Milvus使用etcd进行服务发现和元数据存储
  2. minio服务:提供对象存储能力,持久化向量数据
  3. standalone服务:Milvus主服务,暴露19530端口供客户端连接
  4. attu服务:官方可视化工具,提供Web管理界面

3. 部署与初始化

将上述配置保存为docker-compose.yml后,执行以下命令启动服务栈:

# 启动所有服务(后台模式) docker-compose up -d # 查看服务状态 docker-compose ps # 查看Milvus日志 docker logs milvus-standalone -f

服务启动后,可以通过以下方式验证各组件状态:

组件验证方式预期结果
Milvuscurl localhost:19530/health返回{"status":"OK"}
Attu浏览器访问http://localhost:3000显示登录界面
MinIO浏览器访问http://localhost:9000显示MinIO控制台

注意:首次启动可能需要1-2分钟完成各服务初始化,期间访问可能出现连接错误

4. 系统配置调优

为了获得最佳性能,我们需要根据硬件配置调整Milvus参数。创建custom.yaml文件进行个性化配置:

# custom.yaml queryNode: gracefulTime: 1000 stats: publishInterval: 1000 dataNode: flush: insertBufSize: 16777216 indexNode: buildParallel: 2 common: retentionDuration: 432000

将该配置文件挂载到standalone服务:

# 修改docker-compose.yml中standalone服务的volumes部分 volumes: - ./custom.yaml:/milvus/configs/custom.yaml - milvus_data:/var/lib/milvus

主要调优参数说明:

  • queryNode.gracefulTime:查询超时时间(ms)
  • dataNode.flush.insertBufSize:插入缓冲区大小(bytes)
  • indexNode.buildParallel:并行构建索引的线程数
  • common.retentionDuration:数据保留时间(秒)

5. 可视化管理与实践

Attu提供了直观的Web界面,支持以下核心操作:

  1. 集合管理

    • 创建/删除集合
    • 设置向量维度、索引类型
    • 配置分区策略
  2. 数据操作

    • 批量导入向量数据
    • 执行相似度搜索
    • 查看数据统计信息
  3. 系统监控

    • 实时资源使用情况
    • 查询性能指标
    • 节点健康状态

典型工作流程示例:

# 使用PyMilvus连接 from pymilvus import connections, Collection connections.connect("default", host="localhost", port="19530") # 创建集合 from pymilvus import FieldSchema, CollectionSchema, DataType fields = [ FieldSchema("id", DataType.INT64, is_primary=True), FieldSchema("embedding", DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields) collection = Collection("demo_collection", schema) # 插入数据 import numpy as np vectors = np.random.random((1000, 128)).tolist() collection.insert([list(range(1000)), vectors]) # 构建索引 index_params = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128} } collection.create_index("embedding", index_params) # 执行搜索 search_params = {"metric_type": "L2", "params": {"nprobe": 10}} results = collection.search( vectors[:5], "embedding", search_params, limit=3 )

6. 常见问题排查

遇到问题时,可参考以下排查指南:

服务启动失败

  1. 检查端口冲突:netstat -tulnp | grep 19530
  2. 查看容器日志:docker-compose logs

查询性能低下

  1. 确认索引类型与场景匹配
    • IVF_FLAT:平衡精度与速度
    • HNSW:最高召回率
    • DISKANN:超大向量规模
  2. 调整nprobe参数平衡精度与延迟

内存不足

  1. 限制容器内存:在compose文件中添加
    standalone: deploy: resources: limits: memory: 8G
  2. 降低缓存大小:调整dataNode.flush.insertBufSize

数据持久化

  1. 定期备份MinIO数据目录
  2. 导出关键元数据:docker exec milvus-etcd etcdctl get --prefix "" > backup.txt

7. 生产环境建议

对于关键业务部署,建议考虑以下增强措施:

  1. 高可用架构

    • 部署3节点etcd集群
    • 配置MinIO纠删码
    • 启用Milvus分布式模式
  2. 监控告警

    prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml
  3. 资源隔离

    • 为每个服务配置独立的cgroup
    • 使用--cpus参数限制CPU使用率
    • 设置内存硬限制防止OOM
  4. 安全加固

    • 启用MinIO TLS加密
    • 配置etcd客户端证书认证
    • 限制Milvus管理端口访问

实际部署中,我们发现最耗时的环节通常是索引构建。对于千万级向量的场景,建议:

  • 使用SSD存储加速IO
  • 根据CPU核心数调整buildParallel
  • 在业务低峰期执行全量索引构建

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询