你有没有遇到过这种情况数据库跑在容器里存了一堆数据结果容器一删数据全没了。这是因为容器的文件系统是临时的。容器没了里面的数据也就没了。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 mysqlDocker会在/var/lib/docker/volumes/下自动生成一个随机哈希名的文件夹帮你完成挂载。方便但你也找不到这个文件夹在哪也不好重复使用。3. 命名卷Named Volumes你给卷起个名字Docker自动管理宿主机路径。docker run -v my-data:/var/lib/mysql/data mysqlDocker会在/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管路径生产环境选命名卷。