在构建 RAG(检索增强生成)架构的 AI 应用时,向量数据库是承载知识库检索的核心基础设施。本文将基于真实的纯内网生产环境,详细演示如何利用 Docker Compose 完成 Milvus 2.3.0 向量数据库的全流程容器化部署,同时集成 Etcd、MinIO 与 Attu 可视化平台,帮助你快速搭建稳定、安全、可复现的 AI 项目存储底座。

部署背景与架构设计

本次部署服务于个人 AI 项目「商助慧」(面向程序员的 AI 写作助手),旨在构建一个完全隔离于业务与监控网络的独立 AI 基础设施层。服务器环境为 HP 物理机(IP: 192.168.18.100),操作系统采用 Ubuntu 22.04,所有组件均通过 Docker 容器化运行,确保环境一致性与部署效率。

整体架构采用 Milvus 作为核心向量检索引擎,负责海量向量数据的存储与相似度检索;Etcd 承担元数据管理职责,保证集群状态的一致性;MinIO 作为底层对象存储,为向量数据提供持久化能力;Attu 则是可视化管理平台,让运维与数据操作变得更加直观。这一组合构成了企业级单机部署的黄金标准,兼顾性能与可靠性。

⚙️ 容器编排配置详解

利用 Docker Compose 进行容器编排,可以极大简化多服务部署的复杂度。以下配置文件定义了四个核心服务的运行参数、端口映射、数据卷挂载以及网络模式。通过统一的 容器编排 策略,各服务在独立网络中自动互通,互不干扰。

在配置中,Milvus 服务暴露 19530 端口用于客户端连接,Attu 映射到宿主机的 18000 端口。值得注意的是,所有服务均未依赖外部网络,实现了纯内网环境的稳定运行。这种基础设施即代码(IaC)的方式,保证了部署的可复现性和可迁移性,为后续的 K8s 集群扩展奠定了基础。

version: '3.5'
services:
  etcd:
    container_name: milvus-etcd
    image: 192.168.18.100:5000/quay.io/coreos/etcd:v3.5.0
    command: etcd -advertise-client-urls http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379
    volumes:
      - ./volumes/etcd:/etcd
    restart: always
    networks:
      - milvus_network
  storage:
    container_name: milvus-minio
    image: 192.168.18.100:5000/minio/minio:RELEASE.2023-03-20T20-16-18Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    command: server /data
    volumes:
      - ./volumes/minio:/data
    restart: always
    networks:
      - milvus_network
  standalone:
    container_name: milvus-standalone
    image: 192.168.18.100:5000/milvusdb/milvus:v2.3.0
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: storage:9000
    volumes:
      - ./volumes/milvus:/var/lib/milvus
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "storage"
    restart: always
    networks:
      - milvus_network
  attu:
    container_name: milvus-attu
    image: 192.168.18.100:5000/zilliz/attu:latest
    ports:
      - "18000:3000"
    environment:
      - MILVUS_URL=milvus-standalone:19530
    depends_on:
      - standalone
    restart: always
    networks:
      - milvus_network
networks:
  milvus_network:
    driver: bridge

镜像导入与一键启动流程

在纯内网环境中,镜像的获取与分发是首要难题。这里采用先在有网环境拉取镜像,再导出为 tar 包,最后导入内网私有仓库(192.168.18.100:5000)的策略。这种方式不仅安全可控,还能确保生产环境与开发环境使用完全一致的镜像版本,避免版本不一致带来的兼容性问题。

以下脚本展示了完整的镜像导入与推送流程,通过循环遍历镜像列表,自动完成 docker pulldocker tagdocker push 操作,实现了镜像资产的高效管理与分发。

# 1. 加载镜像
docker load -i milvus-only-3-images.tar
docker load -i attu.tar
# 2. 打标签
docker tag quay.io/coreos/etcd:v3.5.0 192.168.18.100:5000/quay.io/coreos/etcd:v3.5.0
docker tag minio/minio:RELEASE.2023-03-20T20-16-18Z 192.168.18.100:5000/minio/minio:RELEASE.2023-03-20T20-16-18Z
docker tag milvusdb/milvus:v2.3.0 192.168.18.100:5000/milvusdb/milvus:v2.3.0
docker tag zilliz/attu:latest 192.168.18.100:5000/zilliz/attu:latest
# 3. 推送至私有仓库
docker push 192.168.18.100:5000/quay.io/coreos/etcd:v3.5.0
docker push 192.168.18.100:5000/minio/minio:RELEASE.2023-03-20T20-16-18Z
docker push 192.168.18.100:5000/milvusdb/milvus:v2.3.0
docker push 192.168.18.100:5000/zilliz/attu:latest

镜像准备就绪后,即可通过 docker-compose up -d 命令实现一键启动。该命令会按照依赖顺序依次启动 Etcd、MinIO、Milvus 与 Attu 服务,并通过健康检查确保各组件就绪。启动完成后,可以使用 docker-compose ps 查看各服务运行状态。

# 进入部署目录
cd /home/xyy/myapp/project/02-AI
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看运行状态
docker ps | grep milvus

服务访问与连接配置指南

部署完成后,需要正确配置客户端连接参数。Milvus 向量数据库的访问地址为 192.168.18.100:19530,Attu 可视化管理平台则通过 http://192.168.18.100:18000 访问。两者分别承担数据操作与可视化管理的职责,形成完整的运维闭环。

在 Attu 中连接 Milvus 时,需要注意以下关键配置项:

  • Host:填写服务器真实 IP,而非 localhost,确保跨容器访问可达
  • Port:使用 Milvus 服务的映射端口 19530
  • SSL:取消勾选「启用 SSL」选项,因为内网环境默认不启用 TLS 加密
配置项填写内容
Milvus 地址192.168.18.100:19530
数据库default
用户名
密码
启用 SSL关闭

️ 运维管理与故障排查实践

容器化部署的优势在于运维的便捷性。通过 docker-compose logs 可以实时查看服务日志,docker-compose restart 能够快速重启异常服务。这些命令构成了日常运维的基础工具箱,让问题定位与恢复变得高效。

# 查看Milvus日志
docker logs -f milvus-standalone
# 查看Attu日志
docker logs -f milvus-attu
# 重启服务
docker-compose restart
# 查看容器状态
docker-compose ps

在实际部署过程中,我们总结了几个高频问题的解决方案:

  1. Milvus 无限重启:通常是启动参数缺失导致,需要在 docker-compose.yml 中补充 run 参数,确保 Etcd 元数据正确初始化。
  2. Attu 无法连接 Milvus:先检查是否启用了 SSL,内网环境应取消该选项;同时确认使用主机真实 IP 而非 127.0.0.1。
  3. 端口冲突:当业务服务占用 8080/8081/8082 等常用端口时,可将 Attu 调整至 18000 端口,避免资源竞争。
  4. 容器间网络不通:所有服务需统一使用 milvus_network 网桥,确保自动 DNS 解析与容器间通信正常。
command: ["milvus", "run", "standalone"]

端口规划与项目价值总结

合理的端口规划是保证多服务共存的前提。下表列出了本次部署涉及的所有端口及其用途,为后续扩展提供参考:

端口用途
19530Milvus 向量数据库服务
9091Milvus 监控端口
18000Attu 可视化管理平台(避开业务 8080 端口冲突)

本次部署方案的核心价值体现在多个维度:纯内网环境运行,无外网依赖,满足企业安全合规要求;基础设施即代码,通过容器编排实现一键部署、可复现、可迁移;企业级单机架构,为 AI 项目提供稳定可靠的生产级存储底座。同时,Attu 可视化平台大幅降低了运维门槛,让向量数据的日常管理变得直观高效。

从技术演进角度看,这套容器化部署方案天然适配未来的 Kubernetes 集群化改造。通过将 Docker Compose 配置转换为 K8s 部署清单,可以实现从单机到多节点的平滑升级,为应对更大规模的向量检索需求做好准备。这也体现了容器化部署在 AI 基础设施领域的长期价值。

[AFFILIATE_SLOT_1]

对于正在构建 RAG 应用或知识库系统的开发者而言,这套方案提供了从零到一的完整参考路径。无论是个人项目还是企业级应用,都能从中获得可落地的实践指导。后续将持续输出多节点集群部署、K8s 编排、AI 应用开发等实战内容,欢迎保持关注。

[AFFILIATE_SLOT_2]

✅ 本文基于真实生产环境,提供了一套纯内网、可直接执行的 Milvus 容器化部署方案。通过 Docker Compose 实现了 Milvus、Etcd、MinIO、Attu 的无缝集成,为 AI 项目的数据底座建设提供了标准化范式。这套方案不仅适用于「商助慧」项目,也可作为各类知识库与向量检索系统的部署参考。