实战演练:基于Docker Compose一键部署Milvus与Attu的完整工作流
1. 为什么选择Docker Compose部署Milvus与Attu
在向量数据库领域,Milvus凭借其出色的性能已经成为开发者们的首选工具。但每次手动部署Milvus服务端和Attu管理界面时,那些繁琐的配置步骤总让人头疼。直到我发现用Docker Compose可以像搭积木一样轻松完成整套环境的搭建,整个过程从原来的2小时缩短到5分钟。
Docker Compose的魅力在于它能用一份YAML文件定义整个应用栈。想象一下,你只需要编写一个菜单(compose文件),厨师(Docker)就会自动帮你把前菜(Milvus)、主菜(Attu)和调料(网络配置)全部准备好。我去年在客户现场演示时,原本需要半天才能完成的POC环境搭建,现在喝杯咖啡的功夫就搞定了。
这种部署方式特别适合以下场景:
- 本地开发调试:快速重建测试环境
- 团队协作:确保所有成员使用完全一致的配置
- 演示环境:随时可以销毁重建的干净实例
- CI/CD流水线:作为自动化测试的基础设施
2. 环境准备:打造你的Docker游乐场
2.1 Docker引擎安装指南
工欲善其事必先利其器,我们先来配置好Docker环境。这里以Ubuntu 22.04为例,其他系统可以参考官方文档调整:
# 卸载旧版本(如果有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# 添加Docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成后,做个简单的验证:
sudo docker run hello-world
如果看到欢迎信息,说明你的Docker已经准备就绪。为了避免每次都要加sudo,可以执行:
sudo usermod -aG docker $USER
newgrp docker
2.2 Docker Compose版本检查
现代Docker已经内置了Compose插件,运行以下命令确认版本:
docker compose version
建议使用v2.x版本,如果显示命令不存在,可能需要单独安装。我在AWS EC2上就遇到过这个问题,后来发现是因为用了较旧的Docker版本。
3. 编写Compose文件:你的部署蓝图
3.1 基础服务定义
创建一个项目目录,比如milvus-demo,然后新建docker-compose.yml文件:
version: '3.8'
services:
milvus-standalone:
image: milvusdb/milvus:v2.3.3
container_name: milvus-standalone
environment:
- ETCD_USE_EMBED=true
- COMMON_STORAGETYPE=local
ports:
- "19530:19530"
- "9091:9091"
volumes:
- ./volumes/milvus:/var/lib/milvus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
timeout: 5s
retries: 3
attu:
image: zilliz/attu:v2.3.0
container_name: attu
environment:
- MILVUS_URL=milvus-standalone:19530
ports:
- "8000:3000"
depends_on:
milvus-standalone:
condition: service_healthy
这个配置有几个关键点需要注意:
- 版本匹配:Milvus和Attu的版本需要兼容
- 网络通信:Attu通过服务名
milvus-standalone访问Milvus - 健康检查:确保Milvus完全启动后再启动Attu
3.2 高级配置技巧
对于生产环境,你可能需要添加更多配置:
services:
milvus-standalone:
# ...其他配置保持不变...
deploy:
resources:
limits:
cpus: '2'
memory: 8G
ulimits:
nofile:
soft: 65536
hard: 65536
sysctls:
- net.core.somaxconn=1024
attu:
# ...其他配置保持不变...
environment:
- MILVUS_URL=milvus-standalone:19530
- HIDE_SIDEBAR=false
- DEFAULT_USER=admin
- DEFAULT_PASSWORD=admin123
这些配置来自我在金融行业部署时的经验:
- 资源限制防止容器占用过多主机资源
- 文件描述符限制提升性能
- Attu的管理员账户设置增强安全性
4. 部署实战:从零到一的完整过程
4.1 启动服务栈
在包含docker-compose.yml的目录中执行:
docker compose up -d
这个简单的命令背后发生了很多事情:
- Docker会拉取所需的镜像(如果本地没有)
- 创建默认的网络让容器互通
- 按依赖顺序启动服务
- 根据健康检查确认服务状态
可以通过以下命令观察启动日志:
docker compose logs -f
4.2 验证服务状态
大约1-2分钟后,运行以下命令检查服务状态:
docker compose ps
你应该看到两个容器的状态都是running (healthy)。如果遇到问题,可以尝试:
# 查看Milvus日志
docker logs milvus-standalone
# 检查网络配置
docker network inspect milvus-demo_default
我在第一次部署时就遇到了端口冲突,发现是之前测试的容器没有完全删除。解决方法很简单:
# 停止并删除所有相关容器
docker compose down
# 清理旧数据(如果需要)
sudo rm -rf ./volumes
5. 使用Attu管理你的向量数据库
5.1 初次访问配置
打开浏览器访问http://localhost:8000,你会看到Attu的登录界面。如果是默认配置,直接点击连接即可。
首次使用时建议:
- 在"Collections"页面创建测试集合
- 尝试插入一些测试向量
- 体验搜索功能
Attu的界面非常直观,但有几个隐藏技巧:
- 按住Ctrl可以多选向量
- 在搜索界面可以保存常用查询模板
- 右上角的"Explain"按钮可以查看查询执行计划
5.2 常见问题排查
连接失败怎么办?
- 确认Milvus容器健康状态:
docker inspect -f '{{.State.Health.Status}}' milvus-standalone - 检查Attu容器日志:
docker logs attu - 测试容器间网络:
docker exec -it attu curl milvus-standalone:19530
性能调优建议
- 在"Advanced"页面调整索引参数
- 监控"Metrics"页面的系统指标
- 对于大数据集,考虑分批导入
6. 生产环境进阶配置
6.1 数据持久化方案
默认配置使用本地卷存储数据,适合开发环境。生产环境建议:
services:
milvus-standalone:
volumes:
- milvus_data:/var/lib/milvus
volumes:
milvus_data:
driver: local
driver_opts:
type: none
device: /mnt/ssd/milvus
o: bind
或者使用云存储:
volumes:
milvus_data:
driver: cloudstor:aws
driver_opts:
backing: relocatable
size: 100
6.2 高可用部署
对于关键业务系统,可以使用分布式版Milvus:
services:
milvus:
image: milvusdb/milvus:v2.3.3
environment:
- DEPLOY_MODE=cluster
- ETCD_ENDPOINTS=etcd:2379
- MINIO_ENDPOINTS=minio:9000
depends_on:
- etcd
- minio
etcd:
image: quay.io/coreos/etcd:v3.5.0
# ... etcd配置 ...
minio:
image: minio/minio:RELEASE.2023-07-07T07-13-57Z
# ... minio配置 ...
这种配置下,每个组件都可以横向扩展,但资源消耗会显著增加。建议至少8核16GB内存的主机。
7. 日常维护技巧
7.1 备份与恢复
使用docker compose exec可以直接操作容器内的数据:
# 备份元数据
docker compose exec milvus-standalone tar czvf /tmp/milvus_backup.tar.gz /var/lib/milvus
# 将备份复制到主机
docker cp milvus-standalone:/tmp/milvus_backup.tar.gz .
# 恢复数据
docker cp milvus_backup.tar.gz milvus-standalone:/tmp/
docker compose exec milvus-standalone tar xzvf /tmp/milvus_backup.tar.gz -C /
7.2 版本升级策略
Milvus的升级需要谨慎操作:
- 先备份数据
- 修改compose文件中的镜像版本
- 执行:
docker compose pull docker compose down docker compose up -d - 检查数据兼容性
建议先在测试环境验证升级过程。我遇到过从2.1升级到2.2时索引格式变化导致的问题,后来是通过重建索引解决的。
8. 性能优化实战
8.1 资源分配策略
通过cgroup限制资源使用:
services:
milvus-standalone:
deploy:
resources:
limits:
cpus: '4'
memory: 16G
reservations:
memory: 8G
同时调整Milvus的配置参数:
environment:
- QUERY_NODE_GRPC_CPUNUM=2
- DATA_NODE_INSERT_BUFFERSIZE=512
8.2 监控方案集成
搭配Prometheus监控:
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
对应的prometheus.yml需要配置抓取Milvus的metrics端点。这套配置在我的生产环境已经稳定运行了6个月,帮助发现了多次性能瓶颈。
更多推荐
所有评论(0)