Docker部署AI应用的最佳实践
最近帮好几个朋友部署AI相关的服务,踩了不少坑。Ollama、Dify、RagFlow、n8n这些热门项目,每个都有自己的"脾气"。今天把部署经验整理出来,希望能帮大家少走弯路。
基础环境准备
不管部署什么,先把基础环境搞对:
系统要求:建议Ubuntu 22.04 LTS,内存至少16GB(跑大模型的话32GB起步),磁盘SSD 100GB以上。
Docker版本:用最新稳定版,别用系统自带的旧版本。安装Docker Engine而不是Docker Desktop(服务器上不需要GUI)。
Docker Compose:V2版本,直接用docker compose命令(注意没有横杠)。
GPU支持:如果要跑本地大模型,安装nvidia-container-toolkit。这个东西的安装步骤比较多,建议按官方文档一步步来,别图省事跳步骤。
Ollama部署
Ollama是本地跑大模型最方便的方案,Docker部署也很简单。
核心配置要点:
- 把模型文件目录挂载出来做持久化,默认在容器内的
/root/.ollama - 如果有GPU,加上
deploy.resources.reservations.devices配置 - 端口映射11434,这是Ollama的默认API端口
- 设置
OLLAMA_HOST=0.0.0.0让其他容器能访问
常见问题:模型下载到一半断了怎么办?重新pull同一个模型就行,Ollama支持断点续传。GPU不被识别?检查nvidia-smi能不能正常输出,然后确认docker的runtime配置。
Dify部署
Dify的Docker部署稍微复杂一点,因为它依赖的服务比较多(PostgreSQL、Redis、Weaviate等)。
核心配置要点:
- 用官方提供的docker-compose.yaml,别自己从头写
.env文件一定要配置好,尤其是SECRET_KEY和INIT_PASSWORD- 数据库和向量库的数据目录要挂载到宿主机
- Nginx反向代理建议用官方配置,改端口就行
资源分配技巧:Dify本身不太吃资源,但如果你在同一台机器上跑Ollama+Dify,内存分配要注意。建议给Ollama限制内存上限,防止它把内存全占了。
常见报错:启动后页面打不开?先看日志,90%的问题是数据库连接失败或者Redis没起来。用docker compose logs -f看具体哪个服务报错。
RagFlow部署
RagFlow做RAG知识库还不错,但部署确实有点折腾。
核心配置要点:
- RagFlow依赖Elasticsearch(或者OpenSearch),这个东西很吃内存
- ES的
vm.max_map_count必须设置为262144以上,不然ES起不来 - 模型服务可以对接Ollama或者在线API,建议先用在线API跑通再切本地模型
- 文档解析的临时文件会很多,给
/tmp目录留足空间
资源分配:RagFlow+ES至少需要8GB内存。如果和其他服务共享机器,建议在docker-compose里用mem_limit给每个服务设上限。
常见问题:文档解析失败?检查日志看是OCR问题还是模型问题。中文PDF解析效果不好?试试先用其他工具把PDF转成文本再导入。
n8n部署
n8n作为工作流自动化工具,部署最简单。
核心配置要点:
- 一个容器就搞定,挂载数据目录做持久化
- 设置
N8N_SECURE_COOKIE=false(如果没有HTTPS的话) - Webhook URL要配置正确,不然触发器不工作
- 时区设置为
Asia/Shanghai
和AI服务打通:n8n通过HTTP Request节点调用Ollama或Dify的API。建议把所有AI服务放在同一个Docker网络里,直接用容器名访问,不走宿主机端口。
多容器编排实战
如果你要在一台机器上跑Ollama+Dify+n8n的完整方案,编排是关键。
网络配置:创建一个共享的Docker网络,所有服务都加入这个网络。服务之间通过容器名互访,比如Dify的模型服务地址填http://ollama:11434。
启动顺序:用depends_on加healthcheck控制启动顺序。数据库先启动→中间件(Redis、ES)→应用服务(Dify、RagFlow)→工作流(n8n)。
数据持久化:所有需要持久化的数据都挂载到宿主机的统一目录下,比如/data/ai-stack/。方便备份和迁移。
日志管理:给每个容器配置日志轮转,防止日志文件把磁盘写满。在docker-compose里加logging配置,限制单文件大小和文件数量。
常见报错速查
问题:容器启动后立刻退出
→ 看docker logs 容器名,大概率是配置文件有误或者端口冲突
问题:GPU容器报 “could not select device driver”
→ nvidia-container-toolkit没装好或者Docker daemon没重启
问题:容器之间网络不通
→ 检查是不是在同一个Docker网络里,用docker network inspect确认
问题:数据库容器反复重启
→ 磁盘空间不够或者数据目录权限问题,检查宿主机挂载目录的权限
问题:内存不够导致OOM Kill
→ dmesg | grep -i oom查看是哪个进程被kill了,然后调整内存限制
生产环境注意事项
如果是要上生产环境而不只是本地玩玩,还需要关注:
- HTTPS:用Traefik或Nginx Proxy Manager做反向代理,配Let’s Encrypt证书
- 备份:定时备份数据目录,尤其是数据库的数据卷
- 监控:跑一个Portainer或者Uptime Kuma监控容器状态
- 安全:不要把不必要的端口暴露到公网,用防火墙限制访问
你们用Docker部署过哪些AI应用?有没有遇到什么奇葩的报错?欢迎在评论区分享你的部署经验和解决方案,大家一起排坑。