Docker環(huán)境下Milvus向量數(shù)據(jù)庫的穩(wěn)定部署與常見問題總結
前言
Milvus 作為高性能開源向量數(shù)據(jù)庫,在 AI 應用中被廣泛使用。但在 Docker 環(huán)境下部署時,很多小伙伴會遇到鏡像拉取失敗、容器反復重啟、磁盤空間爆滿、數(shù)據(jù)“不翼而飛”、鎖屏后服務中斷等一系列問題。本文將結合我在 VMware 虛擬機 + CentOS 7 環(huán)境下的真實排坑經歷,從零到一,帶你完成一個穩(wěn)定、持續(xù)運行的 Milvus 獨立部署,并附上各類常見故障的解決方案。
環(huán)境介紹
- 宿主機:Windows 10 + VMware Workstation 16
- 虛擬機:CentOS 7.9(帶圖形界面)
- Docker 版本:20.10.x
- Milvus 版本:v2.6.2(standalone 模式)
- 其他工具:Attu(Milvus 可視化管理)、pymilvus、Dify(知識庫應用)
一、安裝 Milvus:使用官方腳本
Milvus 官方提供了 standalone_embed.sh 腳本,可以一鍵拉取鏡像并啟動內嵌 etcd 的 standalone 版本,非常適合本地開發(fā)與測試。
1.1 下載安裝腳本
由于 raw.githubusercontent.com 在國內經常被屏蔽,我們改用 jsDelivr CDN 下載:
curl -sfL https://cdn.jsdelivr.net/gh/milvus-io/milvus/scripts/standalone_embed.sh -o standalone_embed.sh chmod +x standalone_embed.sh
如果 CDN 也失敗,你可以手動創(chuàng)建腳本內容(文末附有簡潔版腳本)。
1.2 配置 Docker 鏡像加速(必須)
編輯 /etc/docker/daemon.json,添加國內鏡像源:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker1.3 啟動 Milvus
bash standalone_embed.sh start
腳本會自動拉取鏡像(默認 milvusdb/milvus:v2.6.2),創(chuàng)建容器并等待約 90 秒初始化。看到 “Start successfully.” 即安裝成功。
端口說明:
19530:gRPC 服務端口(SDK 連接用)9091:WebUI 管理界面(可通過瀏覽器訪問)2379:內嵌 etcd 端口(一般不用關心)
二、讓 Milvus 持續(xù)駐留,告別“自動掉線”
很多同學反映容器運行一段時間后就自己停了,尤其是在鎖屏或重啟虛擬機之后。問題核心在于:
- 容器沒有自動重啟策略
- 虛擬機鎖屏后可能掛起(Suspend)
2.1 添加容器自動重啟策略
在腳本啟動成功后,立即執(zhí)行:
docker update --restart unless-stopped milvus-standalone
這樣即使容器異常退出(如 OOM、etcd 故障),Docker 也會自動把它拉起來。
2.2 安全地禁止虛擬機掛起(非常重要?。?/h3>
千萬不要用 systemctl mask sleep.target ... ,它會導致圖形界面無法啟動或黑屏!取而代之,我們編輯 /etc/systemd/logind.conf 并重啟服務:
sudo sed -i 's/^#HandleSuspendKey=.*/HandleSuspendKey=ignore/' /etc/systemd/logind.conf sudo sed -i 's/^#HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf sudo systemctl restart systemd-logind
這樣鎖屏或合上筆記本蓋都不會觸發(fā)掛起,且完全不影響桌面環(huán)境。
2.3 限制 Docker 日志防止磁盤爆滿(血的教訓?。?/h3>
如果容器日志無限制,幾天就可能占滿整個虛擬機磁盤,導致容器退出(狀態(tài) Exited)。在 /etc/docker/daemon.json 中追加日志限制:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker配置后已經運行的容器不會立即生效,需要重建容器或重啟 Docker 后重新創(chuàng)建容器。如果當前容器未限制日志,可先 docker stop milvus-standalone && docker rm milvus-standalone 再重新運行腳本啟動即可。
三、數(shù)據(jù)持久化與恢復
3.1 數(shù)據(jù)到底存在哪兒?
腳本啟動時會自動將當前目錄下的 volumes/milvus 映射到容器內的 /var/lib/milvus,因此所有向量數(shù)據(jù)和 etcd 元數(shù)據(jù)都在宿主機上。只要這個目錄不被刪除,容器怎么換都丟不了數(shù)據(jù)。
千萬不要執(zhí)行 bash standalone_embed.sh delete,這個命令會徹底刪除數(shù)據(jù)目錄!
3.2 “數(shù)據(jù)不見了”怎么辦?
常見場景:重啟 Milvus 后,用 Attu 或 pymilvus 連上發(fā)現(xiàn)集合為空。這大概率不是數(shù)據(jù)丟了,而是內嵌 etcd 元數(shù)據(jù)損壞或服務未正常啟動。可通過以下步驟修復:
# 1. 停止故障容器 docker stop milvus-standalone docker rm milvus-standalone # 2. 備份并重置 etcd 元數(shù)據(jù)(原有的向量數(shù)據(jù)還在) mv /root/volumes/milvus/etcd /root/volumes/milvus/etcd_backup_$(date +%Y%m%d%H%M%S) # 3. 重新用腳本啟動(會自動生成新的 etcd 并掃描舊數(shù)據(jù)) bash standalone_embed.sh start docker update --restart unless-stopped milvus-standalone
啟動后,之前的 collection 和向量數(shù)據(jù)會重新出現(xiàn)。
3.3 磁盤空間爆滿的排查
突然發(fā)現(xiàn)根分區(qū) 100% 占用,常見元兇是:
- 容器內部數(shù)據(jù)(忘記掛載外部卷):如果你某次用了錯誤的
docker run -v或沒用掛載,Milvus 會將數(shù)據(jù)全部寫入容器可寫層,快速占滿磁盤。此時docker container prune -f刪除已停止的舊容器即可瞬間釋放幾十 GB。 - Docker 日志無限增長:日志大小限制必須提前設置,否則很快就吞掉磁盤。
四、常見錯誤與解決
| 錯誤信息 | 原因 | 解決辦法 |
|---|---|---|
iptables: No chain/target/match by that name | Docker 的 iptables 規(guī)則鏈丟失 | 重啟 Docker 服務:sudo systemctl restart docker |
etcdserver: request timed out | etcd 連接超時,元數(shù)據(jù)損壞 | 按上述“重置 etcd 元數(shù)據(jù)”步驟處理 |
| 容器反復重新啟動 (Exited 255) | 通常為 etcd 損壞或 OOM | 查看日志 docker logs milvus-standalone,并考慮增加內存或重置 etcd |
pymilvus 連接 ECONNRESET | 服務未完全就緒或 etcd 故障 | 等待 1-2 分鐘,或檢查日志;若 etcd 報錯則重置 etcd |
| Attu 連接成功但看不到集合 | etcd 元數(shù)據(jù)丟失 | 同樣需要重置 etcd |
| 虛擬機鎖屏后 Milvus 停止 | 系統(tǒng)掛起導致 | 按上面方法配置 logind.conf |
五、管理與連接
5.1 Attu 圖形化連接
下載 Attu 桌面版或使用 Docker 版,連接地址:127.0.0.1:19530(如果在虛擬機內部訪問)。
如果從宿主機訪問,需在 VMware 中配置端口轉發(fā)(NAT 模式)或使用橋接網絡,防火墻放行 9091/19530/5432 等端口。
5.2 pymilvus 連接示例
from pymilvus import connections connections.connect(host="localhost", port="19530")
5.3 備份 Milvus 數(shù)據(jù)
建議定期備份:
sudo tar -czf /backup/milvus_$(date +%Y%m%d).tar.gz /root/volumes/milvus
六、總結與最佳實踐
- 啟動腳本:始終用
standalone_embed.sh start,避免手動docker run時遺漏掛載參數(shù)。 - 自動重啟:創(chuàng)建后立即
docker update --restart unless-stopped。 - 防掛起:使用
HandleSuspendKey=ignore代替systemctl mask。 - 日志限制:部署之初就配置 Docker deamon 日志上限。
- 數(shù)據(jù)備份:定期打包
/root/volumes/milvus。 - 清理舊容器:每周運行
docker container prune -f回收空間。
按照這樣的配置,你的 Milvus 服務就能在 Docker 環(huán)境中非常穩(wěn)定地運行,無論是開發(fā)調試還是作為 Dify 等應用的向量存儲后端,都不會輕易掉線。
到此這篇關于Docker環(huán)境下Milvus向量數(shù)據(jù)庫的穩(wěn)定部署與常見問題總結的文章就介紹到這了,更多相關Docker下Milvus向量數(shù)據(jù)庫部署內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Docker實現(xiàn)Redis主從+哨兵搭建的示例實踐
本文主要介紹了基于Docker實現(xiàn)Redis主從+哨兵搭建的示例實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
使用Docker構建開發(fā)環(huán)境的方法步驟(?Windows和mac)
利用Docker,我們可以做很多事情。所以本文就詳細介紹了使用Docker構建開發(fā)環(huán)境的方法步驟,分為?Windows和mac版本,具有一定的參考價值,感興趣的可以了解一下2021-12-12
在 Centos 7.9 中如何安裝與配置 Docker 20.10.
這篇文章主要介紹了在 Centos 7.9 中如何安裝與配置 Docker 20.10.18,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
window-docker的容器使用宿主機音頻設備的過程詳解
這篇文章主要介紹了window-docker的容器使用宿主機音頻設備的相關知識,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-05-05
Docker+Jenkins實現(xiàn)一鍵自動化部署項目的圖文教學
Jenkins是一個廣泛使用的開源持續(xù)集成工具,它能自動化構建,測試和部署軟件項目,本文主要介紹了關于docker搭建Jenkins實現(xiàn)一鍵自動化部署項目,需要的朋友可以參考下2025-05-05
基于Kubernetes和Docke實現(xiàn)留言簿案例
這篇文章主要介紹了基于Kubernetes和Docke實現(xiàn)留言簿案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10

