大模型本地部署 · 收录于 2026-09-24 · 适用 2 工具 ✓ 实测验证

Open WebUI 用 Docker 起不来(镜像拉不动、端口被占、页面打不开、数据丢)

已验证 2026-09-24Docker 部署 Open WebUI 的四道坎实测——直连 ghcr.io 限时 25 秒没拉完,换 ghcr.nju.edu.cn 3 分 24 秒拉完 1.66GB;宿主端口被占报 address already in use;冷启动到首次 HTTP 200 用了 154 秒(容器内在下 embedding 模型);不挂 volume 删容器即丢 webui.db。

快速修复

docker rm -f open-webui 2>/dev/null
docker run -d --name open-webui --restart always \
  -p 3000:8080 \
  -v open-webui:/app/backend/data \
  ghcr.nju.edu.cn/open-webui/open-webui:main
# 首次启动约 2-3 分钟(容器内在准备 embedding 模型),期间页面打不开是正常的

端口 3000 被占就把左边的 3000 换成别的(如 3001)。删容器前数据都在 open-webui 卷里。

你会遇到什么

你照着教程在 Docker 里部署 Open WebUI:docker pull ghcr.io/open-webui/open-webui 拉到一半转圈直到超时;或者容器终于起来了,浏览器打开 localhost:3000 却连接被拒、一直转圈;或者报 port is already allocated 根本创建不了容器。

还有一个更隐蔽的:能用了几天,删掉容器重建,账号、历史会话、知识库全没了。

四类表现(镜像拉不动 / 端口冲突 / 页面打不开 / 数据丢)根因各不相同,下面逐条拆。

本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。

为什么会这样

先说结论:这四条路各自有一个固定断点——镜像走错源、宿主端口被占、启动需要等 2-3 分钟、数据没挂卷。

断点 1:镜像源。 Open WebUI 官方镜像在 ghcr.io,国内直连拉取不稳定。本机实测(2026-09-24,WSL2 Ubuntu + Docker 29.1.3):ghcr.io 直连在 25 秒限时内没拉完(只完成了部分层,进程超时退出);换南京大学镜像 ghcr.nju.edu.cn 后用 3 分 24 秒拉完,镜像 1.66GB。

断点 2:宿主端口。 -p 3000:8080 里的 3000 是宿主端口,全局唯一。被别的进程或容器占了,docker 直接拒绝启动:实测报 failed to bind host port 0.0.0.0:3000/tcp: address already in use。

断点 3:启动耗时。 容器状态 Up 不等于页面可用。Open WebUI 首次启动要在容器内准备 embedding 模型(日志里可见 all-MiniLM-L6-v2),本机实测从 docker run 到首次 HTTP 200 用了 154 秒——这期间浏览器就是连接被拒/转圈。很多人在这两分钟里以为装坏了,反复删容器重来,反而永远起不来。

断点 4:数据卷。 /app/backend/data 里放着 webui.db(账号、会话)、uploads/(上传文档)、vector_db/(RAG 向量库)。不挂 -v,这些都在容器的可写层,docker rm 即丢。实测 docker inspect:不挂卷的容器 Mounts 为空数组;挂了卷的容器重建后 webui.db 仍在(647168 → 684032 字节)。

确定性推论:拉不动先换源;端口报错先看谁占着;"起不来"先看日志是不是还在启动(没报 Traceback 就是等);删容器前先确认 docker inspect 能看到挂载。

一步步来

1. 镜像拉不动 → 换国内 ghcr 镜像前缀 — 必做(官方源直连慢是常态)

docker pull ghcr.nju.edu.cn/open-webui/open-webui:main

实测 3 分 24 秒完成(1.66GB)。拉不动时也可以先开代理拉一次缓存、之后用国内前缀启动。

2. 端口被占 → 先定位占用者,再换端口 — 必做(宿主端口全局唯一)

docker ps | grep 3000        # 是不是旧容器占着
ss -tlnp | grep 3000         # 是不是宿主进程占着

旧容器:docker rm -f <名字>;宿主进程:停掉或直接用别的宿主端口(-p 3001:8080)。

3. 容器 Up 但页面打不开 → 看日志区分"启动中"和"崩了" — 排查(90% 是还没启动完)

docker ps --filter name=open-webui
docker logs --tail 50 open-webui

日志在刷 Installing external dependencies / 模型加载 = 还在启动,等到首次出现 GET / HTTP/1.1" 200 再用浏览器;日志有 Traceback 才是真崩了。想确认进度,用命令轮询:

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3000/

4. 数据不能丢 → 必须挂 volume — 必做(删容器是常规操作)

docker inspect open-webui --format '{{json .Mounts}}'

输出里要有 "Destination":"/app/backend/data"。升级镜像的正确姿势:docker rm -f open-webui 后用同一条 docker run 重建——卷还在,数据还在。

5. 想连本机 ollama → 按场景指到宿主 — 按场景

容器里的 localhost 是容器自己;连宿主机 ollama 要指 host.docker.internal,见 Open WebUI 连不上 Ollama。

怎么确认修好了

  • docker ps 里状态是 Up;
  • curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:3000/ 返回 200(首次要等 2-3 分钟);
  • docker inspect open-webui --format '{{json .Mounts}}' 能看到挂到 /app/backend/data 的卷;
  • docker exec open-webui ls /app/backend/data 里有 webui.db。

其它环境的表现

  • Docker Desktop(Windows/macOS):端口映射后浏览器开 http://localhost:3000 即可;镜像源同理可用;本条目未在该形态下复现(本机是 WSL2 + 引擎直装)。
  • docker compose:把 ports、volumes、image 三段照上面写;端口冲突看 compose 内左侧值是否重复。

症状

# 形态 1:镜像拉取超时
Error response from daemon: ... context deadline exceeded (Client.Timeout exceeded while awaiting headers)

# 形态 2:宿主端口被占
docker: Error response from daemon: failed to set up container networking:
failed to bind host port 0.0.0.0:3000/tcp: address already in use

# 形态 3:容器 Up 但浏览器打不开(启动未完成,最常见)
(浏览器)This site can't be reached / 连接被拒绝

# 形态 4:删容器重建后账号、会话、知识库清空
(页面)回到首次注册引导

原因

镜像源慢(ghcr.io 直连)、宿主端口被占用、首次启动需 2-3 分钟准备 embedding 模型、数据目录 /app/backend/data 没有挂到 volume——四个断点分别对应上面四种形态。

解法

  1. 换国内镜像前缀:ghcr.nju.edu.cn/open-webui/open-webui:main(实测 3 分 24 秒拉完);
  2. 端口冲突先 docker ps / ss -tlnp 定位,旧容器删掉或换宿主端口;
  3. 页面打不开先 docker logs 看是不是还在启动,等首次 200(本机实测冷启动 154 秒);
  4. 一律加 -v open-webui:/app/backend/data,重建容器不丢数据;
  5. 连不上 ollama 另见 open-webui-ollama-connect。
验证证据
  • 本机实测(2026-09-24,WSL2 Ubuntu + Docker 29.1.3,独立容器/独立卷,未碰其它容器):
  • 直连 ghcr.io 限时 25 秒未完成(部分层 Download complete,超时退出码 124);ghcr.nju.edu.cn 实测 3 分 24.222 秒拉完,digest sha256:8b432fe0a65b91116afc7961365c6cca5379cc923171386a96691f3471f3cae9,大小 1656076851 字节;
  • python3 占住宿主 3000 端口后 docker run -p 3000:8080 → failed to bind host port 0.0.0.0:3000/tcp: address already in use(创建失败);换 -p 3300:8080 成功;
  • 冷启动到首次 HTTP 200 实测 154 秒;容器日志可见 embedding 模型加载(all-MiniLM-L6-v2)与 uvicorn 启动行;
  • -v 挂卷:docker inspect Mounts 显示卷挂到 /app/backend/data;docker rm -f 后同卷重建,webui.db 仍存在(647168 → 684032 字节);不挂卷容器 Mounts 为 [];
  • 证据:实测复现日志(2026-09-24)。
  • 工具侧实测素材(2026-09-01,实测复现日志(2026-09-01)):ghcr.nju.edu.cn 镜像全链路通过(连 ollama 真实推理)。
  • 未实测:Docker Desktop(Windows/macOS)形态、compose 形态(机制由官方文档与容器网络规则标注)。

相关 canonical

按「前置 → 同根 / 同域 / 相关」读:

适用工具 (2)

本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。

open-webuidocker · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 2 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

← 大模型本地部署 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡