通过镜像创建一个容器。容器一旦被销毁,则容器内的数据将一并被删除。但有些情况下,通过服务器上传的图片出会丢失。容器中的数据不是持久化状态的。这个时候可以通过数据卷来解决这个问题。
数据卷是一个可供一个或多个容器使用的特殊目录。数据卷的特点是:1、数据卷可以在容器之间共享和重用。2、对数据卷的修改会立马生效。3、对数据卷的更新不会影响镜像。4、数据卷默认会一直存在即使容器被删除。
通俗一点而言,数据卷相当于硬盘,可以保存服务器的数据,即是服务器关闭了,数据依然不会丢失。
这得从 docker 容器的文件系统说起。出于效率等一系列原因,docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:1、不能在宿主机上很方便地访问容器中的文件。2、无法在多个容器之间共享数据。3、当容器删除时,容器中产生的数据将丢失。
所以引入数据卷的目的就是为了解决上诉的问题,实现多个容器共享数据,保存数据、方便宿主机访问容器中的数据。数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件系统的形式存在于宿主机中。
数据卷的最大特定是:其生存周期独立于容器的生存周期。
1、在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载(引用/指向的意思)同一个数据卷,从而共享数据卷中的数据。
2、当宿主机不能保证一定存在某个目录或一些固定路径的文件时,使用数据卷可以规避这种限制带来的问题。
3、当你想把容器中的数据存储在宿主机之外的地方时,比如远程主机上或云存储上。
4、当你需要把容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。
创建数据卷命令如下:
# 创建数据卷之后,默认会存放到目录: /var/lib/docker/volume/数据卷名称/_data目录下
docker volume create 数据卷名称
查看数据卷命令如下:
# 查看数据卷
docker volume inspect 数据卷名称
# 查看全部数据卷信息
docker volume ls
删除数据卷命令如下:
# 删除数据卷
docker volume rm 数据卷名称
当你映射(意思就是这个容器的数据存储在这个数据卷里面)数据卷时,如果数据卷不存在,Docker 会帮你自动创建,即将容器内的某个文件夹挂载到宿主机的指定文件夹中。命令如下:
# 如果没有这个数据卷名称,docker会给你自动创建
docker run -v 数据卷名称:宿主机的路径 镜像ID
eg:docker run -v xhf:/var/lib/docker/volumes tomcat:8
# 这种 volume 是在创建容器时从宿主机中挂载的,无论对容器进行任何操作都不会导致其在宿主机中被删除,如果不需要这些文件,只能手动删除。
我们可以发现,我们上一节是将数据卷删除了的,执行完上面的方法之后,数据卷又被创建出来了,如下所示:
接下来我们执行 eg 里面的命令,然后使用 cp 命令,向被数据卷指定的容器文件夹中放置文件,文件也会同步到数据卷中去,如下所示:
# 直接指定一个路径作为数据卷的存储位置
docker run -v 路径:容器内部的路径 镜像ID
eg:docker run --rm -d --name tomcat-8081 -p 8081:8080 -v /usr/local/docker/xhf_home/:/usr/local/tomcat/webapps/xhf_home tomcat:8
# -v 数据卷参数
# 将宿主机 /usr/local/docker/xhf_home/ 文件内的内容信息 挂载在容器 /usr/local/tomcat/webapps/xhf_home 目录下