你有没有遇到过这种情况:数据库跑在容器里,存了一堆数据,结果容器一删,数据全没了。

这是因为容器的文件系统是临时的。容器没了,里面的数据也就没了。

Docker Volume(数据卷)就是来解决这个问题的。

一、Volume是什么?

简单说,Volume就是把宿主机上的一个文件夹,挂载到容器里面。

容器往指定路径写数据,实际是写在宿主机上。容器删了,宿主机上的文件还在。下次重新跑容器,再把同一个文件夹挂载进去,数据就回来了。

一句话:Volume让容器的数据“活”下来。

二、三种Volume类型

Docker提供了三种Volume,都通过docker run -v参数指定。

1. 宿主机卷(Host Volumes)

你自己指定宿主机上的哪个文件夹挂到容器里。

docker run -v /home/data:/var/lib/mysql/data mysql

宿主机路径和容器路径,都由你说了算。灵活性高,但你需要自己管理宿主机上的文件夹。

2. 匿名卷(Anonymous Volumes)

你只告诉Docker“容器里哪个路径要挂载”,不指定宿主机路径。

docker run -v /var/lib/mysql/data mysql

Docker会在/var/lib/docker/volumes/下自动生成一个随机哈希名的文件夹,帮你完成挂载。

方便,但你也找不到这个文件夹在哪,也不好重复使用。

3. 命名卷(Named Volumes)

你给卷起个名字,Docker自动管理宿主机路径。

docker run -v my-data:/var/lib/mysql/data mysql

Docker会在/var/lib/docker/volumes/my-data/下创建对应的存储目录。

这是生产环境最推荐的方式。你只需要记住卷的名字,不用关心它存在宿主机哪里。

三、Docker Compose中使用命名卷

在实际项目中,我们通常用Docker Compose管理多容器。命名卷的配置也很简单:

version: '3'

services:
  mongodb:
    image: mongo
    ports:
      - 27017:27017
    volumes:
      - db-data:/var/lib/mysql/data

volumes:
  db-data:

在服务下面用volumes声明要挂载的卷(卷名:容器内路径),然后在最下面统一声明所有用到的命名卷。

同一个命名卷可以挂载到多个容器,实现数据共享。比如两个服务都挂载同一个卷,一个写,一个读,非常方便。

四、三种Volume怎么选?

类型 适用场景 优缺点
宿主机卷 开发测试、需要明确知道数据存在哪 灵活,但需要手动管理路径
匿名卷 临时数据、一次性任务 方便,但无法重复引用
命名卷 生产环境、数据库等有状态应用 Docker自动管理,便于共享和复用

生产环境,优先用命名卷。

写在最后

Volume是Docker里非常基础但重要的概念。搞懂了它,你的数据库、配置文件、上传文件才能“活”下来。

记住三个关键词:

  • 宿主机卷:你指定路径

  • 匿名卷:Docker随机生成路径

  • 命名卷:你起名字,Docker管路径

生产环境,选命名卷。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐