很多人第一次装 Ollama,看到官方文档里蹦出 docker run,就以为 Ollama 是跑在 Docker 里的;也有人反过来,想把 Ollama 塞进 Docker 顺手把模型文件一起打包,结果模型拉不下来、GPU 也不认。这篇不吹概念,只讲清两者各自负责哪一层、哪些场景该搭配、哪些场景硬凑会给自己找麻烦,最后给一份按顺序走的排查清单。
不少人第一次装 Ollama,翻官方文档看到一行 docker run,就默认 Ollama 是跑在 Docker 里的东西;也有人反过来,想把 Ollama 连同模型文件一起塞进镜像打包带走,结果容器起来了、模型拉不下来、显卡也不认。这两个误会根子上是同一个问题:没分清谁管哪一层。
这篇不铺概念,只讲清 Ollama 和 Docker 各自负责什么、什么场景值得叠着用、硬凑会踩哪些坑,最后给一份按顺序走的判断流程和报错对照。看完你应该能自己判断:这台机器上到底要不要上容器。
先分清:一个是模型运行器,一个是打包运行环境
把两者当成互相替代,是最常见的起点错误。Ollama 本身就是一个自带常驻服务的应用,负责把模型拉下来、加载进内存或显存、对外暴露一个本地接口;Docker 则是一个打包和隔离工具,它把进程、依赖、文件系统、网络封成一个可复制的盒子,但对盒子里面跑的是模型还是博客程序,它一点都不关心。
- Ollama
- 管模型这件事:拉取、加载、显存分配、暴露本地 API,自带常驻服务
- Docker
- 管环境这件事:把进程和依赖、文件系统、网络隔离成可复制的盒子,不懂模型
- 两者关系
- 不是替代也不是包含,是「装东西」和「装东西的盒子」
判断其实很简单,问自己一句:现在要解决的是模型跑不起来,还是换台机器就得从头装一遍。前者找 Ollama 解决,后者才轮到 Docker 出场。两个问题同时存在时,才需要考虑搭配,而不是一上来就上容器。
什么情况下值得把 Ollama 放进 Docker
| 场景 | 建议 | 原因 |
|---|---|---|
| 一台机器跑多个互不干扰的服务 | 用容器 | 避免端口、环境变量互相污染宿主机 |
| 多人共用的服务器,要求版本一致 | 用容器 | 镜像固定环境,省得每人装出不同版本 |
| 5 人以内小团队,机器独享,只跑这一个服务 | 直接宿主机安装 | 容器只多一层转发和排错成本 |
| 显存本来就紧张,指望容器省显存 | 不要用容器 | 容器不解决算力问题,该不够还是不够 |
| 想靠镜像把模型权重固化下来 | 不要这么做 | 权重放挂载目录,不该烧进镜像 |
真正适合容器的场景其实不多,核心就一条:你需要「可复制」和「互不干扰」。如果只是自己一台开发机、跑一个模型、也不打算搬到别处,宿主安装反而少一层故障点。容器带来的隔离好处,在这种场景里换不回排错时多花的时间。
搭配使用时最容易翻车的两处:显卡和模型文件
一旦决定用容器,显卡和模型文件就是两个高频坑。容器默认是看不到宿主显卡的,必须在启动时把设备透传给容器;同时宿主机驱动版本和容器内的运行库要对得上,对不上就会出现「容器里没显卡」的典型报错。这一步和模型本身无关,是环境问题。
模型文件则通常放在宿主机挂载出来的目录里,而不是烧进镜像。镜像里只该有程序,不该塞几十 GB 的权重。要确认挂载有没有生效,进容器里看一眼模型目录,和宿主机上的路径能不能对上即可,对不上就是没挂进去。
- 设备透传:启动时把显卡设备暴露给容器,否则容器内看不见卡
- 驱动对齐:宿主机驱动版本与容器内运行库要匹配,不匹配就报错
- 模型目录挂载:权重放宿主机持久化路径,容器只做读取,别打镜像
- 端口映射:容器内监听端口要映射到宿主机,否则外部连不上
- 验证方式:同一请求分别从宿主机和容器内打一次,响应一致才算配好
顺带说一句,如果是纯 CPU 跑小模型、根本不涉及显卡透传,上面第一条可以忽略。不用为了「看起来规范」把简单事搞复杂。具体机型、模型规模和显存是否匹配,可以到 /models/deploy 用测算页过一遍当时的数字。
按这个顺序做决定,少走弯路
- 先确认是否要复现只在你这台机器上用,还是要在别的机器、别人手上跑起来。只有后者才需要容器,前者宿主安装即可。
- 再算显存和模型规模容器不解决算力问题。卡和模型的对应关系,去 /models/deploy 用测算页核对当时的数字,别凭感觉。
- 决定用容器后一次配齐把驱动与设备透传、模型目录挂载、端口映射三件事一次性配好,再启动,别启动一次补一个参数。
- 双向验证用同一条请求分别从宿主机和容器内各打一次,响应一致才说明配好了,不一致就回到上一步查。
- 不适用的情况只是快速试一个模型效果,直接在本机拉起来就行,没必要先搭容器。
常见报错的一句话对照
| 现象 | 先查什么 | 别急着做什么 |
|---|---|---|
| 容器内连不上服务 | 端口有没有映射,服务监听地址是不是只绑了容器内部 | 别急着重装服务 |
| 容器里看不到显卡 | 设备透传和驱动版本是否对齐 | 别急着重装驱动 |
| 模型每次重启都重新下载 | 模型目录是否挂载到宿主机持久化路径 | 别急着换模型源 |
| 宿主机正常、容器里明显慢 | CPU 侧或网络转发,与模型本身无关 | 别急着换模型 |
这几条覆盖了九成以上的新手报错。排查顺序建议从上往下走:先看连通性,再看设备,最后看持久化和性能。顺序反了容易在无关的地方耗时间。如果还想横向对比不同部署方式下的响应速度,可以到 /tools/speed-test 用当时测出来的数字做参考。
下一步想看清不同部署方式下模型的实际表现和各家接口的当时数字,去站内模型资料库与部署测算页对照一遍,再决定自己的机器要不要上容器。→常见问题
Ollama 是不是必须用 Docker 才能跑?
不是。Ollama 本身就是一个可以直接装在宿主机上的服务,装完就能用。Docker 只是把它包装成一个可复制的环境,属于可选项。如果你的机器独享、只跑这一个服务,直接安装在宿主机上反而少一层排错,也更省一点转发开销。
把模型下载到 Docker 容器里,会不会以后换机器更方便?
恰恰相反。模型权重动辄几十 GB,烧进镜像会让镜像体积巨大、构建和分发都很难受。常见做法是镜像里只放程序,模型目录通过挂载指向宿主机,换机器时迁移的是模型目录而不是镜像。这样镜像轻、模型还能复用。
容器里跑 Ollama 用不了显卡,一般是什么原因?
最常见是启动时没做设备透传,容器默认看不到宿主机显卡;其次是宿主机驱动版本和容器内运行库版本对不上。排查顺序是先确认设备有没有透传进来,再看版本是否匹配,最后才怀疑模型侧的配置。具体卡型与模型规模是否匹配,可以到 /models/deploy 用测算页核对一遍。