跳至正文
首页 » Docker Volume 详解:用 Named Volume 管理好 AI 模型数据

Docker Volume 详解:用 Named Volume 管理好 AI 模型数据

在 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 中运行各种有状态的应用了。如果在操作中遇到任何问题,欢迎在评论区交流讨论。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注