在 Docker 中部署应用最怕什么?不是容器跑不起来,而是跑起来之后,一个 docker rm -f 命令,就连着数据一起“误伤”了。
辛苦下载的几十GB的AI模型、积累的对话历史、配置好的环境……瞬间消失。这正是新手最易踩、代价最高的“坑”。
本篇文章将深入浅出地解释 Docker Volume 的三种存储方式,并结合我们之前部署 Ollama + Open WebUI 的实战场景,手把手教你如何用 Named Volume (命名卷) 安全、持久地管理你的数据。读完这篇,你将彻底告别“删容失数”的恐惧。
如果你还没完成部署,建议先阅读 Docker Ollama 部署指南 (Ubuntu24.04),然后再来阅读Docker的存储原理。
Docker Volume 的三种存储方式对比
1. 匿名卷 (Anonymous Volume)
docker run -v /container/path image
当你只指定容器内路径,不指定宿主机路径或卷名时,Docker 会创建匿名卷。Docker 自动生成随机名称(如 0a3e4f2b5c6d)
缺点:难以管理,容器清理后容易残留无用数据,不推荐在生产环境使用。
2. 命名卷 (Named Volume) – 我推荐的方式 ✅
docker run -v ollama-data:/root/.ollama image
# 或
docker run --mount source=ollama-data,target=/root/.ollama image
特点:
存储在
/var/lib/docker/volumes/卷名/_data独立于容器生命周期
可以备份、迁移、共享
删除容器后数据依然存在
适用场景:生产环境、需要持久化的数据
优点:数据独立于容器生命周期,可以方便地使用
docker volume命令族进行备份、恢复和迁移适用:这正是我们下面教程中用来存放
deepseek-r1:7b模型文件和 Open WebUI 对话记录的方式。
3. 绑定挂载 (Bind Mount)
docker run -v /host/path:/container/path image
特点:
直接挂载宿主机目录
可以用任何编辑器修改文件
可移植性差(依赖宿主机路径)
适用场景:开发环境、配置文件
优点:非常适合开发环境,因为你可以直接在宿主机上用代码编辑器修改文件,容器内会立即生效(例如热加载)。
缺点:可移植性差,依赖宿主机特定的目录结构。
应该选择哪种Docker存储方式?
✅ 命名卷 (Named Volume)在所有生产环境和需要数据持久化的场景中推荐的方式。
实战指南:通过我部署的 Ollama+OpenUI了解命名卷
# 启动Ollama容器(注意:\ 后面不能有任何字符)
docker run -d \
--gpus all \
--name ollama-server \
-p 11434:11434 \
-v ollama-data:/root/.ollama \
--restart unless-stopped \
ollama/ollama:latest
# 启动 Open WebUI 容器
docker run -d \
--name open-webui \
-p 3000:8080 \
-v open-webui-data:/app/backend/data \
--restart unless-stopped \
-e OLLAMA_BASE_URL=http://ollama-server:11434 \
--link ollama-server \
ghcr.io/open-webui/open-webui:main
root@Newt:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2561a6ada021 ollama/ollama:latest "/bin/ollama serve" 3 hours ago Up 3 hours 0.0.0.0:11434->11434/tcp, [::]:11434->11434/tcp ollama-server
8668e87cd282 ghcr.io/open-webui/open-webui:main "bash start.sh" 22 hours ago Up 22 hours (unhealthy) 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp open-webui
通过之前的部署,我已经成功创建了两个命名卷。现在,我们用几个命令来验证一下:
# 查看所有数据卷
root@Newt:~# docker volume ls
DRIVER VOLUME NAME
local ollama-data
local open-webui-data
# 查看 ollama-data 数据卷的详细信息
root@Newt:~# docker volume inspect ollama-data
[
{
"CreatedAt": "2026-05-03T10:38:40Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/ollama-data/_data",
"Name": "ollama-data",
"Options": null,
"Scope": "local"
}
]
# 查看数据卷占用的空间
root@Newt:~# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 2 17.23GB 340.9MB (1%)
Containers 2 2 105.8MB 0B (0%)
Local Volumes 2 2 5.805GB 0B (0%)
Build Cache 0 0 0B 0B
# 查看数据卷里实际存储了什么
root@Newt:~# sudo ls -lh /var/lib/docker/volumes/ollama-data/_data
total 20K
drwxr-xr-x 2 root root 4.0K May 4 06:26 cache
-rw------- 1 root root 50 May 4 06:27 history
-rw------- 1 root root 387 May 3 10:57 id_ed25519
-rw-r--r-- 1 root root 81 May 3 10:57 id_ed25519.pub
drwxr-xr-x 4 root root 4.0K May 3 11:02 models
1. 可以看到 ollama-data 和 open-webui-data 两个卷。
2. 从 docker volume inspect 输出可以看到:所有数据都存储在这个路径下:/var/lib/docker/volumes/ollama-data/_data
3. 从docker system df 输出可以看到:Volumes 大小: 5.805 GB,这正好当前下载的 deepseek-r1:7b 模型的大小。
4. 看到 models 等目录,里面就是模型文件。这意味着:就算你不小心执行了 docker rm -f ollama-server 删除了容器,只要你重新用 -v ollama-data:/root/.ollama 创建容器,你的模型会立刻回来,不需要重新下载!
当前存储布局详解
宿主机文件系统
│
├── /var/lib/docker/
│ ├── volumes/
│ │ ├── ollama-data/ # 模型数据卷
│ │ │ └── _data/
│ │ │ ├── models/ # DeepSeek-R1 模型文件 (~5.8GB)
│ │ │ ├── blobs/ # 模型二进制数据
│ │ │ └── manifests/ # 模型元数据
│ │ │
│ │ └── open-webui-data/ # WebUI 数据卷
│ │ └── _data/
│ │ ├── users/ # 用户账户信息
│ │ ├── conversations/ # 对话历史
│ │ └── config/ # 配置信息
│ │
│ ├── containers/ # 容器配置(临时)
│ └── image/ # 镜像层
│
容器 (ollama-server)
│
└── 容器内路径: /root/.ollama/
└── 映射到: /var/lib/docker/volumes/ollama-data/_data/
验证数据
# 2. 查看模型文件大小
root@Newt:~# sudo du -sh /var/lib/docker/volumes/ollama-data/_data
4.4G /var/lib/docker/volumes/ollama-data/_data
# 3. 查看 Open WebUI 的数据
root@Newt:~# sudo ls -la /var/lib/docker/volumes/open-webui-data/_data/
total 4704
drwxr-xr-x 5 root root 4096 May 3 11:32 .
drwx-----x 3 root root 4096 May 3 11:32 ..
drwxr-xr-x 7 root root 4096 May 3 11:32 cache
drwxr-xr-x 2 root root 4096 May 3 11:32 uploads
drwxr-xr-x 2 root root 4096 May 3 11:32 vector_db
-rw-r--r-- 1 root root 638976 May 4 08:32 webui.db
-rw-r--r-- 1 root root 32768 May 4 09:09 webui.db-shm
-rw-r--r-- 1 root root 4120032 May 4 09:09 webui.db-wal
清理无用数据
# 删除未使用的数据卷(危险!会丢失数据)
docker volume prune
# 查看数据卷使用情况
docker system df -v
# 删除特定数据卷(先确保容器已停止)
docker volume rm ollama-data
Docker存储高级操作:数据备份、恢复与迁移
数据是无价的,掌握备份和迁移方法至关重要。
1. 备份数据卷
使用一个临时容器来打包卷里的数据:
# 备份 ollama-data 卷到当前目录
docker run --rm -v ollama-data:/source -v $(pwd):/backup alpine tar czf /backup/ollama-data-backup.tar.gz -C /source .
2. 恢复数据卷
将备份文件的数据恢复到卷中:
# 从备份文件恢复
docker run --rm -v ollama-data:/target -v $(pwd):/backup alpine tar xzf /backup/ollama-data-backup.tar.gz -C /target
3. 迁移数据卷到新服务器
将整个卷的数据无缝迁移到另一台机器:
# 在旧服务器上导出
docker run --rm -v ollama-data:/source alpine tar czf - -C /source . > ollama-data.tar.gz
# 将 tar.gz 文件复制到新服务器,然后导入
docker run --rm -v ollama-data:/target alpine tar xzf - -C /target < ollama-data.tar.gz
4. 安全清理:删除不再需要的卷
# 清理所有未使用的卷(请务必确认卷已经不再需要!)
docker volume prune
# 删除指定的卷(需要先停止并删除使用该卷的容器)
docker stop ollama-server
docker rm ollama-server
docker volume rm ollama-data
结语:掌握 Volume,让数据更安全
通过本篇文章,你不仅理解了 Docker 的三种存储方式,更重要的是,你学会了如何用 命名卷 (Named Volume) 来管理像 Ollama 模型这样的重要数据。
现在你知道了:
✅ 数据在哪里:
/var/lib/docker/volumes/✅ 数据有多安全:独立于容器生命周期
✅ 怎么备份恢复:用几个 Docker 命令就能搞定
有了这些知识,你可以更放心地在 Docker 中运行各种有状态的应用了。如果在操作中遇到任何问题,欢迎在评论区交流讨论。