上一篇 下一篇 分享链接 返回 返回顶部

一套配置跑通 Ollama、Open WebUI 和 LiteLLM:Docker 部署实战指南

发布人:慈云数据-客服中心 发布时间:9小时前 阅读量:2

AI工具 Docker部署教程|附配置文件

随着大语言模型(LLM)和各类 AI 应用的普及,越来越多的团队和个人希望将 AI 工具部署到自己的服务器上,以获得更好的数据隐私、访问速度、可控成本以及二次开发能力。相比传统手动安装方式,Docker 部署具有环境隔离、迁移方便、配置清晰、维护成本低等优点,非常适合 AI 工具的快速上线。

本文将以一个较为通用、实用的 AI 工具部署方案为例,介绍如何使用 Docker Compose 部署一套本地 AI 服务环境。该方案包含:

  • Ollama:本地大模型运行服务,可运行 Llama、Qwen、DeepSeek、Gemma 等模型;
  • Open WebUI:类似 ChatGPT 的网页聊天界面,支持接入 Ollama;
  • LiteLLM:统一大模型 API 网关,可将不同模型服务封装为 OpenAI 兼容接口;
  • Nginx:反向代理服务,方便配置域名和 HTTPS;
  • 数据持久化目录:防止容器重启或升级后数据丢失。

本文会提供完整目录结构、docker-compose.yml 配置文件、Nginx 配置示例以及常用运维命令,适合个人服务器、内网服务器、开发测试环境使用。


一、部署前准备

在开始部署之前,你需要准备一台 Linux 服务器。推荐配置如下:

项目 推荐配置
操作系统 Ubuntu 20.04 / 22.04 / Debian 11+ / CentOS 7+
CPU 4 核及以上
内存 8GB 以上,推荐 16GB+
硬盘 50GB 以上可用空间
GPU 非必需,如需运行大模型建议 NVIDIA GPU
网络 能访问 Docker 镜像仓库

如果只是体验 7B 级别模型,CPU 也可以运行,但速度较慢。如果要获得较好的推理体验,建议使用带 NVIDIA 显卡的服务器,并安装 NVIDIA Container Toolkit。


二、安装 Docker 和 Docker Compose

如果你的服务器还没有安装 Docker,可以使用以下命令安装。

1. Ubuntu / Debian 安装 Docker

sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

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

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,检查版本:

docker -v
docker compose version

2. 设置 Docker 开机自启

sudo systemctl enable docker
sudo systemctl start docker

如果你希望当前用户无需每次使用 sudo 执行 Docker 命令,可以执行:

sudo usermod -aG docker $USER

执行后需要重新登录终端才会生效。


三、项目目录结构

建议在服务器上创建一个专门目录,例如 /opt/ai-tools

sudo mkdir -p /opt/ai-tools
cd /opt/ai-tools

推荐目录结构如下:

/opt/ai-tools
├── docker-compose.yml
├── .env
├── nginx
│   └── conf.d
│       └── ai-tools.conf
├── data
│   ├── ollama
│   ├── open-webui
│   └── litellm
└── logs
    └── nginx

创建目录:

mkdir -p nginx/conf.d
mkdir -p data/ollama data/open-webui data/litellm
mkdir -p logs/nginx

四、环境变量配置文件

/opt/ai-tools 目录下创建 .env 文件:

vim .env

写入以下内容:

# Open WebUI 管理员初始化配置
WEBUI_SECRET_KEY=please_change_this_to_a_random_string

# LiteLLM 配置
LITELLM_MASTER_KEY=sk-litellm-master-key-change-me
LITELLM_SALT_KEY=litellm-salt-key-change-me

# 时区
TZ=Asia/Shanghai

# 服务端口
OPEN_WEBUI_PORT=3000
LITELLM_PORT=4000
NGINX_HTTP_PORT=80

这里需要注意:

  1. WEBUI_SECRET_KEY 建议修改为复杂随机字符串;
  2. LITELLM_MASTER_KEY 相当于 API 管理密钥,不要使用默认值;
  3. 如果服务器上 80 端口已经被占用,需要修改 NGINX_HTTP_PORT
  4. 生产环境建议配合 HTTPS 使用。

五、Docker Compose 配置文件

/opt/ai-tools 目录下创建 docker-compose.yml

vim docker-compose.yml

写入以下配置:

version: "3.9"

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ai-ollama
    restart: unless-stopped
    environment:
      - TZ=${TZ}
    volumes:
      - ./data/ollama:/root/.ollama
    ports:
      - "11434:11434"
    networks:
      - ai-network

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: ai-open-webui
    restart: unless-stopped
    depends_on:
      - ollama
    environment:
      - TZ=${TZ}
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - ./data/open-webui:/app/backend/data
    ports:
      - "${OPEN_WEBUI_PORT}:8080"
    networks:
      - ai-network

  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: ai-litellm
    restart: unless-stopped
    depends_on:
      - ollama
    environment:
      - TZ=${TZ}
      - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
      - LITELLM_SALT_KEY=${LITELLM_SALT_KEY}
    volumes:
      - ./data/litellm/config.yaml:/app/config.yaml
    command:
      - "--config=/app/config.yaml"
      - "--port=4000"
    ports:
      - "${LITELLM_PORT}:4000"
    networks:
      - ai-network

  nginx:
    image: nginx:1.25-alpine
    container_name: ai-nginx
    restart: unless-stopped
    depends_on:
      - open-webui
      - litellm
    environment:
      - TZ=${TZ}
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./logs/nginx:/var/log/nginx
    ports:
      - "${NGINX_HTTP_PORT}:80"
    networks:
      - ai-network

networks:
  ai-network:
    driver: bridge

这个 Compose 文件包含 4 个服务:

  • ollama:负责模型下载、管理和推理;
  • open-webui:提供可视化聊天页面;
  • litellm:提供统一 API 转发能力;
  • nginx:对外提供统一入口。

六、LiteLLM 配置文件

由于上面的 Compose 文件将 ./data/litellm/config.yaml 挂载到了容器内部,所以需要先创建该配置文件:

vim data/litellm/config.yaml

写入以下内容:

model_list:
  - model_name: qwen2.5
    litellm_params:
      model: ollama/qwen2.5
      api_base: http://ollama:11434

  - model_name: llama3.1
    litellm_params:
      model: ollama/llama3.1
      api_base: http://ollama:11434

  - model_name: deepseek-r1
    litellm_params:
      model: ollama/deepseek-r1
      api_base: http://ollama:11434

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY
  database_url: null

litellm_settings:
  drop_params: true
  set_verbose: false

说明:

  • model_name 是对外暴露的模型名称;
  • model 中的 ollama/qwen2.5 表示调用 Ollama 中的 qwen2.5 模型;
  • api_base 使用 Docker Compose 内部服务名 ollama,而不是 127.0.0.1
  • 如果你没有下载对应模型,请先在 Ollama 中拉取。

七、Nginx 反向代理配置

创建 Nginx 配置文件:

vim nginx/conf.d/ai-tools.conf

写入以下内容:

server {
    listen 80;
    server_name _;

    client_max_body_size 100m;

    location / {
        proxy_pass http://open-webui:8080;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location /litellm/ {
        rewrite ^/litellm/(.*)$ /$1 break;

        proxy_pass http://litellm:4000;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

配置完成后,访问:

http://服务器IP/

即可进入 Open WebUI 页面。

LiteLLM 的接口地址为:

http://服务器IP/litellm/

如果你需要配置域名,可以将 server_name _; 修改为:

server_name ai.example.com;

然后将域名解析到服务器 IP 即可。


八、启动服务

/opt/ai-tools 目录下执行:

docker compose up -d

查看容器状态:

docker compose ps

如果全部服务都是 Up 状态,说明启动成功。

查看日志:

docker compose logs -f

只查看某个服务日志:

docker compose logs -f ollama
docker compose logs -f open-webui
docker compose logs -f litellm
docker compose logs -f nginx

九、下载并运行 AI 模型

Ollama 启动后,需要下载模型才能使用。进入 Ollama 容器:

docker exec -it ai-ollama bash

拉取模型,例如:

ollama pull qwen2.5
ollama pull llama3.1
ollama pull deepseek-r1

测试模型是否可用:

ollama run qwen2.5

如果模型可以正常回复,说明 Ollama 运行成功。

也可以直接在宿主机执行:

docker exec -it ai-ollama ollama list

查看已经安装的模型:

docker exec -it ai-ollama ollama list

删除不需要的模型:

docker exec -it ai-ollama ollama rm qwen2.5

十、访问 Open WebUI

打开浏览器访问:

http://服务器IP/

首次访问需要注册管理员账号。注册完成后,进入设置页面,可以看到 Open WebUI 已经连接到 Ollama。

如果模型列表没有显示,可以检查:

  1. Ollama 容器是否正常运行;
  2. 模型是否已经下载;
  3. Open WebUI 的环境变量 OLLAMA_BASE_URL 是否正确;
  4. Docker 网络是否正常;
  5. 查看 Open WebUI 日志排查问题。

常用检查命令:

docker compose logs -f open-webui
docker compose logs -f ollama

十一、测试 LiteLLM API

LiteLLM 可以将本地 Ollama 模型转换为 OpenAI 兼容接口,方便其他应用调用。

假设你的服务器 IP 是 192.168.1.100,可以使用以下命令测试:

curl http://192.168.1.100/litellm/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-litellm-master-key-change-me" \
  -d '{
    "model": "qwen2.5",
    "messages": [
      {
        "role": "user",
        "content": "请用一句话介绍 Docker 部署 AI 工具的优势"
      }
    ]
  }'

如果返回模型生成内容,说明 LiteLLM 已经部署成功。

在其他支持 OpenAI API 的工具中,可以这样配置:

Base URL: http://服务器IP/litellm/v1
API Key: .env 中的 LITELLM_MASTER_KEY
Model: qwen2.5

这样就可以让第三方工具通过 OpenAI 格式调用你的本地模型。


十二、启用 GPU 加速,可选

如果服务器安装了 NVIDIA GPU,可以使用 GPU 加速 Ollama 推理。首先确认宿主机可以识别显卡:

nvidia-smi

然后安装 NVIDIA Container Toolkit。Ubuntu 示例:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt update
sudo apt install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

修改 docker-compose.yml 中的 ollama 服务,增加 GPU 配置:

  ollama:
    image: ollama/ollama:latest
    container_name: ai-ollama
    restart: unless-stopped
    environment:
      - TZ=${TZ}
    volumes:
      - ./data/ollama:/root/.ollama
    ports:
      - "11434:11434"
    networks:
      - ai-network
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

保存后重启:

docker compose down
docker compose up -d

再次查看日志:

docker compose logs -f ollama

如果日志中显示使用 GPU,说明配置成功。


十三、配置 HTTPS,生产环境推荐

如果你要将服务暴露到公网,强烈建议配置 HTTPS。可以使用宿主机上的 Certbot,也可以使用 Nginx Proxy Manager、Traefik、Caddy 等工具。

这里给出一种简单思路:

  1. 将域名解析到服务器;
  2. 使用 Certbot 申请证书;
  3. 将证书目录挂载到 Nginx 容器;
  4. 在 Nginx 配置中监听 443;
  5. 配置 HTTP 自动跳转 HTTPS。

示例 Nginx HTTPS 配置如下:

server {
    listen 80;
    server_name ai.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name ai.example.com;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    client_max_body_size 100m;

    location / {
        proxy_pass http://open-webui:8080;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location /litellm/ {
        rewrite ^/litellm/(.*)$ /$1 break;
        proxy_pass http://litellm:4000;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

生产环境还建议限制后台访问 IP、配置防火墙、开启登录认证,并定期备份数据目录。


十四、常用运维命令

1. 启动服务

docker compose up -d

2. 停止服务

docker compose down

3. 重启服务

docker compose restart

4. 更新镜像

docker compose pull
docker compose up -d

5. 查看容器资源占用

docker stats

6. 查看磁盘占用

du -sh data/*

7. 清理未使用镜像

docker image prune -a

执行清理前请确认不再需要相关镜像,避免误删。


十五、数据备份与迁移

这套部署方案将核心数据都放在 /opt/ai-tools/data 目录下,因此备份非常简单。

停止服务:

cd /opt/ai-tools
docker compose down

打包数据:

tar -czvf ai-tools-backup.tar.gz data docker-compose.yml .env nginx

迁移到新服务器后,解压并启动:

tar -xzvf ai-tools-backup.tar.gz
docker compose up -d

如果模型文件较大,备份体积也会很大。你可以只备份 Open WebUI 数据和配置文件,模型在新服务器重新拉取。


十六、常见问题排查

1. Open WebUI 无法连接 Ollama

检查 docker-compose.yml 中是否配置:

- OLLAMA_BASE_URL=http://ollama:11434

注意这里不能写成 localhost。在 Docker 容器内部,localhost 指的是当前容器自身,而不是宿主机或其他容器。

2. LiteLLM 调用模型失败

检查模型是否已经被 Ollama 下载:

docker exec -it ai-ollama ollama list

同时确认 data/litellm/config.yaml 中模型名称与 Ollama 模型名称一致。

3. 容器启动失败

查看日志:

docker compose logs -f 服务名

例如:

docker compose logs -f litellm

如果是配置文件格式问题,通常日志中会有 YAML 解析错误。注意 YAML 对缩进非常敏感,建议使用两个空格缩进,不要混用 Tab。

4. 模型回复速度很慢

可能原因包括:

  • 使用 CPU 推理;
  • 内存不足导致频繁交换;
  • 模型参数量过大;
  • 并发请求过多;
  • 磁盘 I/O 性能较差。

可以尝试使用更小模型,例如 1.5B、3B、7B 版本;如果有 GPU,建议启用 GPU 加速。

5. 端口被占用

查看端口占用:

sudo lsof -i:80
sudo lsof -i:3000
sudo lsof -i:4000

如果端口被占用,可以修改 .env 文件中的端口配置,然后重启服务。


十七、安全建议

如果 AI 服务部署在公网,一定要注意安全问题:

  1. 修改默认密钥:不要使用示例中的默认 LITELLM_MASTER_KEY
  2. 开启 HTTPS:避免 API Key 和会话内容被明文传输;
  3. 限制访问来源:通过防火墙或 Nginx 限制 IP;
  4. 定期更新镜像:修复已知安全漏洞;
  5. 不要暴露 Ollama 端口:生产环境建议移除 11434:11434 的端口映射,仅允许容器内部访问;
  6. 定期备份数据:尤其是 Open WebUI 用户数据和配置文件;
  7. 控制模型调用权限:避免 API 被滥用导致服务器资源被耗尽。

如果只是在内网使用,可以关闭公网访问,仅通过 VPN、ZeroTier、Tailscale 等方式连接。


十八、完整配置文件汇总

1. .env

WEBUI_SECRET_KEY=please_change_this_to_a_random_string

LITELLM_MASTER_KEY=sk-litellm-master-key-change-me
LITELLM_SALT_KEY=litellm-salt-key-change-me

TZ=Asia/Shanghai

OPEN_WEBUI_PORT=3000
LITELLM_PORT=4000
NGINX_HTTP_PORT=80

2. docker-compose.yml

version: "3.9"

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ai-ollama
    restart: unless-stopped
    environment:
      - TZ=${TZ}
    volumes:
      - ./data/ollama:/root/.ollama
    ports:
      - "11434:11434"
    networks:
      - ai-network

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: ai-open-webui
    restart: unless-stopped
    depends_on:
      - ollama
    environment:
      - TZ=${TZ}
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - ./data/open-webui:/app/backend/data
    ports:
      - "${OPEN_WEBUI_PORT}:8080"
    networks:
      - ai-network

  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: ai-litellm
    restart: unless-stopped
    depends_on:
      - ollama
    environment:
      - TZ=${TZ}
      - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
      - LITELLM_SALT_KEY=${LITELLM_SALT_KEY}
    volumes:
      - ./data/litellm/config.yaml:/app/config.yaml
    command:
      - "--config=/app/config.yaml"
      - "--port=4000"
    ports:
      - "${LITELLM_PORT}:4000"
    networks:
      - ai-network

  nginx:
    image: nginx:1.25-alpine
    container_name: ai-nginx
    restart: unless-stopped
    depends_on:
      - open-webui
      - litellm
    environment:
      - TZ=${TZ}
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./logs/nginx:/var/log/nginx
    ports:
      - "${NGINX_HTTP_PORT}:80"
    networks:
      - ai-network

networks:
  ai-network:
    driver: bridge

3. data/litellm/config.yaml

model_list:
  - model_name: qwen2.5
    litellm_params:
      model: ollama/qwen2.5
      api_base: http://ollama:11434

  - model_name: llama3.1
    litellm_params:
      model: ollama/llama3.1
      api_base: http://ollama:11434

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY
  database_url: null

litellm_settings:
  drop_params: true
  set_verbose: false

4. nginx/conf.d/ai-tools.conf

server {
    listen 80;
    server_name _;

    client_max_body_size 100m;

    location / {
        proxy_pass http://open-webui:8080;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }

    location /litellm/ {
        rewrite ^/litellm/(.*)$ /$1 break;
        proxy_pass http://litellm:4000;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

十九、总结

通过本文的配置,我们使用 Docker Compose 部署了一套完整的 AI 工具环境,包括本地模型服务 Ollama、网页聊天界面 Open WebUI、统一模型 API 网关 LiteLLM 以及 Nginx 反向代理。该方案的优势在于结构清晰、易于维护、方便迁移,并且可以根据实际需求扩展更多 AI 应用。

对于个人用户而言,这套环境可以作为本地知识助手、代码助手、写作助手使用;对于团队而言,可以作为内部 AI 能力平台的基础版本,用于统一接入本地模型或第三方模型 API。

后续你还可以继续扩展:

  • 接入向量数据库,如 Milvus、Qdrant、Weaviate;
  • 部署知识库问答系统,如 Dify、FastGPT、AnythingLLM;
  • 接入图像生成工具,如 Stable Diffusion WebUI、ComfyUI;
  • 使用 PostgreSQL、Redis 提升系统稳定性;
  • 使用 Prometheus、Grafana 做监控;
  • 使用 Traefik 或 Caddy 自动管理 HTTPS 证书。

如果你希望快速搭建一套可用、可控、可扩展的 AI 工具平台,Docker Compose 是非常推荐的部署方式。只要合理规划配置文件、数据目录和安全策略,就可以在较短时间内完成从模型运行到 Web 访问,再到 API 调用的完整闭环。

目录结构
全文