Skip to content

Docker 部署 Ollama:搭建本地大模型推理 API

Ollama 提供模型下载、运行和 HTTP API,可以为命令行工具、桌面客户端、知识库或 Agent 提供本地推理服务。本文使用 v0.33.2 对应的官方镜像 ollama/ollama:0.33.2,正式部署采用单服务 Docker Compose,并把模型与服务配置保存在独立数据卷中。

默认配置只把 API 映射到宿主机 127.0.0.1:11434,适合单机调用或放在带认证的反向代理后面。Ollama Compose 属于单机自托管方案,不提供高可用、租户隔离或应用层访问控制;不要把 11434 端口直接暴露到公网。

部署结论

项目本文采用的值
GitHub 地址ollama/ollama
官方镜像ollama/ollama:0.33.2
项目版本v0.33.2
正式部署Docker Compose,CPU 默认路径,可选 NVIDIA 或 AMD GPU 覆盖文件
快速体验支持:docker run,仅用于临时检查 API,不保存模型
适用范围个人工作站、单机开发环境、可信内网推理服务
主机架构标准镜像:linux/amd64linux/arm64;ROCm 镜像:linux/amd64
最低资源官方未给出统一下限;内存、显存和磁盘需求取决于模型大小、上下文长度与并发量
对外端口127.0.0.1:11434 -> 容器 11434/tcp
持久化位置Docker 卷 ollama-data -> /root/.ollama
依赖服务无独立数据库、缓存或消息队列;首次拉取模型需要访问模型仓库
验证范围官方资料和 v0.33.2 发布配置核对;Compose 静态校验;未拉取镜像、未启动容器
部署日期2026-08-31

Compose 便于固定镜像版本、端口、数据卷、健康检查和日志轮转。docker run 示例不挂载数据卷,容器停止后不会保留模型,只适合确认当前主机能否启动 Ollama API。

运行结构

Ollama 容器在 11434/tcp 提供 HTTP API。宿主机端口默认绑定回环地址,只有本机进程能够直接访问;模型清单、模型分片和服务配置写入 /root/.ollama,由 ollama-data 卷跨容器重建保留。

Mermaid 流程图
查看源码
flowchart LR
  Client[本机应用或反向代理] -->|127.0.0.1:11434| API[Ollama API]
  API --> Runtime[CPU / NVIDIA / AMD 推理]
  API --> Data[(ollama-data<br/>模型与服务配置)]
  API --> Registry[Ollama 模型仓库]

模型下载可能占用数 GB 到数十 GB 磁盘;模型加载还会占用系统内存或显存。选型时先查看模型页面给出的大小,再为数据卷、备份和升级保留余量。

部署前准备

准备一台安装了 Docker Engine 和 Docker Compose v2 的 Linux 主机。Docker Desktop 也能运行 CPU 路径,但 macOS Docker Desktop 不支持把 Apple GPU 透传给 Linux 容器;需要 Metal 加速时应使用 macOS 原生 Ollama。

bash
docker --version
docker compose version
docker info --format '{{.Architecture}}'

确认 11434 端口没有被占用:

bash
ss -lntp | grep ':11434'

没有输出通常表示端口空闲。已有 Ollama 或其他服务监听时,先确认进程用途,再修改 Compose 的宿主机端口;不要直接终止来源不明的进程。

GPU 路径还有额外条件:

  • NVIDIA GPU 需要受支持的驱动和 NVIDIA Container Toolkit。Ollama v0.33.2 文档要求 NVIDIA compute capability 5.0+,驱动版本通常为 550 或更新;compute capability 5.0 至 6.2 需要 570 或更新。
  • AMD ROCm 路径需要受支持的 AMD GPU 和 Linux ROCm v7 驱动,并让容器访问 /dev/kfd/dev/dri
  • 只使用 CPU 时不需要安装 GPU 容器运行时。

Docker 快速体验

下面的容器仅用于临时体验,不挂载模型目录,不能替代后续 Compose 正式部署:

bash
docker run -d \
  --rm \
  --name ollama-trial \
  -p 127.0.0.1:11434:11434 \
  ollama/ollama:0.33.2

等待服务启动后查询版本:

bash
curl -fsS http://127.0.0.1:11434/api/version

响应应为 JSON,并包含 "version":"0.33.2"。检查完成后停止容器:

bash
docker stop ollama-trial

Docker Compose 正式部署

创建工作目录

bash
mkdir -p "$HOME/apps/ollama"
cd "$HOME/apps/ollama"

保存 Compose 配置

将下面内容保存为 $HOME/apps/ollama/compose.yaml

yaml
services:
  ollama:
    image: ollama/ollama:0.33.2
    restart: unless-stopped
    ports:
      - "127.0.0.1:11434:11434"
    volumes:
      - ollama-data:/root/.ollama
    healthcheck:
      test: ["CMD", "ollama", "list"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 10s
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  ollama-data:
    name: ollama-data

/root/.ollama 来自官方 Docker 运行参数。显式卷名 ollama-data 避免 Compose 项目目录改名后生成另一份空卷;健康检查调用容器内 Ollama CLI,不依赖额外安装 curl

校验并启动

bash
docker compose config
docker compose pull
docker compose up -d
docker compose ps

docker compose config 应输出规范化配置且没有错误。服务启动后,docker compose ps 应显示 ollamaUp,健康状态随后变为 healthy

按需启用 GPU

CPU 主配置保持不变,GPU 参数放到单独的覆盖文件中。服务器更换 GPU 或临时回退 CPU 时,不需要改动模型卷。

NVIDIA GPU

将下面内容保存为 $HOME/apps/ollama/compose.nvidia.yaml

yaml
services:
  ollama:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities:
                - gpu

先确认 Docker 能识别 NVIDIA 运行时,再合并配置启动:

bash
nvidia-smi
docker compose -f compose.yaml -f compose.nvidia.yaml config
docker compose -f compose.yaml -f compose.nvidia.yaml pull
docker compose -f compose.yaml -f compose.nvidia.yaml up -d

Docker Compose 的 GPU 设备预留要求 capabilities: [gpu]。多卡主机可以把 count: all 改成 device_ids,两者不能同时配置。

AMD ROCm

将下面内容保存为 $HOME/apps/ollama/compose.amd.yaml

yaml
services:
  ollama:
    image: ollama/ollama:0.33.2-rocm
    devices:
      - /dev/kfd:/dev/kfd
      - /dev/dri:/dev/dri

v0.33.2 官方发布工作流为 ROCm 构建追加 -rocm 后缀。ROCm 镜像只构建 linux/amd64,ARM64 主机不要使用这条路径。

bash
rocminfo
docker compose -f compose.yaml -f compose.amd.yaml config
docker compose -f compose.yaml -f compose.amd.yaml pull
docker compose -f compose.yaml -f compose.amd.yaml up -d

SELinux 拒绝设备访问时,先检查审计日志。Ollama 硬件文档给出的主机级开关是 sudo setsebool container_use_devices=1;执行前应确认当前发行版使用 SELinux,不能把该命令当成所有 Linux 的通用步骤。

GPU 部署后,所有会重新合并或重建服务的 configpullup 命令都必须继续带上同一份覆盖文件。遗漏 compose.nvidia.yamlcompose.amd.yaml 会让新容器按 CPU 主配置启动。pslogsexecrestart 只操作已经创建的服务,可以直接使用主配置。

首次下载并运行模型

Ollama 服务启动后还没有本地模型。以下命令下载官方 Docker 文档示例采用的 llama3.2

bash
cd "$HOME/apps/ollama"
docker compose exec ollama ollama pull llama3.2
docker compose exec ollama ollama list

下载完成后,模型清单应出现 llama3.2、内容摘要和磁盘大小。随后运行一次非交互提示:

bash
docker compose exec ollama ollama run llama3.2 "只回复:Ollama 已就绪"

模型大小和首次加载时间取决于具体标签与硬件。资源不足时选择更小的模型,而不是继续提高并发或上下文长度。

验证部署结果

下面四组检查由读者在目标主机执行。本文没有启动容器,因此预期结果是验收标准,不是本文的实测记录。

容器状态

bash
cd "$HOME/apps/ollama"
docker compose ps

成功状态应为 Uphealthy。容器反复重启时直接查看日志,不要继续拉取模型。

应用响应

先验证版本和模型列表:

bash
curl -fsS http://127.0.0.1:11434/api/version
curl -fsS http://127.0.0.1:11434/api/tags

第一个响应应包含 Ollama 版本;第二个响应应包含 models 数组。再调用一次生成接口:

bash
curl -fsS http://127.0.0.1:11434/api/generate \
  -H 'Content-Type: application/json' \
  -d '{"model":"llama3.2","prompt":"只回复 ok","stream":false}'

成功响应是 JSON,包含 responsedone 等字段。404 或模型不存在错误通常表示模型名不匹配,应先运行 ollama list

日志与健康状态

bash
docker compose logs --tail=100 ollama
docker compose exec ollama ollama list

日志不应持续出现端口绑定、模型文件权限或 GPU 初始化错误。使用 GPU 运行过一次模型后,再检查实际处理器分配:

bash
docker compose exec ollama ollama ps

PROCESSOR 列显示 100% GPU 才代表模型完整加载到 GPU;100% CPU 说明当前请求没有使用 GPU,混合百分比表示模型分布在系统内存与显存中。

持久化

先确认 ollama list 中存在已下载模型,再强制重建应用容器:

bash
docker compose exec ollama ollama list
docker compose up -d --force-recreate ollama
docker compose exec ollama ollama list

重建前后应看到相同模型。第二次清单为空时,检查 Compose 是否仍把 ollama-data 挂载到 /root/.ollama,并用 docker volume inspect ollama-data 确认实际卷。

日常运维

bash
cd "$HOME/apps/ollama"

# 查看状态
docker compose ps

# 查看最近日志
docker compose logs --tail=100 ollama

# 重启服务
docker compose restart ollama

# 查看本地模型
docker compose exec ollama ollama list

# 查看已加载模型及 CPU/GPU 分配
docker compose exec ollama ollama ps

不要把无边界的 docker compose logs -f 当作唯一监控方式。长期运行至少要监控容器健康、11434 响应、宿主机磁盘、内存或显存,以及模型请求错误率。

备份与恢复

ollama-data 保存模型文件和服务配置。模型通常可以重新下载,但私有模型、导入模型、服务配置和密钥文件可能无法从公共仓库恢复。备份前停止服务写入,换取一致的卷快照。

备份数据卷

下面使用一次性 Alpine 容器读取数据卷并生成带时间戳的压缩包:

bash
cd "$HOME/apps/ollama"
mkdir -p backups
BACKUP_NAME="ollama-data-$(date +%Y%m%d-%H%M%S).tar.gz"

docker compose stop ollama
docker run --rm \
  -v ollama-data:/source:ro \
  -v "$PWD/backups":/backup \
  -e BACKUP_NAME="$BACKUP_NAME" \
  alpine:3.22 \
  sh -c 'tar -czf "/backup/$BACKUP_NAME" -C /source .'
docker compose start ollama

test -s "backups/$BACKUP_NAME"
tar -tzf "backups/$BACKUP_NAME" | head

test -s 成功且归档清单可读,只证明备份文件存在、格式可读;可靠备份还需要复制到另一块存储,并定期完成恢复演练。

恢复到新数据卷

恢复会中断服务。下面创建新卷 ollama-data-restored,不会覆盖现有 ollama-data,因此失败时仍可切回原卷。

bash
cd "$HOME/apps/ollama"
ls -1 backups/ollama-data-*.tar.gz
read -r -p "输入要恢复的备份文件名:" RESTORE_FILE
test -f "backups/$RESTORE_FILE"

docker compose down
docker volume create ollama-data-restored
docker run --rm \
  -v ollama-data-restored:/target \
  -v "$PWD/backups":/backup:ro \
  -e RESTORE_FILE="$RESTORE_FILE" \
  alpine:3.22 \
  sh -c 'tar -xzf "/backup/$RESTORE_FILE" -C /target'

compose.yaml 末尾的卷名从 ollama-data 改为 ollama-data-restored

yaml
volumes:
  ollama-data:
    name: ollama-data-restored

重新启动并核对模型:

bash
docker compose up -d
docker compose ps
docker compose exec ollama ollama list

确认模型可列出且生成请求成功后,再决定是否保留原卷。本文不提供自动删除原卷的命令,避免在恢复尚未验证时丢失回退点。

升级与回滚

升级前阅读 Ollama Releases,确认目标版本的配置变化和硬件要求,然后完成数据卷备份。

  1. 记录当前镜像 ollama/ollama:0.33.2docker compose exec ollama ollama list 输出。
  2. 备份 ollama-data,并确认压缩包可列出内容。
  3. compose.yaml 中的镜像标签改为目标版本,不要改成浮动的 latest
  4. 拉取新镜像、重建服务并执行四类验收。
bash
docker compose config
docker compose pull
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:11434/api/version
docker compose exec ollama ollama list

NVIDIA 或 AMD 部署应把上述 configpullup 命令改为包含对应覆盖文件的形式;升级期间不能省略原有 GPU 配置。

需要回滚程序时,把镜像标签改回 0.33.2,再运行 docker compose pulldocker compose up -d。官方没有承诺任意新版本的数据都能被旧版本读取;如果升级后模型或配置格式发生不兼容变化,应按上一节恢复升级前备份到新数据卷,再由旧镜像验证。

安全边界

  • 保留 127.0.0.1:11434:11434 可以阻止局域网和公网直接访问 API。需要局域网访问时,优先绑定服务器的具体内网 IP,并配合防火墙限制来源网段。
  • Ollama 本地 API 的官方 OpenAPI 定义没有应用层认证要求。跨主机访问应放在 VPN、SSH 隧道或带 TLS 与身份认证的反向代理后面。
  • 不要为了浏览器集成把 OLLAMA_ORIGINS=* 作为默认配置。只添加实际需要的来源,减少任意网页调用本地模型的风险。
  • 代理只配置 HTTPS_PROXY。Ollama 官方 FAQ 明确提示不要为模型拉取设置 HTTP_PROXY,错误的 HTTP_PROXY 可能干扰客户端连接服务。
  • 模型可能包含受限许可或敏感训练内容。部署方仍需核对模型许可、数据处理边界和输出使用规则。
  • Docker 卷备份可能包含私有模型、服务配置和密钥文件,应加密存储并限制访问权限。

常见问题

curl 无法连接 11434

先看容器状态和最近日志:

bash
docker compose ps
docker compose logs --tail=100 ollama

本机调用必须访问 127.0.0.1:11434。其他机器无法访问是默认安全行为;确需内网共享时,将端口绑定改为服务器的具体内网 IP,并同步配置防火墙。

模型下载超时或中断

确认宿主机能访问模型仓库,并检查 Docker daemon 的 DNS 与代理设置。容器代理只设置 HTTPS_PROXY,例如在 Compose 服务中加入:

yaml
services:
  ollama:
    environment:
      HTTPS_PROXY: https://proxy.example.com

企业代理使用自签 CA 时,需要构建包含 CA 证书的派生镜像;不要通过关闭 TLS 校验绕过证书问题。

NVIDIA GPU 已安装但模型仍使用 CPU

依次检查主机驱动、NVIDIA Container Toolkit、覆盖文件是否参与启动,以及模型实际处理器分配:

bash
nvidia-smi
docker compose -f compose.yaml -f compose.nvidia.yaml config
docker compose -f compose.yaml -f compose.nvidia.yaml up -d
docker compose exec ollama ollama ps

ollama ps 需要在模型加载期间检查。显存不足时,Ollama 可能把部分或全部模型放到系统内存。

Docker Desktop for Mac 没有使用 Apple GPU

macOS Docker Desktop 缺少 Ollama 所需的 GPU 透传,Linux 容器只能走 CPU。需要 Apple Metal 加速时,安装 macOS 原生 Ollama,并让容器化客户端通过宿主机地址访问原生服务。

重建容器后模型消失

检查当前配置和数据卷:

bash
docker compose config
docker volume inspect ollama-data
docker compose exec ollama ollama list

常见原因是启动了另一份 Compose 配置、改过显式卷名,或临时 docker run 容器从未挂载 /root/.ollama。不要在确认卷内容前执行卷清理命令。

总结

Ollama v0.33.2 可以用单服务 Compose 提供本地推理 API。默认绑定回环地址、固定镜像版本、挂载 ollama-data 并设置健康检查,能够覆盖单机自托管的基础运行需求;NVIDIA 与 AMD 参数通过独立覆盖文件启用,便于保留 CPU 回退路径。公开或多人使用仍需要额外的认证、TLS、访问控制、容量评估和监控。

本文完成官方文档、Release、Dockerfile、镜像标签生成规则与 Compose 结构核对。当前环境无法连接 Docker daemon,Docker Hub Registry 元数据查询也超时,因此没有拉取镜像、检查远端 manifest、启动容器或运行模型;运行时验收需要在目标 Linux 主机执行。

参考资料

全部公开文章由同一个站点构建和发布。