基于Docker Compose的Dify与Ollama全栈部署实战指南

在当今快速迭代的技术环境中,如何高效部署AI应用栈成为开发者面临的核心挑战之一。传统部署方式往往需要手动配置多个组件,不仅耗时耗力,还容易因环境差异导致"在我机器上能跑"的经典问题。本文将介绍一种基于Docker Compose的工程化解决方案,通过容器化技术实现Dify(开源AI工作流平台)与Ollama(本地大模型运行框架)的一键式部署,特别适合需要离线环境或追求部署一致性的技术团队。

1. 环境准备与架构设计

1.1 系统要求与前置条件

在开始部署前,请确保您的系统满足以下基本要求:

  • 操作系统:Linux(推荐Ubuntu 20.04+/CentOS 7+)或macOS
  • 硬件配置
    • CPU:x86_64架构,至少4核
    • 内存:建议16GB以上(运行大模型需要更多内存)
    • 磁盘空间:至少50GB可用空间(模型文件通常体积较大)
  • 网络环境:能够访问Docker Hub或已准备好离线镜像包

提示:如果在内网环境部署,建议提前下载所有依赖的Docker镜像(约15GB)和模型文件。

1.2 项目目录结构设计

合理的目录结构是保证部署可维护性的关键。建议采用以下标准化布局:

dify-ollama-stack/
├── docker-compose.yml      # 主编排文件
├── .env                    # 环境变量配置
├── data/                   # 持久化数据
│   ├── redis/              # Redis数据目录
│   ├── ollama/             # Ollama模型存储
│   └── dify/               # Dify工作目录
├── configs/                # 配置文件
│   ├── redis.conf          # Redis定制配置
│   └── nginx/              # Nginx配置(如需)
└── images/                 # 离线镜像包
    ├── dify.tar
    ├── ollama.tar
    └── redis.tar

这种结构将运行时数据配置分离,便于备份和迁移,同时也符合Docker最佳实践。

2. Docker Compose编排核心配置

2.1 编写docker-compose.yml

以下是经过优化的多服务编排配置,集成了Dify、Ollama和Redis:

version: '3.8'

services:
  redis:
    image: redis:6.2-alpine
    container_name: dify-redis
    restart: unless-stopped
    volumes:
      - ./data/redis:/data
      - ./configs/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    ports:
      - "6379:6379"
    networks:
      - ai-net

  ollama:
    image: ollama/ollama:latest
    container_name: ollama-service
    restart: unless-stopped
    volumes:
      - ./data/ollama:/root/.ollama
    ports:
      - "11434:11434"
    environment:
      - OLLAMA_HOST=0.0.0.0
    networks:
      - ai-net
    deploy:
      resources:
        reservations:
          memory: 12G

  dify:
    image: langgenius/dify:latest
    container_name: dify-web
    restart: unless-stopped
    depends_on:
      - redis
      - ollama
    volumes:
      - ./data/dify:/app/data
    ports:
      - "80:3000"
    environment:
      - FLASK_APP=api
      - FLASK_ENV=production
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - OLLAMA_API_BASE_URL=http://ollama:11434
    networks:
      - ai-net

networks:
  ai-net:
    driver: bridge

关键配置说明:

  1. 资源限制:为Ollama服务预留了12GB内存,防止模型加载时OOM
  2. 网络隔离:所有服务通过自定义网络ai-net通信,避免端口冲突
  3. 数据持久化:所有重要数据通过volume挂载到主机目录
  4. 服务依赖:使用depends_on确保服务启动顺序

2.2 环境变量配置(.env)

创建.env文件定义可变参数,便于不同环境部署:

# Redis配置
REDIS_PASSWORD=your_secure_password

# Dify配置
DIFY_ADMIN_EMAIL=admin@yourdomain.com
DIFY_ADMIN_PASSWORD=ChangeMe123!

# Ollama配置
OLLAMA_DEFAULT_MODEL=llama2:13b

3. 离线部署实战技巧

3.1 镜像导入与验证

对于无法连接Docker Hub的环境,需提前准备离线镜像包:

# 导入镜像(假设所有tar包已放在./images目录)
docker load -i ./images/dify.tar
docker load -i ./images/ollama.tar
docker load -i ./images/redis.tar

# 验证镜像加载
docker images | grep -E 'dify|ollama|redis'

3.2 模型预加载策略

Ollama支持两种模型预加载方式:

方法一:通过volume挂载预下载模型

  1. 在主机下载模型:
    ollama pull llama2:13b
    
  2. 将模型文件复制到挂载目录:
    cp -r ~/.ollama/models ./data/ollama/
    

方法二:使用Dockerfile定制镜像

创建Dockerfile.ollama

FROM ollama/ollama:latest
RUN ollama pull llama2:13b && \
    ollama pull deepseek-r1:32b

然后构建自定义镜像:

docker build -t custom-ollama -f Dockerfile.ollama .

3.3 常见问题排查表

问题现象可能原因解决方案
Dify无法连接Ollama网络配置错误检查ai-net网络连通性
模型加载超时内存不足增加Ollama内存限制
Redis连接失败密码未配置在.env设置REDIS_PASSWORD
端口冲突服务已占用端口修改docker-compose.yml端口映射

4. 高级配置与优化

4.1 模型性能调优

通过Ollama的Modelfile可以定制模型运行参数。创建./configs/Modelfile

FROM llama2:13b
PARAMETER num_ctx 4096
PARAMETER num_gpu_layers 20
SYSTEM """
你是一个专业的AI助手,使用简洁专业的语言回答问题。
"""

然后应用到运行中的容器:

docker exec ollama-service ollama create tuned-llama -f /root/.ollama/Modelfile

4.2 Dify插件集成

在Dify中集成Ollama模型的步骤:

  1. 登录Dify控制台(默认http://localhost)
  2. 进入"插件市场" → 搜索"Ollama" → 安装
  3. 在"模型配置"中添加Ollama连接:
    名称: Local-Ollama
    基础URL: http://ollama:11434
    模型列表: llama2:13b, deepseek-r1:32b
    
  4. 测试连接并保存

4.3 监控与日志收集

建议添加Prometheus和Grafana监控:

# 在docker-compose.yml中添加
monitoring:
  image: prom/prometheus:latest
  ports:
    - "9090:9090"
  volumes:
    - ./configs/prometheus.yml:/etc/prometheus/prometheus.yml
  networks:
    - ai-net

grafana:
  image: grafana/grafana:latest
  ports:
    - "3000:3000"
  volumes:
    - ./data/grafana:/var/lib/grafana
  networks:
    - ai-net

配套的prometheus.yml配置示例:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'ollama'
    static_configs:
      - targets: ['ollama:11434']
  - job_name: 'redis'
    static_configs:
      - targets: ['redis:6379']

5. 生产环境最佳实践

5.1 安全加固措施

  1. 修改默认凭证

    • 首次登录Dify后立即修改管理员密码
    • 为Redis设置强密码(通过REDIS_PASSWORD环境变量)
  2. 网络隔离

    networks:
      ai-net:
        driver: bridge
        internal: true  # 禁止外部访问
    
  3. 定期备份

    # 备份关键数据
    tar -czvf backup-$(date +%Y%m%d).tar.gz ./data
    

5.2 性能优化建议

  • 模型选择:根据硬件配置选择合适的模型尺寸

    • 8GB内存:建议7B以下模型
    • 16GB内存:可运行13B模型
    • 32GB+内存:尝试30B以上模型
  • GPU加速: 若主机配备NVIDIA GPU,修改Ollama服务配置:

    ollama:
      runtime: nvidia
      environment:
        - NVIDIA_VISIBLE_DEVICES=all
    
  • 批处理请求: 在Dify工作流中合理设置批处理参数,减少模型加载次数

5.3 版本升级策略

  1. 测试环境验证

    docker-compose pull   # 获取新镜像
    docker-compose up -d  # 重建容器
    
  2. 回滚方案

    # 回退到上一个稳定版本
    docker-compose down
    docker-compose up -d --force-recreate --no-deps ollama dify
    
  3. 数据迁移检查清单

    • 备份./data目录
    • 记录当前模型版本
    • 检查插件兼容性

在实际项目中,这种部署方案显著减少了环境配置时间。通过将整个AI栈容器化,新团队成员能在5分钟内获得可用的开发环境,而运维团队则受益于统一的生产部署流程。一个特别实用的技巧是在初始化脚本中自动预加载常用模型,这可以节省首次使用时的大量等待时间。

更多推荐